Soo ......我看到一个人声称这段代码正在处理另一个问题。
while(scanf("%X", &hex) != EOF) {
//perform a task with the hex value.
}
那么,在什么情况下EOF标志会被抛出?我虽然会不断要求一个数字。我添加了另一行代码来测试它,它完全符合我的预期......
这不是文件,这似乎是标准输入。那么......这段代码什么时候有用呢? 即,在什么情况下EOF返回被抛出?
答案 0 :(得分:1)
如果查看scanf
的文档,您会看到如果在分配第一个值之前发生读取失败,则返回值EOF
。 ( ie 文件结尾)
http://en.cppreference.com/w/cpp/io/c/fscanf
你可以同样测试:
while(scanf("%X", &hex) == 1)
这是我的偏好。我期待一个输入,所以我会明确。
答案 1 :(得分:0)
实际上,这个输入在linux上很好,因为^ d会结束流,从而引发错误。'
在Windows上,这种行为是不同的......不管它是不是ctrl + d。至少我现在知道,因为我同时使用它们。
谢谢!
答案 2 :(得分:0)
EOF
。对于stdin
,I / O错误是一种罕见的事件,使用键盘输入时,文件结束指示通常需要一个特殊的键序列。
重定向输入会出现实际用途。
假设存在一个读取十六进制文本并打印出十进制文本的程序:
// hex2dec.c
#include <stdio.h>
int main(void) {
unsigned hex;
int cnt;
while((cnt = scanf("%X", &hex)) == 1) {
printf("%u\n", hex);
}
// At this point, `cnt` should be 0 or EOF
if (cnt != EOF) {
puts("Invalid hexadecimal sequence found.");
return 1;
}
return 0;
}
// hex.txt contents:
abc
123
使用命令
进行转换hex2dec < hex.txt
2748
291
通过检测EOF
上的stdin
,程序知道何时返回。