[解決済み] テキストファイルからEOFまで読み込むと最終行が繰り返される【重複
2022-02-16 12:50:40
質問
以下は C++ のコードでは ifstream オブジェクトを使用して、テキストファイル(1行に1つの数値)から整数を読み込みます。 EOF . なぜ最終行の整数を2回読んでしまうのでしょうか?これを修正する方法は?
コード
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream iFile("input.txt"); // input.txt has integers, one per line
while (!iFile.eof())
{
int x;
iFile >> x;
cerr << x << endl;
}
return 0;
}
input.txt :
10
20
30
出力 :
10
20
30
30
備考 : コードスニペットを小さくするために、エラーチェックのコードをすべてスキップしています。上記の動作は、Windows (Visual C++)、cygwin (gcc)、Linux (gcc)で確認されています。
解決するには?
イベントの連鎖をよく見てください。
- 10をつかむ
- グラブ20
- グラブ30
- グラブEOF
最後から2番目の繰り返しに注目してください。 30を掴んでからEOFのチェックに移行していますね。 EOFマークがまだ読み込まれていないので、EOFに到達していません("binarically"で言えば、概念的には30行目のすぐ後です)。 したがって、次の反復処理に進みます。x は前の反復処理の 30 のままです。 xは30行目のままであり、ios::eofbitが発生する。 x は 30 のままで、ios::eofbit が発生します。x を標準エラー出力します(前の反復と同じように 30 です)。 次にループの条件でEOFをチェックすると、今度はループから抜け出します。
これを試してみてください。
while (true) {
int x;
iFile >> x;
if( iFile.eof() ) break;
cerr << x << endl;
}
ところで、あなたのコードにはもう一つバグがあります。 空のファイルに対して実行したことはありますか? あなたが得た動作は、まったく同じ理由によるものです。
関連
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] C++でifstreamを使用してファイルを一行ずつ読み込む
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み] iostream::eof がループ条件の中 (つまり `while (!stream.eof())`) にあるのはなぜいけないとされているのでしょうか?