在 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 更健壮并且保持了原始精神。