澄清使用fgetc

时间:2017-04-14 13:15:46

标签: c char int eof fgetc

我给出了函数的一部分以下代码:

char ch;
ch = fgetc(fp);
if (ch == EOF)
  return -1;

其中fp是作为参数传递给函数的指针到文件/流。

但是,检查了fgetc()getc()getchar()的使用情况后,似乎它们都返回int类型而不是类型char,因为EOF不适合值0-在char中使用的255,通常是< 0(例如-1)。但是,这引出了我提出三个问题:

  1. 如果getchar()返回int,为什么char c; c = getchar();是函数的有效用法?在这种情况下,C是否会自动键入强制转换为char,如果getchar()替换为getc(fp)fgetc(fp)
  2. fgetc()或其他两个函数返回EOF时,程序会发生什么?它会再次尝试像以前一样投射到角色然后失败吗?什么内容存储在ch中?
  3. 如果EOF实际上不是一个字符,ch == EOF如何进行有效比较,因为EOF不能用char变量表示?

1 个答案:

答案 0 :(得分:1)

  

如果getchar()返回int,为什么是char c; c = getchar();函数的有效用法?

不是。只是因为你可以编写和编译(以某种方式)允许你编译它,不会使代码有效。

我相信以上回答所有问题。

只是要添加,如果返回EOF,则无法将其存储在char中。 char的签名是实现定义的,因此,根据章节6.3.1.3,C11

  
      
  1. 当整数类型的值转换为_Bool以外的另一个整数类型时,if   该值可以用新类型表示,不变。

  2.   
  3. 否则,如果新类型是无符号的,则通过重复添加或转换该值   减去一个可以在新类型中表示的最大值   直到该值在新类型的范围内.60)

  4.   
  5. 否则,新类型已签名且值无法在其中表示;无论是   结果是实现定义的或引发实现定义的信号。

  6.