- ベストアンサー
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 で数値を読み込む,もっとシンプルな方法があればご教授いただけると幸いです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
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; }
その他の回答 (2)
- MrBan
- ベストアンサー率53% (331/615)
> 普通、double型の数値を自分でファイルにI/Oするならテキストじゃなくてバイナリ形式で保存しませんか? > バイナリ形式なら、atofの変換作業は発生しませんよ。 マルチプラットフォームだと、doubleのバイナリは内部形式が保証できないので、 あえて文字にシリアライズということはあるかと思います。
お礼
> マルチプラットフォームだと、doubleのバイナリは内部形式が保証できないので 今後バイナリ形式でトライするために,頭の片隅に保存しておきます。 アドバイスありがとうございました。
- t_nojiri
- ベストアンサー率28% (595/2071)
>という方法を使っていますが,すごく遠回りなことをしている気分になります。 んー。元データがテキスト形式なら仕方無いですね。 普通、double型の数値を自分でファイルにI/Oするならテキストじゃなくてバイナリ形式で保存しませんか? バイナリ形式なら、atofの変換作業は発生しませんよ。
お礼
ご回答くださり,ありがとうございます。 バイナリで保存するというアイデアは,ちょっと浮かびませんでした。 バイナリ形式というものは知っていたのですが… 確かに数値データをバイナリで保存するという手段もありましたね。 ごく自然なことながら,指摘いただいて大変驚きました。 今の自分にはハードルがやや高いので,今後の挑戦課題としてキープしておきます。 ありがとうございました。
お礼
ご回答くださり,ありがとうございます。