C語言EOF如何使用
如果EOF是一個特殊字符,那麼假定每個文本文件的結尾都有一個EOF(也就是-1),還是可以做到的,因為文本對應的ASCII碼都是正值,不可能有負值。但是,二進制文件怎麼辦呢?怎麼處理文件內部包含的-1呢?下面是小編為大家帶來的關於C語言EOF如何使用的知識,歡迎閲讀。
存在問題:
又一次遇到有人問EOF的用法,到底如何來使用那?
解決方案:
這裏有一篇文章寫的不錯,希望對EOF沒有理解的同學能有所幫助。
我學習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("End of file reached.");
} else {
printf("Something went wrong.");
}
除了表示文件結尾,EOF還可以表示標準輸入的結尾。
int c;
while ((c = get)) != EOF) {
putc);
}
但是,標準輸入與文件不一樣,無法事先知道輸入的長度,必須手動輸入一個字符,表示到達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,連續輸入兩次就行了。
-
2017年3月計算機二級C語言考試摸底測試題
以下是yjbys考試網小編整理的2017年3月計算機二級C語言考試摸底測試題,希望對大家有所幫助,祝大家計算機二級考試順利通過。一、選擇題(每小題1分。)(1)程序流程圖中帶有箭頭的線段表示的是()。A.圖元關係B.數據流C.控制流D.調用關係(2)結構化程序設計的基本原則...
-
C語言if else語句彙總
對於很多情況,順序結構的代碼是遠遠不夠的,大家都接觸過C語言吧,下面是小編為大家整理的C語言ifelse語句,希望對大家有所幫助。C語言ifelse語句在C語言中,使用if和else關鍵字對條件進行判斷。請先看下面的代碼:#includeintmain(){intage;printf("請輸入你的年齡:");sc...
-
C語言精選面試題詳解
C語言是IT編程中最基礎的語言,在面試中,基本可以忽略又或者格外重要。下面是小編為大家整理的C語言精選面試題詳解,歡迎參考~分析這些面試題,本身包含很強的趣味性;而作為一名研發人員,通過對這些面試題的深入剖析則可進一步增強自身的內功。試題1:以下是引用片段:voi...
-
2017年計算機二級考試C語言備考題及答案
計算機二級對於很多考生來説還是比較有難度的,那麼怎樣順利通過二級考試呢?這就需要大家平時多練習和找方法了。以下是本站小編整理的2017年計算機二級考試C語言備考題及答案,希望對大家有幫助!1.(A)是構成C語言程序的基本單位。A、函數B、過程C、子程序D、子例...