Soo... 我看到一个人声称这段代码正在处理另一个问题。
while(scanf("%X", &hex) != EOF) {
//perform a task with the hex value.
}
那么,在什么情况下会抛出 EOF 标志?我虽然它只会无限期地要求一个数字。我添加了另一行代码来测试它,它也完全符合我的预期......
这不是文件,这似乎是标准输入。所以....这段代码什么时候有用?
即,在什么情况下抛出 EOF 返回?
如果您查看 的文档scanf
,您将看到EOF
如果在分配第一个值之前发生读取失败,则会返回该值。(即文件结尾)
http://en.cppreference.com/w/cpp/io/c/fscanf
你同样可以测试:
while(scanf("%X", &hex) == 1)
这是我的偏好。我希望有一个输入,所以我会很明确。
EOF
在 I/O 错误和文件结束时返回。使用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
程序知道何时返回。
实际上,此输入在 linux 上很好,因为 ^d 将结束流,从而引发“错误”。
在 Windows 上,这种行为是不同的……不管它是不是 ctrl+d。至少我现在知道了,因为我两者都用。
谢谢!