feof是C語言標准庫函數函數,其原型在stdio.h中,其功能是檢測流上的文件結束符。
函數原型:
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main(){ 4 FILE *pt,*pt1; 5 char ch; 6 pt=fopen("in.txt","r"); 7 pt1=fopen("out.txt","w"); 8 if(!pt || !pt1){ 9 printf("Open error!\n"); 10 exit(0); 11 } 12 while(!feof(pt)){ 13 putchar(ch=fgetc(pt)); 14 printf("\t%d\n",ch); 15 putc(ch,pt1); 16 } 17 return 0; 18 }View Code
in.txt:123 size:3byte
out.txt:123 size:4byte
運行截圖:
分析:
通過這個代碼,我們原本想復制in.txt中的文本到out.txt中,但是結果顯示out.txt文件體積變大,為什麼會這樣呢?
首先,我們把每一個從in.txt讀取到的字符輸出到屏幕並且輸出其ASCII碼,結果顯示循環了4次,和我們想的不太一樣。問題就出在這裡,在我們認為while()循環執行到第3次的時候,第4次是不可以進入循環的。但事實上,程序進入了循環體,並且還讀到了一個字符,用putchar()無法輸出,但是其整形輸出為-1,可以猜想到是讀到了EOF。這時我們回到循環條件,發現feof函數檢測的是上一次是否讀入成功,而不是檢測本次是否可讀,起始執行feof函數返回0,當讀完3的時候,feof狀態為0,因此還是滿足循環條件,進入循環,這時就讀取到了EOF,就會出現輸出-1的情形,文件隨之也會被擴大。
解決方法:
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main(){ 4 FILE *pt,*pt1; 5 char ch; 6 pt=fopen("in.txt","r"); 7 pt1=fopen("out.txt","w"); 8 if(!pt || !pt1){ 9 printf("Open error!\n"); 10 exit(0); 11 } 12 while(~(ch=fgetc(pt))){ 13 putchar(ch); 14 printf("\t%d\n",ch); 15 putc(ch,pt1); 16 } 17 return 0; 18 }View Code
通過檢測getc()的返回值來確定是否執行到文件末尾標記符,當讀取到EOF時,函數返回-1,因此不會進入循環體。
運行截圖:
輸出文件: out.txt 內容為:123 size:3byte
-------------------------------------------------------------------------------
用過這樣的解決方法可以得到相同大小的復制文件,因此在使用feof()函數的時候,需要考慮到函數檢測的是上一次的讀取狀態而非本次讀取狀態。