C++ 带有额外最终迭代的文件回显循环

C++ 带有额外最终迭代的文件回显循环,c++,file-io,while-loop,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 str

为什么在代码完成时我会得到一个额外的迭代(打印额外的行)?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;  
}  
#包括
#包括
#包括
使用名称空间std;
int main(){
ifstream infle(“dictionary.txt”);//每行一个单词
字符串文本;
while(infle){
填充>>文本;
试试看

while(infle>>文本)不能尝试


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

while(infile >> text){
    cout << text << endl;
}
while(内嵌>>文本){

cout使用while条件检查流是否处于良好状态。然后从流中读取,这可能成功,也可能失败。然后输出文本值。您应该做的是:

while(infile >> text){
    cout << text << endl;
}
while(内嵌>>文本){

cout在文件末尾,
infle
的计算结果可能仍然为
true
,但以下使用
infle>>文本的单词提取失败。即使失败,您仍然可以打印一行。更好的方法是让while循环检查提取是否成功:

string text;
ifstream infile("dictionary.txt"); // one word per line  
while (infile >> text) {
    cout << text << endl;  
}
infile.close();
字符串文本;
ifstream infle(“dictionary.txt”);//每行一个单词
while(内嵌>>文本){

cout在文件末尾,
infle
的计算结果可能仍然为
true
,但以下使用
infle>>文本的单词提取失败。即使失败,您仍然可以打印一行。更好的方法是让while循环检查提取是否成功:

string text;
ifstream infile("dictionary.txt"); // one word per line  
while (infile >> text) {
    cout << text << endl;  
}
infile.close();
字符串文本;
ifstream infle(“dictionary.txt”);//每行一个单词
while(内嵌>>文本){

cout输入流直到您尝试读取文件结束后才检测到文件结束。当您读取文件中的最后一个字时,输入流仍然有效;在下一个循环中,infle>>text尝试读取超过EOF并失败,但下一行仍然执行

循环应如下所示:

while (infile >> text)
    cout << text << endl;
while(内嵌>>文本)

cout输入流直到您尝试读取文件结束后才检测到文件结束。当您读取文件中的最后一个字时,输入流仍然有效;在下一个循环中,infle>>text尝试读取超过EOF并失败,但下一行仍然执行

循环应如下所示:

while (infile >> text)
    cout << text << endl;
while(内嵌>>文本)

cout您已经得到了一些更正,但可能有一个稍微不同的更正值得考虑:

#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;
}
#包括
#包括
#包括
#包括
使用namespace std;//这不是一个好主意,但现在已经足够无害了。
int main(){
ifstream-infle(“dictionary.txt”);
复制(istream_迭代器(infle),istream_迭代器(),
ostream_迭代器(cout,“\n”);
返回0;
}

您已经得到了一些更正,但可能有一个稍微不同的更正值得考虑:

#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;
}
#包括
#包括
#包括
#包括
使用namespace std;//这不是一个好主意,但现在已经足够无害了。
int main(){
ifstream-infle(“dictionary.txt”);
复制(istream_迭代器(infle),istream_迭代器(),
ostream_迭代器(cout,“\n”);
返回0;
}

您能确认“dictionary.txt”结尾没有新行吗?因为您的代码似乎是直接读入的,所以请写出。@nr81:这是读取文件的标准反模式。因为读取后不会测试eof(使用运算符>>)最后一行将被打印两次。阅读文件的正确模式见下面的回复。你能确认“dictionary.txt”吗结尾没有新行?因为您的代码似乎是直接读入的,所以请写出。@nr81:这是读取文件的标准反模式。因为读取后不会测试eof(使用运算符>>)然后,最后一行将打印两次。请参阅下面的回复,了解读取文件的正确模式。while条件确实让我感到不快。我不喜欢副作用——当然,除了我喜欢的那些特殊情况。无论如何,我出于各种原因抵制了否决票,最后决定投票——不仅仅是因为它是反对票CISE,简单,可靠,是大家都应该理解的一个普通的标准库习语。即使如此……想想你自己咆哮着;-谢谢,史蒂夫314,我不介意别人咆哮。-,坦白说,当副作用是工作代码时,我喜欢副作用。虽然条件真的让我恼火。我不喜欢副作用。当然,对于我所做的那些特殊情况,不管怎样,我抵制各种原因的投票,最后决定投票赞成——不仅是因为它简洁、简单、可靠,而且是大家都应该理解的一个共同的标准库习惯用语。即使如此……也要考虑你自己咆哮了。)——谢谢,史蒂夫314,我不介意别人咆哮。老实说,当副作用在代码中起作用时,我确实喜欢副作用。+1是为了多样性。不过,我不认为在这种情况下它特别有趣,因为我怀疑复制单词或将它们推到另一个迭代器中的想法。+1是为了多样性。不过,我认为在这种情况下它不是特别有趣,b因为我怀疑这个想法是复制单词还是将它们推到另一个迭代器中。