C++ std::getline() 不设置 EOF 标志

标签 c++ string loops ifstream eof

<分区>

假设我们有一个格式如下的文件A:

0 5
1 10
2 10
5 0
10 5

表示某个图的所有有向边,例如 0 > 5,依此类推。文件根据左节点排序。现在假设我们有一些机器,每台机器都在对一组节点进行一些计算,例如:

Machine 1: for {0,1}
Machine 2: for {2,5}
Machine 3: for {10}

如上所示,集合已排序,即机器 i 将具有比机器 i+1 更小索引的节点。计算取决于从每个节点离开的边,所以我尝试逐行读取机器 1 的文件 A,然后是机器 2,然后是机器 3,当我到达离开的最后一个边缘时,它们中的每一个都退出循环机器负责的最后一个节点。该文件由分配作业的某些主机读取。对于上面的例子:

For Machine 1
Loop through lines 
0 5
1 10
Exit loop

For Machine 2
Loop through lines 
2 10
5 0
Exit loop

For Machine 3
Loop through lines 
10 5
Exit loop

我有以下 C++ 代码:

ifstream graph_file;
graph_file.open("graph.txt");

//...

string line;
unsigned long left_node;
while(1){

    //EOF reached. Break.
    if (graph_file.eof()){
        break;
    }

    getline(graph_file, line);
    left_node = stol(line);

}

假设我们已经完成了机器 1 和 2(代码未显示但工作正常)并且文件指针指向机器 3 应该开始的输入文件行。所以 std::getline() 读取上面示例的最后一行,并且在下一次迭代中循环不会中断,因为标志不是 EOF 所以 std::stol() 抛出 std::invalid_argument 因为它不读取任何内容。

为什么会这样?

最佳答案

why eof() in a loop condition does not work 相同的原因.请注意,您的代码基本上与 while(!graph_file.eof()) 完全相同,因为您是在循环开始时检查条件,这正是普通 while 循环所做的。

eof() 仅在第一次尝试读取文件末尾 时设置。如果末尾有换行符停止输入,则不会设置标志。

修复位于此答案顶部的链接中。

关于C++ std::getline() 不设置 EOF 标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50265134/

相关文章:

c++ - 我能否判断转换为父类的对象类型最初是否是 C++ 中的子类?

c++ - 内联或不内联

c++ - 从 std::istream 读取时,是否有比 reinterpret_cast<char*> 更好的选择?

python - 如何转换字符串中的字符? -Hackerrank挑战

Java,计算字符串时的逻辑错误

javascript - javascript 中的 DOT. 文件?这是什么意思?

loops - elisp: do 子句语法错误

c++ - 使用静态链接替换 ​​Windows tcmalloc

ios - 循环编程标签和按钮

mysql - 是否可以循环遍历 MySQL SELECT 中的逗号分隔列表?