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ファイルの行に次々書き込むつもりです.
どのようにしたら,上記のエラーを解決できますか?
宜しくお願いします.
CStringのFormatメソッドを使えばいいのでは?
CreateFileを使っているのであれば、その後にWriteFile→CloseHandleすれば
よいのでは?
MFC、APIどちらで開発するかによりますが・・・
それから、余計なおせっかいかもしれませんが、
CSVファイル=「,」で区切ればいい
と言うわけではないので注意してくださいね(それで問題ない場合もあります
が)。
対象がfloatなので、本当におせっかいかもしれませんが、保存したい文字列
の中に「,」「"」があるときなどは、そのまま「,」区切るだけではExcelで
開いたときに思ったとおりの表示にはならないと思います。
私は文字列をCSVに保存するときは、これらをチェック→必要に応じて変換す
る関数を作ったりしています。
おせっかいですみません。
あ、良くみたらただのsprintfの使い方でしたね^^;
sprintf の第一引数はCSrtingではなく、char *です。
なので、この関数を使うのであれば・・・
char ss
sprintf(ss,"%s",Data[i]);
と言う形にしてから、CStringに変換しないとダメじゃないですかね?
CStringを使ったことがないので、ここから先はごめんなさいw
で、「float型のデータを書き込むプログラム」と書いてありますが・・・
> sprintf(ss,"%s",Data[i]);
floatの場合、%sではないですよね?
>char ss
これはまずいんじゃないでしょうか?
Blueさん,どらさん,ouhさん,お答え頂きありがとうございます.
ss.Format("%f\n",Data[i]);
fout.WriteString(ss);
をfor文で回して,目的のプログラムを作れました!
sprintfは私の勉強不足で,なかなか使い切れませんでしたが...
今回は解決とさせていただきます.
大変助かりました,ありがとうございました.
ouhさん
>>char ss
>これはまずいんじゃないでしょうか?
その通りですねw
char ss[128];
みたいにしないとですね〜>_<
想定する最大文字列長にもよりますが☆
抜けちゃってました、失礼しました〜^^;
ツイート | ![]() |