为什么 eof() 不能像我预期的那样工作?

why does eof() not work as I expect?

#include <iostream>
#include <fstream>

using namespace std;

int main() 
{
    ifstream in("input.txt");
    int i = 0,sum=0;
    char x;
    while (!in.eof()){
        in >> i;
        if (in.good()) {
            cout << "integer is " << i << endl; sum += i; 
        }
        if (in.fail()) {
            in.clear();
            in >> x;
            cout << "the char is " << x << endl;
        }
    }
    cout << sum;
    char z;
    cin >> z;
}

我的 input.txt 就像:

bear: sdf 23 ok我很好 11q , 45

我的屏幕输出如下:

the last number 45 doesn't show up

那么这里发生了什么?为什么 45 被认为是 out of file。如果我紧挨着 45 添加一个 's',屏幕将显示两个 s,而不是一个。

问题是当提取 45 的符号时,它会尝试在“5”之后提取符号(以检查数字是否继续)并看到文件结尾,设置 eofbit。这使得 in.good() 测试失败。建议:

while (!in.eof()){
    in >> i;
    if ( in ) { //Not .good(), just conversion to bool

while (!in.eof()){
    if ( in >> i; ) { //both extraction and checking in same operation

请记住,.good() 与检查流状态不同。 .good() 表示流是否准备好接受 进一步的 输入。 Bool 转换执行 ! .fail() 并检查 last 操作是否成功执行

嗯,“eof()确实按预期工作,至少,我希望它如何工作:当流以某种方式触及文件。如果您的文件的最后一行实际上以 '5' 而不是换行符结尾,则读取整数会由于触摸换行符而停止并设置 std::ios_base::eofbit 。由于 std::ios::good() returns false 如果设置了任何位,包括 std::ios_base::failbit 最后一个值将不会被打印。

一般来说,eof() 被误用的次数多于被正确使用的次数。本质上,eof() 的唯一合理用途是验证整个流是否已被消耗,或者如果设置了 eof() 则抑制错误消息,因为预计在流的末尾输入失败。同样,std::ios::good().

通常用处不大