1

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

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

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

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

4

3 回答 3

1

如果您查看 的文档scanf,您将看到EOF如果在分配第一个值之前发生读取失败,则会返回该值。(文件结尾)

http://en.cppreference.com/w/cpp/io/c/fscanf

你同样可以测试:

while(scanf("%X", &hex) == 1)

这是我的偏好。我希望有一个输入,所以我会很明确。

于 2013-02-15T04:24:53.490 回答
0

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

通过检测EOFstdin程序知道何时返回。

于 2014-01-28T04:20:27.943 回答
0

实际上,此输入在 linux 上很好,因为 ^d 将结束流,从而引发“错误”。

在 Windows 上,这种行为是不同的……不管它是不是 ctrl+d。至少我现在知道了,因为我两者都用。

谢谢!

于 2013-02-15T04:37:00.327 回答