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.t ...
feof是C語言標準庫函數函數,其原型在stdio.h中,其功能是檢測流上的文件結束符。
函數原型:
- int feof(FILE *stream);
- 返回值:如果文件結束,則返回非0值,否則返回0
- 在使用過程中發現一些問題:
- demo1:功能,複製文件內容
-
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 Codein.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()函數的時候,需要考慮到函數檢測的是上一次的讀取狀態而非本次讀取狀態。