我对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)
答:文件末尾没有任何字符.我在这里的 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()用来告诉你文件的结尾已经到了.它告诉您在到达文件末尾后发生了读取错误.
| 归档时间: |
|
| 查看次数: |
151 次 |
| 最近记录: |