總結來說: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\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: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\n", ftell(f1)); printf("code is:%x\n", 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\n", ftell(f1)); printf("code is:%x\n", getc(f1));
輸出:
0
code is:33
Press any key to continue
解釋:第二個參數是 -2,應該從SEEK_SET位置向前移動兩個字符,即ftell函數應該返回 -2,但是實際上並沒有移動。