c++ - ifstream.eof() 在 C++ 中未评估为真

标签 c++ file input ifstream eof

<分区>

我对理解 C++ 中的文件输入流有点费劲。我有一个代码片段如下:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main() {
    ifstream in("x.txt");

    bool done = false;
    do {
        string input = "";
        getline(in,input);
        int x1;
        int x2;
        in >> x1;
        in >> x2;
        cout << input << " " << x1 << " " << x2 << endl;
        in.ignore();
        if(in.eof()) {
            done = true;
            cout << "reached eof" << endl;  
        }
    } while(!done);

    return 0;
}

文件x.txt内容如下

task1
12
1313
task2
13
1414
[blank line]

请注意输入文件末尾有意包含空行。这意味着输入“1414”后按下了回车键。

我的预期输出是

task1 12 1313
task2 13 1414
reached eof

但实际上,输出是

task1 12 1313
task2 13 1414
 13 1414
reached eof

我知道在输入文件中按回车键会产生一个隐含的换行符,在使用像getline(ifstream, string)这样的语句之前,我们应该ignore()下一个换行符。话虽这么说,为什么 ifstream.eof() 没有评估为真,即使我 ignore() '1414' 之后的隐式换行符?

最佳答案

eof 标志只有在您尝试读取文件末尾之后才会设置。您应该改为在从流中读取后检查结果,也许类似于

while (getline(in, input) && in >> x1 >> x2) {
    cout << input << " " << x1 << " " << x2 << endl;
    in.ignore();
}
cout << "reached eof" << endl;  

关于c++ - ifstream.eof() 在 C++ 中未评估为真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27275513/

相关文章:

java - 无法使用 apache common io 中的比较器解析方法排序

c - 文件大小 c 不同于大小数据字符串的大小

python-3.x - 从另一个函数获取数字输入的函数,如果数字为负,则应该给出错误

C++ - 使用在 azure 中托管的 C# REST-full WCF 服务

BASH 脚本,用于按基本文件名将文件递归排序到同名文件夹中

c++ - 模板化模式对象和外部密码对象有什么区别?

javascript - html表单输入字符串作为javascript中的字符数组

javascript - 范围:在 JavaScript 中将局部变量传递给全局变量

c++ - 如何使用 Visual C++ 在 Windows 上构建通用数学模板库

c++ - 打印数字签名信息