scanf(...)!= EOF的有用上下文

时间:2013-02-15 04:20:58

标签: c scanf

Soo ......我看到一个人声称这段代码正在处理另一个问题。

while(scanf("%X", &hex) != EOF) {
    //perform a task with the hex value. 
}

那么,在什么情况下EOF标志会被抛出?我虽然会不断要求一个数字。我添加了另一行代码来测试它,它完全符合我的预期......

这不是文件,这似乎是标准输入。那么......这段代码什么时候有用呢? 即,在什么情况下EOF返回被抛出?

3 个答案:

答案 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)

在I / O错误和文件结束时返回

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,程序知道何时返回。