プロが教える店舗&オフィスのセキュリティ対策術

C++でファイル操作をプログラミングしています。
入力として使いたいファイルは以下のように記述されています。

1 2 3
2 2 2
54 57 65

のように数字の間にはスペースが入ってます。また3つ目の数字の後には
改行が入っています。

このようなデータを取り込むときはどのように記述すればいいのでしょうか?
今作ってみたコードは以下のようなんですけど、うまく格納されていません。
よろしくお願いします。

ifstream fin("ファイル名");
vector<int> x,y,z;
while (!fin.eof()){
if (!(fin >> i)) break;
x.push_back(i);
if (!(fin >> i)) break;
y.push_back(i);
if (!(fin >> i)) break;
z.push_back(i);
}

A 回答 (3件)

No.2 ですが……



この場合、「うまく格納されていません」という表現は非常に困るわけです。

> 確認方法はファイルの数=aとして
 このとき、a の値を確認しましたか?
 また、a が「0」だったとしたら、強制的に a = 1 等としてみるのも良いかもしれません。「格納されていない」のか、「ファイルの数の設定が間違い」なのか、原因の切り分けをします。

また、

> cout<<x[i]<<" "<<y[i]<<" "<<z[i]<<endl;

ここで、「うまく格納されていない」と判断したのは、
・何も表示されなかったから
・表示はされたがゴミばかりだったから
・それらしい数字は表示されたが前後にゴミがあったから
・期待した数より多い/少ない個数しか表示されないから
・例外が発生して落ちたから
のどのような現象かで、原因も対処も異なってきます。
    • good
    • 0

やはり、うまく動いているように思えますが?



ひとつだけ、勘違いしそうな場面としては、fin.eof() が真になるのは、(データを全部読み込んだときではなくて)最後のデータを超えてデータを読もうとして失敗したとき、です。

ですので、この場合の while((!fin.eof()) は、実質的には意味を成していません。
実際には、65 を読み込んだ後、もう一度ループを回ろうとして、最初の ifn >> i で、失敗します(このとき、eof() は真になります)
ここで、if(!(fin >> i)) break; に引っかかって、ループを抜けるという動作になります。

こう言うところで何かあるかも知れませんね。
    • good
    • 0

自分の環境で記載されているコードを試しましたが、きちんと動いていますよ?コードには値格納の確認部分がありませんが、どう言った方法を

取られたのでしょう?また実際使われているデータファイル名はパスを含め正しいものですか?

この回答への補足

確認方法はファイルの数=aとして

for(i=0;i<a;++i){
cout<<x[i]<<" "<<y[i]<<" "<<z[i]<<endl;
}
という形で確認しました。
パスは合ってました。

補足日時:2005/10/03 11:55
    • good
    • 0

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