第一学期的 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
}
谢谢,感谢任何指导!
最佳答案
您总是希望在读取值之后检查您的输入是否成功!您通常不想使用 eof()
来控制输入循环:这是要检查的错误条件。
例如,您发布的两个代码示例出了什么问题:
- 您的第一个循环 (
while (fin >> x && !fin.eof())
) 如果最后一个值后面没有换行符,则不会处理它。尽管这在文件中很少发生,但在从字符串流 (std::istringstream
) 中读取时确实经常发生。 - 您的第二个循环可能会处理最后一行两次:在读取最后一个值之后,读取很有可能会在最后一个换行符处停止,但在尝试读取文件之外之前:
eof()
将为false
,读取失败,值不变,你处理两次。
规范的输入循环总是基本上是这样的:
while (in >> values) {
<process-data-here>
}
读取值的准确方式有一些变化,例如,它也可以使用 std::getline(in, line)
,但它总是读取值并验证流未处于故障状态。
关于c++ - ifstream eof 循环读入条件表达式中的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20026835/