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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・ハマっている「お菓子」を教えて!
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
構造体配列のvectorへの変換と...
-
C++のifstreamの使い方
-
STL string::findで見つからな...
-
C言語のポインターで詰まっている
-
リモートデスクトップの接続元I...
-
構文エラーが出ているのですが...
-
平均値を関数を用いて出力した...
-
JPEGやPNGが読めるLoadImage関数
-
string型のフォーマット書式指...
-
vc++の使い方について
-
2次元vectorのerase?
-
#define中の#のエスケープ
-
PICでダイナミック点灯 なぜか...
-
iostream インクルード時に発生...
-
VC++で文字列から任意の文字を...
-
snprintfが使用できない。
-
信頼区間の1.96や1.65ってどこ...
-
プログラミング初心者です。 Py...
-
2÷3などの余りについて
-
Enterキーを押されたら次の処理...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
switch文のエラーについて
-
構文エラーが出ているのですが...
-
VC++で文字列から任意の文字を...
-
#defineの使い方について
-
空ENTERの判別
-
C++でShowCursorを使いたい。
-
enumの値から定義名を文字列化...
-
C++での <iostream.h>と<iostre...
-
VS2019でofstreamが未定義になる
-
std::wstringのメモリリークに...
-
wstringの主力
-
JPEGやPNGが読めるLoadImage関数
-
なぜ、C++の標準ヘッダをインク...
-
#include "fstream.h"
-
C言語のエラーを修正したい
-
#define中の#のエスケープ
-
C言語のポインターで詰まっている
-
リモートデスクトップの接続元I...
-
VHDLのsignedとunsignedの違いは?
-
c++のvirtual関数および継承に...
おすすめ情報