首页 文章

澄清使用fgetc [重复]

提问于
浏览
0

这个问题在这里已有答案:

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

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

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

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

  • 如果 getchar() 返回int,为什么 char c; c = getchar(); 是该函数的有效用法?在这种情况下,C是否会自动键入强制转换为char,并且 getchar() 替换为 getc(fp)fgetc(fp)

  • fgetc() 或其他两个函数返回EOF时,程序会发生什么?它会再次尝试像以前一样投射到角色然后失败吗?什么东西存储在 ch 中?

  • 如果EOF实际上不是一个字符, ch == EOF 如何进行有效比较,因为EOF不能用char变量表示?

1 回答

  • 1

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

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

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

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

    当具有整数类型的值转换为除_Bool之外的另一个整数类型时,如果该值可以由新类型表示,则它将保持不变 . 否则,如果新类型是无符号的,则通过重复地添加或减去一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内.60)否则,新的type已签名且值无法在其中表示;结果是实现定义的,或者引发实现定义的信号 .

相关问题