在 C 中的重定向输入文件中查找文件结尾
Finding End of File in the Redirected Input file in C
我从 shell 执行我的程序,就像那样:
$main.exe < input.txt
在 input.txt 我有数字(这些数字的数量未知)
在我的程序中我做了类似的事情:
while(1)
{
int xCoordinate, yCoordinate;
scanf("%d %d", &xCoordinate, &yCoordinate);
......
}
当没有值可读时,如何打破这个循环?
假设输入一致,可以这样:
if (scanf("%d %d", &xCoordinate, &yCoordinate) != 2) break;
之所以可行,是因为 scanf
函数族 return 他们分配的条目数。在您的代码中,您希望 scanf
分配两个项目;如果改为达到 EOF,则小于 2 的值将被 returned.
注意: 这种方法将在输入文件与您期望的格式不一致的第一个位置中断。例如,如果您的输入有一个字符串代替其中一个数字,则在尝试将该字符串解释为数字失败后循环将退出。
您必须将 "reading from a file (or 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 returns NULL 它可能意味着 EOF 或 "read error" 但它比 scanf 更健壮并且保持了原始精神。
我从 shell 执行我的程序,就像那样:
$main.exe < input.txt
在 input.txt 我有数字(这些数字的数量未知)
在我的程序中我做了类似的事情:
while(1)
{
int xCoordinate, yCoordinate;
scanf("%d %d", &xCoordinate, &yCoordinate);
......
}
当没有值可读时,如何打破这个循环?
假设输入一致,可以这样:
if (scanf("%d %d", &xCoordinate, &yCoordinate) != 2) break;
之所以可行,是因为 scanf
函数族 return 他们分配的条目数。在您的代码中,您希望 scanf
分配两个项目;如果改为达到 EOF,则小于 2 的值将被 returned.
注意: 这种方法将在输入文件与您期望的格式不一致的第一个位置中断。例如,如果您的输入有一个字符串代替其中一个数字,则在尝试将该字符串解释为数字失败后循环将退出。
您必须将 "reading from a file (or 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 returns NULL 它可能意味着 EOF 或 "read error" 但它比 scanf 更健壮并且保持了原始精神。