質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

8371閲覧

fstreamクラスでデータを読み込みたい

wanwanwan

総合スコア21

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/12/09 08:42

編集2016/12/09 09:11
#include <iostream> #include <fstream> #include <vector> using namespace std; int main(){ int num; vector <int> array; ifstream fin( "nums10.txt" ); // 皆様のご指摘で気づいて修正しました。 if( !fin ){ cout << "Error." << endl; return -1; } while( !fin.eof() ){ // ファイルの整数データを全て読み込むにはどうすれば? fin >> num; array.push_back( num ); } for( int i = 0; i < array.size(); i++ ) cout << array[ i ] << endl; return 0; } コード

-nums10.txt-
39 770 711 662 143 574 528 370 355 227

-出力結果-
39
770
711
662
143
574
528
370
355
227
227 // 重複して読み込んでしまう.

"nums10.txt" にある10個の整数値を読み込みたいのですが、最後のデータを重複して読み込んでしまいます。

どうすればピッタリ読み込むように実装出きるでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

ofstream -> ifstreamや、重複して読み込む理由はChironianさんがおっしゃっている通りです。
私なりに書いてみました。

#include <iostream> #include <fstream> #include <vector> using namespace std; int main() { ifstream fin("nums10.txt"); if (!fin) { cout << "Error." << endl; return -1; } vector<int> nums; int num; while (fin >> num) { nums.push_back(num); } for (int& n : nums) { cout << n << endl; } return 0; }

投稿2016/12/09 09:05

編集2016/12/09 09:10
carimatics

総合スコア740

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chironian

2016/12/09 09:11

おお、これはスマートですね。
carimatics

2016/12/09 09:17

競技プログラミング以外でC++を書かないので、一般的にif文の条件式内での読み込み処理がお行儀の良い作法かどうかは分かりませんが…。
guest

0

こんにちは。

まず、ofstream fin( "nums10.txt" );ifstream fin( "nums10.txt" );の間違いですね?
次に、間違い易いのですが、データを読み取った直後はまだfin.eof()が成立しません。その次にデータを読み取ろうとして読めなかった時に成立します。
なので、下記のようなループにすれば良い筈です。

C++

1while(fin.good()) 2{ 3 fin >> num; 4 if (fin.eof()) 5break; 6 array.push_back( num ); 7}

投稿2016/12/09 08:58

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

入力ファイルの末尾に改行または空白文字が入っていると、そのような結果になります。
最終データが入力できなかったにもかかわらず配列に追加してしまいます。

以下のように判定を加えるとよいでしょう。
C++でストリームほとんど使ったことないので、これで正しいか確信は持てないですが。

C++

1while( !fin.eof() ){ // ファイルの整数データを全て読み込むにはどうすれば? 2 if( fin >> num){ // 「入力できた」ら追加 3 array.push_back( num ); 4 } 5}

投稿2016/12/09 09:12

can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

出遅れたー

C++

1#include <iostream> 2#include <fstream> 3#include <iterator> 4#include <vector> 5using namespace std; 6 7int main(){ 8 vector<int> array(istream_iterator<int>(ifstream("nums10.txt")), istream_iterator<int>()); 9 for ( auto item : array ) { cout << item << ' '; } // 読めたかな? 10}

投稿2016/12/12 12:15

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問