关于C语言中EOF的一点认识

总结来说:EOF(即End Of File)是一个文件结束的标记,当文件被读取到EOF位置时,参与读取的函数会返回整型值 -1,这时要注意的是:这个值被赋值给有符号char类型时是0xff,被赋值给有符号short时是0x00ff,有符号int即0x000000ff。

有以下代码:

 1 #include <stdio.h>
 2 struct student{
 3     char name[5];
 4     char sex;
 5     short age;
 6 };
 7 int main(){
 8     FILE * f1, * f2;
 9     unsigned int count;
10     short ch;
11 
12     count = 0;
13 
14     f1 = fopen("ascii.txt", "rb");
15     ch=fgetc(f1);
16     while (ch!=EOF){
17         count++;
18         ch = fgetc(f1);
19         //可以看到被测试文件的第二个字符是FF,它以有符号char类型保存时值是-1,与EOF值相符,如果变量ch类型是有符号char就会出现结束循环,导致错误的计数
20         //然而这里的ch类型是有符号short,当FF赋值给有符号short类型时是0x00FF,它的值是255,所以不与EOF(-1)相符,可以正常计数
21     }
22     fseek(f1, 2, SEEK_SET);
23     printf("%d
", ftell(f1));
24     printf("code is:%x
", getc(f1)==EOF);
25     printf("code is:%x
", getc(f1)==EOF);
26     printf("code is:%x
", getc(f1));
27     //最后一个getc(f1)输出为八个f,原因很简单,因为这时候已经取到了EOF,而EOF的值是-1,所以这时getc返回-1,C语言中整型直接常量的类型是有符号int,所以就得到了有符号int类型的0xffffffff(它的值就是-1)
28 
29     fclose(f1);
30 
31     printf("total btyes:%ld
", count);
32 
33     return 1;
34 }

输出结果:

2
code is:0
code is:1
code is:ffffffff
total btyes:3
Press any key to continue

被测试文件(ascii.txt)的十六进制结构为:

33 FF 55

另外,任何尝试读取非法的文件指针所指向的字符(字节)时都会返回 -1,如下代码所示:

fseek(f1, 14, SEEK_SET);
printf("%d
", ftell(f1));
printf("code is:%x
", getc(f1));

输出:

14
code is:ffffffff
Press any key to continue

解释:还是以"ascii.txt"为例,fseek移到了非法的位置 14 时(因为一共就0, 1, 2三个位置),getc函数返回-1。

最后:fseek函数需要注意的是(SEEK_SET, CUR, END结果都相同,SEEK_END指向的是文件的EOF位置),它不会把文件指针移到位置 0 之前(如下代码所示),但是能移到EOF位置之后(如上代码所示):

fseek(f1, -2, SEEK_SET);
printf("%d
", ftell(f1));
printf("code is:%x
", getc(f1));

输出:

0
code is:33
Press any key to continue

解释:第二个参数是 -2,应该从SEEK_SET位置向前移动两个字符,即ftell函数应该返回 -2,但是实际上并没有移动。

原文地址:https://www.cnblogs.com/ryzz/p/9354396.html