feof (函式名)
c語言函式
- 中文名
- Fenton
- 類 型
- c語言函式
- 功 能
- 檢測流上的檔案結束符
- 用 法
- int feof(FILE *stream);
函式名
編輯feof
功 能
編輯檢測流上的檔案結束符
The function feof() tests the end-of-file indicator for the stream
pointed to by stream, returning non-zero if it is set. The end-of-file
indicator can only be cleared by the functionclearerr().
如果檔案結束,則返回非0值,否則返回0,檔案結束符只能被clearerr()清除。
用 法
編輯int feof(FILE *stream);
程式例
編輯
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include<stdio.h> int main( void ) { FILE *stream; /*openafileforreading*/ stream = fopen ( "DUMMY.FIL" , "r" ); /*readacharacterfromthefile*/ fgetc (stream); /*checkforEOF*/ if ( feof (stream)) printf ( "We have reached the end of file\n" ); /*closethefile*/ fclose (stream); return 0; } |
feof(fp)有兩個返回值:如果遇到檔案結束,函式feof(fp)的值為非零值,否則為0。
EOF是文字檔案結束的標誌。在文字檔案中,資料是以字元的ASCⅡ程式碼值的形式存放,普通字元的ASCⅡ程式碼的範圍是32到127(十進位制),EOF的16進位制程式碼為0xFF(十進位制為-1),因此可以用EOF作為檔案結束標誌。[1]
當把資料以二進位制形式存放到檔案中時,就會有-1值的出現,因此不能採用EOF作為二進位制檔案的結束標誌。為解決這一個問題,ASCI C提供一個feof函式,用來判斷檔案是否結束。feof函式既可用以判斷二進位制檔案又可用以判斷文字檔案。
“C”語言的“feof()”函式和資料庫中“eof()”函式的運作是完全不同的。資料庫中“eof()”函式讀取當前指標的位置,“C”語言的“feof()”函式返回的是最後一次“讀操作的內容”。多年來把“位置和內容”相混,從而造成了對這一概念的似是而非。
那麼,位置和內容到底有何不同呢?舉個簡單的例子,比如有人說“你走到火車的最後一節車箱”這就是位置。而如果說“請你一直向後走,摸到鐵軌結束”這就是內容。也就是說用內容來判斷會“多走一節”。這就是完全依賴於“while(!feof(FP)){...}”進行檔案複製時,目標文件總會比源文件“多出一些”的原因。
在“C”檔案讀取操作時不能完全依賴於“while(!feof(FP)){...}”的判斷。下面程式碼是改進後的程式碼,該程式碼執行後output檔案內容和input檔案內容一致,與使用“while(!feof(FP)){...}”相比,output檔案的結尾符號(EOF)沒有被讀入到input檔案中。
//main.c linux 下編譯通過、vc下也行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#include <stdlib.h> #include <stdio.h> int main( void ) { FILE *in, *out; int ch; if ((in = fopen ( "./output.txt" , "r" ))== NULL) //input.txt must exist in current directory. { fprintf (stderr, "Cannot open inputfile\n" ); exit (0); } if ((out= fopen ( "./input.txt" , "w" ))==NULL) { fprintf (stderr, "Can not open the file.\n" ); exit (0); } while (1) { ch= fgetc (in); if (ch == -1) break ; fprintf (stdout, "The ASC of char %c is %d\n " ,ch,ch); fputc (ch,out); } fclose (in); fclose (out); return 0; } |
與EOF的區別
在stdio.h中可以看到如下定義:
1
2
3
4
5
6
7
8
9
|
#define EOF (-1) #define _IOEOF 0x0010 #define feof(_stream) ((_stream)->_flag & _IOEOF) int c; while (! feof (fp)) { c = fgetc (fp); printf ( "%X\n" , c); } |
會發現多輸出了一個FF,原因就是在讀完最後一個字元後,fp->flag仍然沒有被置為_IOEOF,因而feof()仍然沒有探測到檔案結尾。直到再次呼叫fgetc()執行讀操作,feof()才能探測到檔案結尾。這樣就多輸出了一個-1(即FF)。
正確的寫法應該是:
1
2
3
4
5
6
7
|
int c; c = fgetc (fp); while (! feof (fp)) { printf ( "%X\n" , c); c = fgetc (fp); //最後一個c的值為-1,但是無妨,因為其他所有的迴圈操作都要放在此句話上面 } |
feof()可以用EOF代替嗎?不可以。fgetc返回-1時,有兩種情況:讀到檔案結尾或是讀取錯誤。因此我們無法確信檔案已經結束, 因為可能是讀取錯誤! 這時我們需要feof()。
相關文章
- 函式名/函式地址/函式指標函式指標
- 檔案檢測函式 feof, ferror,clearerr C庫函式函式Error
- (JavaScript)函式名裡有什麼?JavaScript函式
- perl根據函式名動態呼叫函式
- JavaScript 變數名和函式名相同JavaScript變數函式
- 函式名作為引數傳遞 與 回撥函式函式
- 取得某一dll所有輸出函式名 (轉)函式
- Python透過函式名呼叫函式的幾種場景Python函式
- Python 如何將一變數做為函式名?Python變數函式
- javascript變數名和函式名相同如何處理JavaScript變數函式
- c++進階(二)函式呼叫約定及函式名稱修飾符C++函式
- pytest-根據類或函式名選擇用例函式
- JS 中函式名後面加與不加括號的區別JS函式
- 用symbol來獲得ShadowSSDT的原始地址和函式名Symbol函式
- 通過EPROCESS獲取程式名
- 透過程式名稱查詢tcode
- Lua中如何實現類似gdb的斷點除錯—07支援通過函式名稱新增斷點斷點除錯函式
- shell指令碼按照程式名稱殺死程式指令碼
- windows下檢視埠占用以及程式名稱Windows
- Shell 根據程式名字找到程式號並kill
- argv[0]在什麼情況下不等於程式名
- 檢查特定埠上正在執行的程式名(轉)
- 【轉】設定Qt應用程式圖示及應用程式名QT
- 微軟公佈Win10手機版正式名稱:Windows 10 Mobile微軟Win10Windows
- 小程式名片,讓你徹底告別伸手遞名片的煩惱!
- 關於 SAP UI5 XML 檢視裡控制元件事件處理函式名稱中的 . (點號) 問題的討論試讀版UIXML控制元件事件函式
- linux平臺下C語言按程式名查詢程式號pidLinuxC語言
- 直播軟體開發,Android實現根據程式名殺死特定程式Android
- 百問百答第39期:如何區分docker容器中的程式名稱?Docker
- 100美元筆記本全在中國生產 正式名稱為人人電腦筆記
- 速看!2021 年 Google 最熱門 Chrome 擴充套件程式名單出爐!GoChrome套件
- 小程式名稱可以和公眾號同名-微信小程式開發-視訊教程5微信小程式
- Win10系統總是彈出錯誤應用程式名稱SearchIndexer.exe如何解決Win10Index
- MySQL函式大全(字串函式,數學函式,日期函式,系統級函式,聚合函式)MySql函式字串
- Oracle 函式大全(字串函式,數學函式,日期函式,邏輯運算函式,其他函式)Oracle函式字串
- python中id()函式、zip()函式、map()函式、lamda函式Python函式
- 【函式】Oracle函式系列(2)--數學函式及日期函式函式Oracle
- Python 擴充之特殊函式(lambda 函式,map 函式,filter 函式,reduce 函式)Python函式Filter