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