プロが教えるわが家の防犯対策術!

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 で数値を読み込む,もっとシンプルな方法があればご教授いただけると幸いです。

A 回答 (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::ifstreamfile("suuji.dat", std::ios::in);
if( ! file || !file.is_open())return -1;

std::vector<int>data;
intnum;
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::ifstreamfile("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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/11/12 15:36

> 普通、double型の数値を自分でファイルにI/Oするならテキストじゃなくてバイナリ形式で保存しませんか?


> バイナリ形式なら、atofの変換作業は発生しませんよ。

マルチプラットフォームだと、doubleのバイナリは内部形式が保証できないので、
あえて文字にシリアライズということはあるかと思います。
    • good
    • 0
この回答へのお礼

> マルチプラットフォームだと、doubleのバイナリは内部形式が保証できないので

今後バイナリ形式でトライするために,頭の片隅に保存しておきます。

アドバイスありがとうございました。

お礼日時:2006/11/12 15:37

>という方法を使っていますが,すごく遠回りなことをしている気分になります。



んー。元データがテキスト形式なら仕方無いですね。
普通、double型の数値を自分でファイルにI/Oするならテキストじゃなくてバイナリ形式で保存しませんか?
バイナリ形式なら、atofの変換作業は発生しませんよ。
    • good
    • 0
この回答へのお礼

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

バイナリで保存するというアイデアは,ちょっと浮かびませんでした。
バイナリ形式というものは知っていたのですが…

確かに数値データをバイナリで保存するという手段もありましたね。
ごく自然なことながら,指摘いただいて大変驚きました。

今の自分にはハードルがやや高いので,今後の挑戦課題としてキープしておきます。

ありがとうございました。

お礼日時:2006/11/12 15:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!