小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

feof()介紹

 幸福的樂土 2012-03-15
     feof(fp)有兩個返回值:如果遇到文件結(jié)束,函數(shù)feof(fp)的值為非零值,否則為0。
  EOF是文本文件結(jié)束的標(biāo)志。在文本文件中,數(shù)據(jù)是以字符的ASCⅡ代碼值的形式存放,普通字符的ASCⅡ代碼的范圍是32到127(十進(jìn)制),EOF的16進(jìn)制代碼為0x1A(十進(jìn)制為26),因此可以用EOF作為文件結(jié)束標(biāo)志。
  當(dāng)把數(shù)據(jù)以二進(jìn)制形式存放到文件中時,就會有-1值的出現(xiàn),因此不能采用EOF作為二進(jìn)制文件的結(jié)束標(biāo)志。為解決這一個問題,ASCI C提供一個feof函數(shù),用來判斷文件是否結(jié)束。feof函數(shù)既可用以判斷二進(jìn)制文件又可用以判斷文本文件。
  “C”語言的“feof()”函數(shù)和數(shù)據(jù)庫中“eof()”函數(shù)的運(yùn)做是完全不同的。數(shù)據(jù)庫中“eof()”函數(shù)讀取當(dāng)前指針的位置,“C”語言的“feof()”函數(shù)返回的是最后一次“讀操作的內(nèi)容”。多年來把“位置和內(nèi)容”相混,從而造成了對這一概念的似是而非。
  那么,位置和內(nèi)容到底有何不同呢?舉個簡單的例子,比如有人說“你走到火車的最后一節(jié)車箱”這就是位置。而如果說“請你一直向后走,摸到鐵軌結(jié)束”這就是內(nèi)容。也就是說用內(nèi)容來判斷會“多走一節(jié)”。這就是完全依賴于“while(!feof(FP)){...}”進(jìn)行文件復(fù)制時,目標(biāo)文檔總會比源文檔“多出一些”的原因。
  在“C”文件讀取操作時不能完全依賴于“while(!feof(FP)){...}”的判斷。下面代碼是改進(jìn)后的代碼,該代碼執(zhí)行后output文件內(nèi)容和input文件內(nèi)容一致,與使用“while(!feof(FP)){...}”相比,input文件的結(jié)尾符號(EOF)沒有被讀入到output文件中。

#include <stdio.h>

int main(void)
{

FILE *in, *out;
int ch;
if((in = fopen("input.txt","rb")) == NULL){
return 0;
}
if((out = fopen("output.txt","wb")) == NULL){
return 0;
}
ch = fgetc(in);
while(!feof(in))         //可以換成while(1)
{
if(ch == -1)
return 0;
fputc(ch,out);
ch = fgetc(in);
}
fclose(in);
fclose(out);
return 0;
}
  與EOF的區(qū)別
  在stdio.h中可以看到如下定義:
  #define EOF (-1)
  #define _IOEOF 0x0010
  #define feof(_stream) ((_stream)->_flag & _IOEOF)

#include <stdio.h>
int main(void)
{
FILE *in, *out;
int ch;
if((in = fopen("input.txt","rb")) == NULL){
return 0;
}
while(!feof(in))
{
ch = fgetc(in);
printf("%X  %d\n",ch,ch);
}
fclose(in);
return 0;
}
當(dāng)調(diào)用程序,input.txt文件中只有數(shù)字1; 
輸出為:
31   49
FFFFFFFF
  會發(fā)現(xiàn)多輸出了一個FFFFFFFF,原因就是在讀完最后一個字符后,fp->flag仍然沒有被置為_IOEOF,因而feof()仍然沒有探測到文件結(jié)尾。直到再次調(diào)用fgetc()執(zhí)行讀操作,feof()才能探測到文件結(jié)尾。這樣就多輸出了一個-1(即FFFFFFFF)。
  正確的寫法應(yīng)該是:
  int c;
  c = fgetc(fp);
  while(!feof(fp))
  {
   printf("%X  %d\n",ch,ch);
   c = fgetc(fp);
  }
  feof()可以用EOF代替嗎?不可以。fgetc返回-1時,有兩種情況:讀到文件結(jié)尾或是讀取錯誤。因此我們無法確信文件已經(jīng)結(jié)束, 因為可能是讀取錯誤! 這時我們需要feof()。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多