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

时间:2018-05-10 03:43:22

标签: 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,因为它什么都不读

为什么会出现这种情况?

1 个答案:

答案 0 :(得分:2)

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

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

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