我愛學習網-上傳
當前位置: 主頁 > 文庫 > C語言 >

EOF是什么?

時間:2020-08-26 15:13來源:我愛學習網 作者:apple 點擊:

我學習C語言的時候,遇到的一個問題就是EOF。

 

它是end of file的縮寫,表示"文字流"(stream)的結尾。這里的"文字流",可以是文件(file),也可以是標準輸入(stdin)。

 

 

比如,下面這段代碼就表示,如果不是文件結尾,就把文件的內容復制到屏幕上。

 

int c;

while ((c = fgetc(fp)) != EOF) {

putchar (c);

}

 

很自然地,我就以為,每個文件的結尾處,有一個叫做EOF的特殊字符,讀取到這個字符,操作系統就認為文件結束了。

 

但是,后來我發現,EOF不是特殊字符,而是一個定義在頭文件stdio.h的常量,一般等于-1。

 

#define EOF (-1)

 

于是,我就困惑了。

 

如果EOF是一個特殊字符,那么假定每個文本文件的結尾都有一個EOF(也就是-1),還是可以做到的,因為文本對應的ASCII碼都是正值,不可能有負值。但是,二進制文件怎么辦呢?怎么處理文件內部包含的-1呢?

 

這個問題讓我想了很久,后來查了資料才知道,在Linux系統之中,EOF根本不是一個字符,而是當系統讀取到文件結尾,所返回的一個信號值(也就是-1)。至于系統怎么知道文件的結尾,資料上說是通過比較文件的長度。

 

所以,處理文件可以寫成下面這樣:

 

int c;

while ((c = fgetc(fp)) != EOF) {

do something

}

 

這樣寫有一個問題。fgetc()不僅是遇到文件結尾時返回EOF,而且當發生錯誤時,也會返回EOF。因此,C語言又提供了feof()函數,用來保證確實是到了文件結尾。上面的代碼feof()版本的寫法就是:

 

int c;

while (!feof(fp)) {

c = fgetc(fp);

do something;

}

 

但是,這樣寫也有問題。fgetc()讀取文件的最后一個字符以后,C語言的feof()函數依然返回0,表明沒有到達文件結尾;只有當fgetc()向后再讀取一個字符(即越過最后一個字符),feof()才會返回一個非零值,表示到達文件結尾。

 

所以,按照上面這樣寫法,如果一個文件含有n個字符,那么while循環的內部操作會運行n+1次。所以,最保險的寫法是像下面這樣:

 

int c = fgetc(fp);

while (c != EOF) {

do something;

c = fgetc(fp);

}

if (feof(fp)) {

printf("\n End of file reached.");

} else {

printf("\n Something went wrong.");

}

 

除了表示文件結尾,EOF還可以表示標準輸入的結尾。

 

int c;

while ((c = getchar()) != EOF) {

putchar(c);

}

 

但是,標準輸入與文件不一樣,無法事先知道輸入的長度,必須手動輸入一個字符,表示到達EOF。

 

Linux中,在新的一行的開頭,按下Ctrl-D,就代表EOF(如果在一行的中間按下Ctrl-D,則表示輸出"標準輸入"的緩存區,所以這時必須按兩次Ctrl-D);Windows中,Ctrl-Z表示EOF。(順便提一句,Linux中按下Ctrl-Z,表示將該進程中斷,在后臺掛起,用fg命令可以重新切回到前臺;按下Ctrl-C表示終止該進程。)

 

那么,如果真的想輸入Ctrl-D怎么辦?這時必須先按下Ctrl-V,然后就可以輸入Ctrl-D,系統就不會認為這是EOF信號。Ctrl-V表示按"字面含義"解讀下一個輸入,要是想按"字面含義"輸入Ctrl-V,連續輸入兩次就行了。

 

------分隔線----------------------------
    ?分享到??
看看啦
主站蜘蛛池模板: 怡红院AV一区二区三区| 国产精品女同一区二区| 中文字幕一区二区三区人妻少妇| 亚洲Av无码国产一区二区| 日韩视频一区二区三区| 久久久久人妻一区精品| 日本精品啪啪一区二区三区| 亚洲中文字幕久久久一区| 麻豆AV一区二区三区| 无码精品人妻一区二区三区漫画| 不卡一区二区在线| 一区二区三区免费高清视频| 国产一区二区在线观看视频| 海角国精产品一区一区三区糖心| 精品香蕉一区二区三区| 成人中文字幕一区二区三区| 亚洲国产福利精品一区二区| 日韩精品乱码AV一区二区| 一区二区三区四区视频| 无码国产精品一区二区免费模式 | 亚洲熟妇AV一区二区三区浪潮| 久久se精品动漫一区二区三区| 国产一区二区在线观看app| 成人无码一区二区三区| 91精品一区国产高清在线| 国产色精品vr一区区三区| 国模精品一区二区三区| 一区二区视频传媒有限公司| 日韩欧国产精品一区综合无码| 亚洲AV综合色一区二区三区| 色欲综合一区二区三区| 国产精品福利一区二区久久| 亚洲AV无码一区二区三区电影| 最新中文字幕一区二区乱码 | 久久一区二区三区精品| 99精品国产一区二区三区不卡| 国产乱人伦精品一区二区| 无码午夜人妻一区二区不卡视频 | 日本美女一区二区三区| 一区二区三区国模大胆| 成人日韩熟女高清视频一区|