• ベストアンサー

CFileの使い方を教えてください

環境はWIN98 VC++6.0 MFCです。 見よう見真似で以下のようにしたら、配列のデータがXXX.txtファイルに保存されました。 それじゃってことで、XXX.txtファイルからデータを取り出し、元通りに配列aa[n]に格納するにはどうすれば良いのですか? そう言うことはやれるのですか? void CAbcDlg::OnButton4() {  // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください  CString str;  LPTSTR pszBuf;  long size;   CFile fpw( "XXX.txt", CFile::modeCreate | CFile::modeWrite | CFile::shareExclusive );   for(n=0;n<10;n++){    str=aa[n];    size = str.GetLength();    fpw.Write( &size, sizeof( long ) );    //バッファの確保    pszBuf = str.GetBuffer( size );   //書き込み    fpw.Write( pszBuf, size );   //バッファの開放   str.ReleaseBuffer();  } }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

Write を Read に変えればOK modeCreate | modeWrite → modeRead fpw.Read( &size, sizeof(long) ); pszBuf = str.GetBuffer( size ); fpw.Read( pszBuf, size ); てな感じで。

mk1234
質問者

お礼

回答ありがとうございます。 うまくいきました。 <補足> 参考に別途分かったことを書いておきます。 void save() { CFile file(ファイル名, CFile::modeWrite|CFile::modeCreate); CArchive ar(&file, CArchive ::store); for (int i = 0; i < 10; i++) { ar << aaa[i]; } } void load() { CFile file(ファイル名, CFile::modeRead); CArchive ar(&file, CArchive ::load); for (int i = 0; i < 10; i++) { ar >> aaa[i]; } }

その他の回答 (2)

回答No.3

#2です。 ↓忘れると'\0'つかねぇや(^^; str.ReleaseBuffer( size );

noname#5537
noname#5537
回答No.1

文字列長と文字列を書き込んでいるわけですから, 読み込むときは,まず文字列の長さを読み込み,続いてその長さの分だけ文字列を読み込むことになります。 これをファイルの終端まで繰り返せばいいです。 読み込みには CFile::Read を使ってください。 ただ,拡張子 txt のファイルに文字列長をバイナリで書き込むのはあまりよろしくないと思います。 配列の各要素を1行に書き出していくほうがいいのではないかと。 この場合読み込むときは1行ずつ読み込んで配列に入れていくことになります。 この方法にするなら,MFC の CStdioFile や C++ 標準ライブラリの fstream などを使ってください。

mk1234
質問者

お礼

回答ありがとうございます。 アドバイスを参考に色々調べてみます。

関連するQ&A