在C中的重定向输入文件中查找文件结尾

在C中的重定向输入文件中查找文件结尾,c,io-redirection,C,Io Redirection,我从shell中执行我的程序,如下所示: $main.exe < input.txt 当没有可读取的值时,如何中断此循环?假设输入是一致的,您可以这样做: if (scanf("%d %d", &xCoordinate, &yCoordinate) != 2) break; 这样做的原因是scanf函数族返回它们分配的条目数。在代码中,您希望scanf分配两个项目;如果达到EOF,则返回一个小于2的值 注意:这种方法将在输入文件与您期望的格式不一致的第一个点中断。例如,

我从shell中执行我的程序,如下所示:

$main.exe < input.txt

当没有可读取的值时,如何中断此循环?

假设输入是一致的,您可以这样做:

if (scanf("%d %d", &xCoordinate, &yCoordinate) != 2) break;
这样做的原因是
scanf
函数族返回它们分配的条目数。在代码中,您希望
scanf
分配两个项目;如果达到EOF,则返回一个小于2的值


注意:这种方法将在输入文件与您期望的格式不一致的第一个点中断。例如,如果您的输入中有一个字符串代替其中一个数字,则在尝试将该字符串解释为数字失败后,循环将退出。

假设输入是一致的,您可以这样做:

if (scanf("%d %d", &xCoordinate, &yCoordinate) != 2) break;
这样做的原因是
scanf
函数族返回它们分配的条目数。在代码中,您希望
scanf
分配两个项目;如果达到EOF,则返回一个小于2的值

注意:这种方法将在输入文件与您期望的格式不一致的第一个点中断。例如,如果您的输入中有一个字符串代替其中一个数字,则在尝试将该字符串解释为数字失败后,循环将退出。

您必须将“从文件(或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更健壮,并且保持了原始的精神。

您必须将“从文件(或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更健壮,并且保持了原始版本的精神。

永远不要使用scanf。我尝试做两件事(输入和解析),但两者都做得不好。如果输入开始
12xy
,那么
xCoordinate
的内容是什么,scanf的返回值是什么,最重要的是,读取的下一个字符是什么?使用
fgets
和您想要的字符串解析代码。您将始终知道下一步将从stdin读取什么,并且您可以提供比scanf更好的诊断。@msw保证输入文件只包含数字。但是感谢您的评论。永远不要使用scanf。我尝试做两件事(输入和解析),但两者都做得不好。如果输入开始
12xy
,那么
xCoordinate
的内容是什么,scanf的返回值是什么,最重要的是,读取的下一个字符是什么?使用
fgets
和您想要的字符串解析代码。您将始终知道下一步将从stdin读取什么,并且您可以提供比scanf更好的诊断。@msw保证输入文件只包含数字。但感谢您的评论。除非有输入行
xyz
,否则
%d
转换将失败,scanf将返回not 2,即使后面有数千条坐标线,循环也将中断。除非已经检查了输入的一致性,否则此代码将被中断,并且输入几乎从来都不是您所期望的。@msw感谢您的评论!除非有一个输入行
xyz
%d
转换将失败,否则scanf将返回not 2,即使后面有数千条坐标线,循环也将中断。除非已经检查了输入的一致性,否则此代码将被中断,并且输入几乎从来都不是您所期望的。@msw感谢您的评论!