2

このコードは、常にファイルの最後の行を出力します。ファイルからすべてのテキストを一度に 1 行ずつ出力することを期待していました。なぜそれが機能しないのですか?

string filename;
cout << "File to read: ";
cin >> filename;

ifstream afile;
afile.open(filename.c_str());

string line;
while(!afile.eof()) {
    getline(afile, line);
    cout << line;
}

afile.close();

この方法で試してみると、同じことが起こります。

for (string line; getline(afile, line);) {
    cout << line;
}

多分これは私の端末の問題ですか?これは機能します...

for (string line; getline(afile, line);) {
    cout << line << endl;
}
4

2 に答える 2

1

cplusplus.comから:

区切り文字が見つかった場合、それは抽出されて破棄されます。つまり、格納されず、次の入力操作がその後に開始されます。

元のコード スニペット自体は余分な改行を挿入しないため、ターミナルへの出力を次の行に移動させるものは何もありません。出力が水平スペースを使い果たした場合、次に何が起こるかは端末次第です。使用している端末はわかりませんが、あなたの場合、カーソルを改行なしでその行の最初の文字に戻すだけです。Windows コマンド シェルでは、次の行に折り返されます。

また、次の点にも注意してください。

while(!afile.eof()) {
    getline(afile, line);
    cout << line;
}

は一般的なアンチパターンです。すでに指摘したように、より適切なのは次のとおりです。

while(getline(afile, line)) {
    cout << line << '\n';
}

ファイル ストリームは、eof に達してから読み取ろうとした後にのみ false になります。

于 2013-05-21T03:43:26.430 に答える
1

問題は、最後の行だけが印刷されることです。正しい?

  1. std::endlwhile ループを追加することをお勧めします。問題をより明確にすることができます。出力が混乱する場合があります。
  2. 入力ファイルの行区切り文字を確認することもできます。'\n'のデフォルトの区切り文字ですgetlinegetline別の文字を使用する場合は、の第 3 パラメーターとして指定します。
于 2013-05-21T01:56:05.213 に答える