關於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\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,但是實際上並沒有移動。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM