提问人:mgus 提问时间:5/10/2018 更新时间:5/11/2018 访问量:500
C++ std::getline() 不设置 EOF 标志 [duplicate]
C++ std::getline() doesn't set the EOF flag [duplicate]
问:
假设我们有一个格式如下的文件 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 的文件 A,然后是机器 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 应该从的输入文件行开始。因此,读取上述示例的最后一行,在下一次迭代中,循环不会中断,因为标志不是 EOF,因此不会抛出,因为它什么都不读。std::getline()
std::stol()
std::invalid_argument
为什么会出现这种行为?
答:
2赞
eesiraed
5/10/2018
#1
与循环条件下的 eof()
不起作用的原因相同。请注意,您的代码基本上完全相同,因为您在循环开始时检查条件,这正是正常的 while 循环所做的。while(!graph_file.eof())
eof()
仅在第一次尝试读取文件末尾时设置。如果末尾有一个停止输入的换行符,则不会设置标志。
修复程序位于此答案顶部的链接中。
评论
EOF
EOF
stol(line)
getline
)