ファイルにデータを書き込むには?

解決


たわし頭  2008-09-18 01:07:14  No: 69010

VC++で,ファイルを作成し,float型のデータを書き込むプログラムを作っています.ファイルはCSVにして,エクセルの行に次々データを書き込みたいとおもっています.以下に問題のソースを示します.

HANDLE hFile;    //ファイルを作成

hFile = CreateFile("C:\\Data.CSV", GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
CREATE_NEW,
FILE_ATTRIBUTE_NORMAL,
NULL);

if(hFile == INVALID_HANDLE_VALUE)AfxMessageBox("CreateFile失敗");

//ハンドルを閉じる
CloseHandle(hFile);

CString FName;
    CFile fobj;
    CFileException err;

FName="C:\\Data.CSV";

CString ss;
//書き込みモードでファイルを開く
CStdioFile fout(FName,CFile::modeWrite );

sprintf(ss,"%s",Data[i]);
fout.WriteString(ss);          //ファイルの一行書き込み

fobj.Close();  //ファイルを閉じる

これをデバッグすると,エラーが出てきてしまいます.
error C2664: 'sprintf' : cannot convert parameter 1 from 'class CString' to 'char *'

実際には,for文でfout.WriteString(ss);を繰り返して,Data[i]をCSVファイルの行に次々書き込むつもりです.

どのようにしたら,上記のエラーを解決できますか?
宜しくお願いします.


Blue  2008-09-18 01:17:43  No: 69011

CStringのFormatメソッドを使えばいいのでは?


どら  2008-09-18 02:49:33  No: 69012

CreateFileを使っているのであれば、その後にWriteFile→CloseHandleすれば
よいのでは?

MFC、APIどちらで開発するかによりますが・・・

それから、余計なおせっかいかもしれませんが、

    CSVファイル=「,」で区切ればいい

と言うわけではないので注意してくださいね(それで問題ない場合もあります
が)。

対象がfloatなので、本当におせっかいかもしれませんが、保存したい文字列
の中に「,」「"」があるときなどは、そのまま「,」区切るだけではExcelで
開いたときに思ったとおりの表示にはならないと思います。

私は文字列をCSVに保存するときは、これらをチェック→必要に応じて変換す
る関数を作ったりしています。

おせっかいですみません。


どら  2008-09-18 02:54:50  No: 69013

あ、良くみたらただのsprintfの使い方でしたね^^;
sprintf の第一引数はCSrtingではなく、char *です。
なので、この関数を使うのであれば・・・

char ss
sprintf(ss,"%s",Data[i]);

と言う形にしてから、CStringに変換しないとダメじゃないですかね?
CStringを使ったことがないので、ここから先はごめんなさいw

で、「float型のデータを書き込むプログラム」と書いてありますが・・・
> sprintf(ss,"%s",Data[i]);

floatの場合、%sではないですよね?


ouh  2008-09-18 05:08:19  No: 69014

>char ss
これはまずいんじゃないでしょうか?


たわし頭  2008-09-18 05:44:08  No: 69015

Blueさん,どらさん,ouhさん,お答え頂きありがとうございます.

ss.Format("%f\n",Data[i]);
fout.WriteString(ss);

をfor文で回して,目的のプログラムを作れました!

sprintfは私の勉強不足で,なかなか使い切れませんでしたが...
今回は解決とさせていただきます.

大変助かりました,ありがとうございました.


どら  2008-09-18 19:17:50  No: 69016

ouhさん

>>char ss
>これはまずいんじゃないでしょうか?

その通りですねw

char ss[128];   

みたいにしないとですね〜>_<
想定する最大文字列長にもよりますが☆
抜けちゃってました、失礼しました〜^^;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加