程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 關於fefo函數,fefo函數

關於fefo函數,fefo函數

編輯:關於C語言

關於fefo函數,fefo函數


 

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 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()函數的時候,需要考慮到函數檢測的是上一次的讀取狀態而非本次讀取狀態。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved