【问题标题】:Clarification on the use of fgetc [duplicate]澄清使用 fgetc [重复]
【发布时间】:2017-04-14 13:15:45
【问题描述】:

我得到的部分函数中有以下代码:

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

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

但是,在检查了 fgetc()getc()getchar() 的用法后,它们似乎都返回 int 类型而不是 char 类型,因为 EOF 不适合用于char,因此通常

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

【问题讨论】:

    标签: c char int eof fgetc


    【解决方案1】:

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

    不是。仅仅因为您可以编写并且编译器(以某种方式)允许您编译它,并不能使代码有效。

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

    补充一下,如果EOF被返回,它不能存储在char中。 char 的签名是实现定义的,因此,根据第 6.3.1.3 章,C11

    1. 将整数类型的值转换为 _Bool 以外的其他整数类型时,如果 值可以用新类型表示,是不变的。

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

    3. 否则,新类型是有符号的,值不能在其中表示;无论是 结果是实现定义的或引发了实现定义的信号。

    【讨论】:

    • 好的,所以如果我将char ch; 更改为int ch;,那么在给定有效fp 的情况下,该代码段将正常运行?另外,如果我想将fgetc()返回的int用作字符串或其他函数中的char,只要不是EOF,将其强制转换为char是否有效?
    • @ScottyN91 是的,差不多就是这样。
    • 根据 char 是否已签名以及 EOF 的实现方式,使用 char 可能会导致各种问题,从无法正确读取 EOF 到将合法字符值之一解释为EOF。
    • "如果返回 EOF,则不能将其存储在字符中" ---> 不同意。当char 被签名并且EOF == -1 当然EOF 可以存储在char 中。问题不在于EOF 可以或不能存储在char 中,一个关键问题是失去以8 位类型存储的257 个不同结果的独特性。
    猜你喜欢
    • 2017-12-29
    • 2012-06-14
    • 2011-12-28
    • 2012-07-05
    • 2014-07-18
    • 1970-01-01
    • 2013-01-14
    • 2013-02-19
    • 1970-01-01
    相关资源
    最近更新 更多