EOF符号值和符号字符

  • 本文关键字:符号 字符 EOF char eof
  • 更新时间 :
  • 英文 :


今天我只是躺在床上冥想编程的东西,当一个想法涌进我的脑海,我无法用自己的能力解决。以下是问题。


我读了一本书,解释了为什么EOF值是-1,解释如下:

<我>为什么1 ?通常getchar()返回的值范围在0到127之间,因为这些值对应于标准字符集,但是如果系统识别扩展字符集,它可能返回0到255之间的值。在这两种情况下,值-1都不对应于任何字符,因此它可以用来表示文件的结束。

1)。上面的语句很奇怪,因为我记得除了有符号整数之外,有符号字符也是C中存在的一种变量类型,所以这意味着可以使用-128到127的值。但是为什么书中仍然提到-1并不与键盘输入的任何字符相矛盾??

标准没有说它是-1

EOF,扩展为整型常量表达式,类型为int和一个负值,由几个函数返回来表示文件结束,即不再有来自流的输入

不是一个可以从文件中读取的值。这是一个"带外"的值,getc等在任何情况下都不能返回,除了"文件结束"。

你得到的答案都没有提到(至少在我看来)至关重要的一点。

当您读取一个字符时,该值被读取为unsigned char,并从那里转换为int(§7.19.7.1/2):

如果流所指向的输入流的文件结束指示符没有设置,则a出现下一个字符时,fgetc函数将该字符作为无符号字符获取对象的相关文件位置指示符向前移动流(如果定义了)。

这个特殊的引用是针对fgetc的——getcgetcharfread都需要像调用fgetc一样读取数据。

这确实隐式地(至少在某种程度上)假设char的范围比int小,因此转换到int至少允许表示一个不可能来自文件的值。在其他地方,标准否认这是一个要求,但我认为否认是不现实的——我很确定charint相同大小的实现会破坏大量的代码。

getchar实际上返回一个int,这意味着它有超过8位。如果getchar返回一个介于0到255(包括)之间的数字,那么您就知道它从您正在读取的文件中返回了一个有效字节。如果它返回-1,你就知道你到达了文件的末尾。因为该值是一个int,所以-1保证不等于0到255之间的任何值。

getchar()返回一个int,它包含一个plain (unsigned) char或EOF,所以没有问题。

这就是getchar()返回int的原因。如果它返回有符号char,您将无法区分EOF和-1字符(来自扩展集的128),如果它返回无符号char,则-1没有任何意义。但是getchar()返回int如果它在0到255的范围内它就是一个字符如果它返回-1那么它就是EOF

getchar()返回一个int。-1表示EOF,或者0到255。int类型足够大,不会与这些冲突

最新更新