文件末尾有哪些字符?

Mic*_*alH 2 c file

我对C比较陌生,我的问题是:

是否总是只有EOF字符超过文件末尾?

示例代码:

FILE *fr;
int i;

fr=fopen("file.txt","r");

for (i=0;i<20;i++) {
    putchar(getc(fr));
}

fclose(fr);
Run Code Online (Sandbox Code Playgroud)

输出:

user@host:~$ ./a.out | xxd
0000000: 6173 640a ffff ffff ffff                 asd.......
Run Code Online (Sandbox Code Playgroud)

(file.txt包含asd\n)

Wea*_*ane 8

答:文件末尾没有任何字符.我在这里的 MSVC手册页说如果你读过文件的末尾,则getc()返回EOF.

无论你尝试getc()在文件末尾读取多少次都没关系,但事实并非如此.它只是一直回来EOF.

EOF不是文件标志着其结束的一部分-它是通过返回的标志值getc()来告诉你有没有更多的数据.

编辑包括一个样本来显示行为feof().注意,我做了单独的printf()声明,而不是将它们合并到一个声明中,因为清楚函数feof()getc()调用的顺序很重要.

请注意,返回feof()之前不会返回非0值. getc()EOF

#include <stdio.h>

int main( void )
{
    FILE *fr;
    int i;
    fr=fopen("file.txt","r");
    for (i=0;i<6;i++) {
        printf("feof=%04X, ", feof(fr));
        printf("getc=%04X\n", getc(fr));
    }
    fclose(fr);
}
Run Code Online (Sandbox Code Playgroud)

程序输入文件:

abc\n
Run Code Online (Sandbox Code Playgroud)

节目输出:

feof=0000, getc=0061
feof=0000, getc=0062
feof=0000, getc=0063
feof=0000, getc=000A
feof=0000, getc=FFFFFFFF
feof=0010, getc=FFFFFFFF
Run Code Online (Sandbox Code Playgroud)

所以,你不能feof()用来告诉你文件的结尾已经到了.它告诉您到达文件末尾发生了读取错误.