• ベストアンサー

CStdioFile での数値データの読みこみ

VC++ で MFC アプリケーションを作っています。 数字の入ったファイル,たとえば以下のような suuji.dat です。 int 型の数字が 5 つ入っています (実際のプログラムで私が使っているのは double 型ですが…) 。 /**  * suuji.dat の始まり  */ 1 2 3 4 5 /**  * suuji.dat の終わり  */ これを CStdioFile で読み込むとき,以下のような方法をとっています。   int num;   CString temp;   CStdioFile file;   while ( file.ReadString(temp) ) {     num = atof(temp);     ここで num を vector<int> に収納する   }   file.Close(); 上の方法は,流れとして, ○とりあえず CString 型として読みこみ   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ○ atof() 関数によって数値データとして使う   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ という方法を使っていますが,すごく遠回りなことをしている気分になります。 まだ “Hello, world!” を動かして 4 ヶ月たらずのビギナーです。 プログラミングの作法とかは,ぜんぜん分かっていません。 もし CStrioFile で数値を読み込む,もっとシンプルな方法があればご教授いただけると幸いです。

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

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.2

CStdioFileに固執しないなら、std::ifstreamから >> という手もあると思います。 更にSTL側に一歩進むと、例えばファイルに /* */等のコメントが無くて数字だけなら、一行で書けます。 #include <fstream> #include <vector> #include <algorithm> #include <iostream> int main(int argc, char* argv[]) { std::cout << "いずれも、ファイルフォーマットが保証できる前提。" << std::endl << "コメントは考慮してない(数値のみに対応)" << std::endl << "エラー処理もやっつけ" << std::endl << std::endl; { std::cout << "std::ifstreamを使うとatoiは不要。" << std::endl; std::ifstream file("suuji.dat", std::ios::in); if( ! file || !file.is_open()) return -1; std::vector<int> data; int num; while(file >> num) { data.push_back(num); } std::cout << "結果" << std::endl; for(std::vector<int>::iterator itr=data.begin(); itr != data.end(); ++itr) { std::cout << *itr; } std::cout << std::endl; } { std::cout << "STLを使うと更に短縮、numも不要" << std::endl; std::ifstream file("suuji.dat", std::ios::in); if( ! file || !file.is_open()) return -1; std::vector<int> data; std::copy(std::istream_iterator<char>(file), std::istream_iterator<char>(), std::back_inserter(data)); std::cout << "結果" << std::endl; std::copy(data.begin(), data.end(), std::ostream_iterator<char>(std::cout)); } return 0; }

k1220011_2005
質問者

お礼

ご回答くださり,ありがとうございます。

その他の回答 (2)

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.3

> 普通、double型の数値を自分でファイルにI/Oするならテキストじゃなくてバイナリ形式で保存しませんか? > バイナリ形式なら、atofの変換作業は発生しませんよ。 マルチプラットフォームだと、doubleのバイナリは内部形式が保証できないので、 あえて文字にシリアライズということはあるかと思います。

k1220011_2005
質問者

お礼

> マルチプラットフォームだと、doubleのバイナリは内部形式が保証できないので 今後バイナリ形式でトライするために,頭の片隅に保存しておきます。 アドバイスありがとうございました。

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.1

>という方法を使っていますが,すごく遠回りなことをしている気分になります。 んー。元データがテキスト形式なら仕方無いですね。 普通、double型の数値を自分でファイルにI/Oするならテキストじゃなくてバイナリ形式で保存しませんか? バイナリ形式なら、atofの変換作業は発生しませんよ。

k1220011_2005
質問者

お礼

ご回答くださり,ありがとうございます。 バイナリで保存するというアイデアは,ちょっと浮かびませんでした。 バイナリ形式というものは知っていたのですが… 確かに数値データをバイナリで保存するという手段もありましたね。 ごく自然なことながら,指摘いただいて大変驚きました。 今の自分にはハードルがやや高いので,今後の挑戦課題としてキープしておきます。 ありがとうございました。

関連するQ&A