1

このコードが完了すると、余分な反復 (余分な行が出力される) が発生するのはなぜですか? EOF に余分な改行が必要ですか? EOF をマークするために余分な文字や特殊文字を追加する必要はありません。

#include <iostream>  
#include <fstream>  
#include <string>  
using namespace std;  

int main(){  
    ifstream infile("dictionary.txt"); // one word per line  
    string text;  
    while(infile){  
        infile >> text;  
        cout << text << endl;  
    }  
    infile.close();  
    return 0;  
}  
4

5 に答える 5

6

試す

while(infile>>text) cout << text << endl;

代わりは。

于 2009-10-06T20:38:23.593 に答える
6

入力ストリームは、それを超えて読み取ろうとするまでファイルの終わりを検出しません。ファイルの最後の単語を読み取っても、入力ストリームは引き続き有効です。次のループで、infile >> textはEOFを超えて読み取ろうとして失敗しますが、それでも次の行は実行されます。

ループは次のようになります。

while (infile >> text)
    cout << text << endl;

このようにして、EOFは出力に書き込もうとする前に検出されます。

于 2009-10-06T20:42:28.203 に答える
3

while-conditionを使用して、ストリームが良好な状態にあるかどうかを確認します。次に、ストリームから読み取ります。これは成功する場合と失敗する場合があります。次に、テキストの値を出力します。あなたがすべきことは:

while(infile >> text){
    cout << text << endl;
}
于 2009-10-06T20:40:53.557 に答える
3

ファイルの終わりで、infileはまだ評価される可能性がありますtrueが、次の単語の抽出はinfile >> text失敗します。失敗しても、1行を印刷します。これを行うためのより良い方法は、whileループで抽出が成功したかどうかをチェックすることです。

string text;
ifstream infile("dictionary.txt"); // one word per line  
while (infile >> text) {
    cout << text << endl;  
}
infile.close();
于 2009-10-06T20:41:19.313 に答える
1

すでに多くの修正を行っていますが、おそらく少し異なるものを検討する価値があります。

#include <iterator>
#include <iostream>
#include <string>
#include <fstream>

using namespace std; // not really a good idea, but harmless enough for now.

int main() { 
    ifstream infile("dictionary.txt");
    copy(istream_iterator<string>(infile), istream_iterator<string>(), 
        ostream_iterator<string>(cout, "\n"));
    return 0;
}
于 2009-10-06T21:23:43.563 に答える