ifstream eof循环读入条件表达式中的变量?

时间:2013-11-17 03:26:50

标签: c++ loops ifstream eof

第一学期的C ++作业,这是我遇到的一件事:

基本上这个txt文件在它的每一行都有三个数字 - 循环将它们读入三个变量并使用它们创建一个对象并使用它进行处理。我们必须使用三种不同的循环技术来做到这一点。前两个是使用基于for循环的计数器和基于while循环的标记值完成的,对我来说是直截了当的。

最后一个虽然说“编写一个文件循环结束,它在条件表达式中从fin读取整数到x。” (fin是ifstream对象)

这样的事情有用吗?

while (fin >> x && !fin.eof())
{
rest of loop stuff
}

对于我来说,在循环的条件表达式中读取变量的内容对我来说似乎很奇怪。做这样的事情会不会更有意义呢?

while (!fin.eof())
{
fin >> x;
rest of loop stuff
}

谢谢,感谢任何指导!

1 个答案:

答案 0 :(得分:3)

始终想要检查您的输入是否成功之后读取了该值!您通常不希望使用eof()来控制输入循环:检查它是错误的条件。

例如,您发布的两个代码示例出现了问题:

  1. 如果没有换行符,则第一个循环(while (fin >> x && !fin.eof()))将不会处理最后一个值。虽然这在文件中很少发生,但在从字符串流(std::istringstream)读取时经常会发生这种情况。
  2. 您的第二个循环可能会处理最后一行两次:在读取最后一个值之后,很有可能读取在最后一个换行符上停止,但在尝试读取文件之外:eof()将是false,读取将失败,值将保持不变,并且您将对其进行两次处理。
  3. 规范输入循环总是看起来基本上是这样的:

    while (in >> values) {
        <process-data-here>
    }
    

    如果读取值看起来有一些变化,例如,它也可以使用std::getline(in, line),但它总是读取值并验证流是否处于失败状态。