【问题标题】:File echo loop with extra final iteration带有额外最终迭代的文件回显循环
【发布时间】:2010-12-04 10:04:10
【问题描述】:

为什么当这段代码完成时我得到一个额外的迭代(额外的行打印)? 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;  
}  

【问题讨论】:

  • 你能确认“dictionary.txt”最后没有换行吗?因为您的代码似乎可以直接读入、写出。
  • @nr81:这是读取文件的标准反模式。因为在读取(使用运算符>>)之后没有测试 eof,所以最后一行将被打印两次。有关读取文件的正确模式,请参阅下面的回复。

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


【解决方案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;
}

【讨论】:

  • +1 为了多样性。不过,我认为在这种情况下并不是特别有趣,因为我怀疑这个想法是复制单词或将它们推送到另一个迭代器中。
【解决方案2】:

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

循环应该是这样的:

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

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

【讨论】:

    【解决方案3】:

    在文件末尾,infile 的计算结果可能仍为true,但以下提取带有infile &gt;&gt; text 的单词会失败。即使它失败了,你仍然会打印出一行。更好的方法是让 while 循环检查是否成功提取:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        试试

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

        改为。

        【讨论】:

        • 这种情况确实让我很恼火。我不喜欢副作用——当然,除了那些我喜欢的特殊情况。无论如何,我出于各种原因拒绝了投票,最后决定投票 - 尤其是因为它简洁、简单、可靠,并且是每个人都应该理解的通用标准库习语。即便如此......想想你自己在咆哮;-)
        • 谢谢,Steve314,我不介意被人骂。 ;-) 而且,老实说,当副作用是工作代码时,我确实喜欢副作用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多