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

时间:2015-01-02 04:04:06

标签: c io-redirection

我从shell执行我的程序:

$main.exe < input.txt
在input.txt中的

我有数字(这些数字的计数是未知的)

在我的程序中我做了类似的事情:

while(1)
{

int xCoordinate, yCoordinate;
scanf("%d %d", &xCoordinate, &yCoordinate);

......

}

如果没有要读取的值,我怎么能打破这个循环呢?

2 个答案:

答案 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更强大并且保持原始精神。