fgetc为什么返回int

看APUE,有道题问,下列代码在一些机器上运行正确,而在另外一些机器上不正确,解释为什么。

int main()
{
    char c;
    while( (c = getchar())  != EOF)
        putchar(c);
}

首先看一下,为什么getchar()要返回int?getchar()读取一个字符,这个字符可以是任何值。假如返回unsigned char的话,返回值可能是0x00 ~ 0xFF中任何一个。同时,要考虑下,出错的情况下要返回一个值,这个出错的返回值不能是任何可能的字符。于是返回unsigned char不能达到要求。同理,返回char也不行。原因是unsigned char 和char都无法用一个值来表明出错情况。写标准库的人想到一个办法,将返回值扩展成int(从unsigned char转换)。这样的话,读取任何字符成功的话肯定返回正值,于是我们就可以定义出错情况返回一个负值了。一般都把EOF定义成-1。


回到这个问题,把getchar()返回值赋给char,做了截断。如果某个系统EOF定义成-129的话,并且getchar确实返回EOF, 但是当它赋值给char c的时候截断成127了。于是c != EOF判定true,执行putchar(c),接着再循环getchar(),应该会出错。


把getchar()返回值赋给char,还有个问题,假如EOF定义成-1,某时刻从文件读入0xFF,while语句会误认为结束。

你可能感兴趣的:(eof)