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 で数値を読み込む,もっとシンプルな方法があればご教授いただけると幸いです。
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::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;
}
No.3
- 回答日時:
> 普通、double型の数値を自分でファイルにI/Oするならテキストじゃなくてバイナリ形式で保存しませんか?
> バイナリ形式なら、atofの変換作業は発生しませんよ。
マルチプラットフォームだと、doubleのバイナリは内部形式が保証できないので、
あえて文字にシリアライズということはあるかと思います。
> マルチプラットフォームだと、doubleのバイナリは内部形式が保証できないので
今後バイナリ形式でトライするために,頭の片隅に保存しておきます。
アドバイスありがとうございました。
No.1
- 回答日時:
>という方法を使っていますが,すごく遠回りなことをしている気分になります。
んー。元データがテキスト形式なら仕方無いですね。
普通、double型の数値を自分でファイルにI/Oするならテキストじゃなくてバイナリ形式で保存しませんか?
バイナリ形式なら、atofの変換作業は発生しませんよ。
ご回答くださり,ありがとうございます。
バイナリで保存するというアイデアは,ちょっと浮かびませんでした。
バイナリ形式というものは知っていたのですが…
確かに数値データをバイナリで保存するという手段もありましたね。
ごく自然なことながら,指摘いただいて大変驚きました。
今の自分にはハードルがやや高いので,今後の挑戦課題としてキープしておきます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- 工学 【数字、数値の読み方のルールを教えてください】0(ゼロ)のことを「ころ」と言ったり、「ま 6 2022/12/21 18:21
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# このプログラミング誰か教えてくれませんか 2 2022/05/14 09:45
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- Java Java 配列<選挙> 4 2023/07/31 15:07
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
構文エラーが出ているのですが...
-
C言語
-
switch文のエラーについて
-
VC++で文字列から任意の文字を...
-
#include "fstream.h"
-
Cの関数からC++の関数(DLL)を...
-
isdigitの挙動について
-
gccでコンパイル時のエラー
-
コマンドライン引数
-
_tcscat がうまくいきません(V...
-
using namespace std;//?
-
C++ String クラスについて
-
std::mapのメモリアロケータに...
-
なぜ、C++の標準ヘッダをインク...
-
listをvectorにコピーするときに
-
C++でSTLを使ったときのデバッ...
-
数値を std::string に変換
-
C++で、テキストファイルを一行...
-
openCVで動画が読み込めないエ...
-
DirectXとカメラ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラーが出ているのですが...
-
switch文のエラーについて
-
enumの値から定義名を文字列化...
-
VC++で文字列から任意の文字を...
-
なぜ、C++の標準ヘッダをインク...
-
空ENTERの判別
-
std::wstringのメモリリークに...
-
C言語からgnuplot呼び出し
-
リモートデスクトップの接続元I...
-
JPEGやPNGが読めるLoadImage関数
-
このプログラミング誰か教えて...
-
プログラミング
-
#include "fstream.h"
-
std::map の const 修飾について
-
C++での <iostream.h>と<iostre...
-
構造体配列のvectorへの変換と...
-
VS2019でofstreamが未定義になる
-
#defineの使い方について
-
string型のフォーマット書式指...
-
指定した文字を削除したい
おすすめ情報