带有额外最终迭代的文件echo循环

时间:2009-10-06 20:35:11

标签: c++ file-io while-loop

为什么在此代码完成时会获得额外的迭代(额外的行打印)? 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;  
}  

5 个答案:

答案 0 :(得分:6)

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

代替。

答案 1 :(得分:6)

输入流不会检测到文件结尾,直到 之后您尝试读取它。当您读取文件中的最后一个单词时,输入流仍然有效;在下一个循环中, infile&gt;&gt; 试图读取过去的EOF并失败,但无论如何仍然会执行下一行。

循环应如下所示:

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

这样EOF将在尝试写入输出之前被检测到。

答案 2 :(得分:3)

使用while条件检查流是否处于良好状态。然后你从流中读取,可能会或可能不会成功。然后输出文本的值。你应该做的是:

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

答案 3 :(得分:3)

在文件末尾,infile可能仍会评估为true,但以下对infile >> text的单词的提取失败。即使它失败了你仍然打印出一条线。更好的方法是让while循环检查成功提取:

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

答案 4 :(得分: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;
}