eof()不良做法
eof() bad practice?
可能重复:
为什么循环条件中的iostream::eof被认为是错误的?
所以我在很多需要文件输入的程序中都使用了eof()
函数,我的教授说使用它很好,但So上的一些人说,在没有具体说明原因的情况下,我不应该使用它。所以我想知道,有充分的理由吗?
您可以使用eof
来测试它报告的确切条件-您是否试图读取文件末尾。您不能使用它来测试是否有更多的输入要读取,或者读取是否成功,这是更常见的测试。
错误:
while (!cin.eof()) {
cin >> foo;
}
正确:
if (!(cin >> foo)) {
if (cin.eof()) {
cout << "read failed due to EOFn";
} else {
cout << "read failed due to something other than EOFn";
}
}
您不应该使用它,因为如果由于其他原因输入失败,您可能会被搞砸。
while(!file.eof()) {
int i;
file >> i;
doSomething(i);
}
如果文件的内容是"WHAARRRRRGARBL",那么在上面的循环中会发生什么?它无限循环,因为它不是文件的末尾,但您仍然无法从中提取int
您是如何使用它的?.eof()
会告诉您,流已经到达文件的末尾,它试图读取不存在的数据。
这通常不是你想要的。通常,你想知道你正在达到文件的末尾,或者你即将达到文件的结尾,而不是你已经达到了
while(!f.eof())
{
f >> /* something */;
/* do stuff */
}
您将尝试读取中的输入并失败,然后执行/* do stuff */
中的所有内容,然后循环条件失败,循环停止。
该循环的另一个问题是,输入可能会以其他方式失败。如果文件中存在非EOF的错误条件,.fail()
将返回true
,但.eof()
不会。
如果以上答案令人困惑:
人们认为它做的是错误的:
- eof((不会查看您读取的最后一部分是否包含文件的最后一个字节
- 它不会查看下一个字节是否在文件末尾之后
它的实际作用:
- eof((报告最后一次读取是否包含超过文件末尾的字节
如果eof((为真,则表示您已经犯了一个错误。教授们的陈述就是这样解释的。使用它的意思是,发生了错误。
相关文章:
- 如何确定我已使用非编码文件到达 EOF?
- std::ifstream::read 不会读取所有 512 字节,并设置 EOF 和失败位
- 为什么"using System;"不被视为不良做法?
- 而(!inputfile.eof())只读取第一行?
- EOF有更安全的替代方案吗?它在我的情况下不起作用
- "错误 C0000:语法错误,令牌"<EOF>"处出现意外$end,并且不确定
- 如何在 EOF 之前从文件中读取并将其放入字符串中?
- 如何在从文件中读取整数时使用 file.eof()?
- "eof"可以设置为流吗?
- 吃完 EOF 后重复使用 std::cin
- 提升不良词法强制转换:将字符串转换为无符号长整型时,无法将源类型值解释为目标
- 文件处理,eof() 定义
- std::cin 在读取 EOF 并清除后不再读取
- 为什么 EOF 在循环扫描期间没有终止?
- 删除复制构造函数的 Intel 13.1.2 中不良C++行为的解决方法
- cin.clear()是否保留EOF
- 而(getline(fin,str)){}即使在到达eof之后仍在处理数据
- 通过终端在文件中输入时检测EOF(文件结束)时出现问题
- 为什么如果我从键盘输入EOF克里昂不要在运行窗口打印程序的输出?
- eof()不良做法