总结来说:EOF(即End Of File)是一个文件结束的标记,当文件被读取到EOF位置时,参与读取的函数会返回整型值 -1,这时要注意的是:这个值被赋值给有符号char类型时是0xff,被赋值给有符号short时是0x00ff,有符号int即0x000000ff。
有以下代码:
1 #include2 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\n", ftell(f1));24 printf("code is:%x\n", getc(f1)==EOF);25 printf("code is:%x\n", getc(f1)==EOF);26 printf("code is:%x\n", 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\n", count);32 33 return 1;34 }
输出结果:
2
code is:0code is:1code is:fffffffftotal btyes:3Press any key to continue被测试文件(ascii.txt)的十六进制结构为:
33 FF 55
另外,任何尝试读取非法的文件指针所指向的字符(字节)时都会返回 -1,如下代码所示:
fseek(f1, 14, SEEK_SET);printf("%d\n", ftell(f1));printf("code is:%x\n", getc(f1));
输出:
14
code is:ffffffffPress 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\n", ftell(f1));printf("code is:%x\n", getc(f1));
输出:
0
code is:33Press any key to continue解释:第二个参数是 -2,应该从SEEK_SET位置向前移动两个字符,即ftell函数应该返回 -2,但是实际上并没有移动。