關於fefo函數

來源:互聯網
上載者:User

標籤:方法   turn   函數   程式   功能   lock   item   庫函數   printf   

 

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

關於fefo函數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.