我从shell执行我的程序:
$main.exe < input.txt
在input.txt中的我有数字(这些数字的计数是未知的)
在我的程序中我做了类似的事情:
while(1)
{
int xCoordinate, yCoordinate;
scanf("%d %d", &xCoordinate, &yCoordinate);
......
}
如果没有要读取的值,我怎么能打破这个循环呢?
答案 0 :(得分:3)
假设输入是一致的,你可以这样做:
if (scanf("%d %d", &xCoordinate, &yCoordinate) != 2) break;
这将起作用的原因是scanf
系列函数返回它们分配的条目数。在您的代码中,您希望scanf
分配两个项目;如果到达EOF,则返回小于2的值。
注意:这种方法会在输入文件与您期望的格式不一致的第一个位置处中断。例如,如果您的输入有一个字符串代替其中一个数字,那么在尝试将该字符串解释为数字失败后,循环将退出。
答案 1 :(得分:1)
你必须将“从文件(或stdin)读取”与“解析我读过的行”分开。如果数据不完全符合您的预期,您将得到非常错误的答案。
你可以通过
这样的方式得到很好的控制char buffer[BUFSIZ];
int xCoordinate, yCoordinate;
while(fgets(buffer, BUFSIZ, stdin) != NULL) {
if(sscanf(buffer, "%d %d", &xCoordinate, &yCoordinate) != 2) {
fprintf(stderr, "parsing error\n")
exit(1);
}
}
即使这样也有一点需要,因为如果fgets返回NULL,它可能意味着EOF或“读取错误”,但它比scanf更强大并且保持原始精神。