C EOF符号值和签名字符

时间:2011-08-14 18:45:28

标签: c char eof

今天我只是躺在床上冥想编程的东西,当一个想法流入我的脑海时,我无法用自己的能力解决。这就是问题。


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

为什么-1?通常getchar()返回0到127范围内的值,因为它们是与标准字符集对应的值,但如果系统识别出扩展,它可能会返回0到255之间的值字符集 。在任何一种情况下,值-1都不对应任何字符,因此它可用于表示文件结尾。

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

6 个答案:

答案 0 :(得分:3)

该标准并未说明-1

  

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

这不是您可以从文件中读取的值。这是一个“带外”值,getc除了“文件结束”之外无论如何都不会返回。

答案 1 :(得分:3)

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

答案 2 :(得分:3)

你所得到的答案都没有提到(至少IMO)至关重要的一点。

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

  

如果未设置stream指向的输入流的文件结束指示符,则为a   如果存在下一个字符,则fgetc函数将该字符作为无符号获取   char转换为int并前进相关的文件位置指示符   流(如果已定义)。

此特定报价适用于fgetc - getcgetcharfread都需要通过调用fgetc来读取数据。< / p>

这隐含地(至少有点)假设char的范围小于int,因此转换为int允许至少表示一个值,而不能{来自文件。在其他地方,标准否认这是一个要求,但我认为拒绝是不现实的 - 我很确定charint相同大小的实现会破坏浩大代码量。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

getchar()返回一个包含普通(无符号)字符或EOF的int,因此没有问题。

答案 5 :(得分:0)

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