C語(yǔ)言中feof函數(shù)和ferror函數(shù)示例詳解
前言
或許我們?cè)诰W(wǎng)絡(luò)上看過(guò)有關(guān)于feof函數(shù),都說(shuō)這個(gè)函數(shù)是檢查文件是否已經(jīng)讀取結(jié)束了。但事實(shí)卻并非如此,要想知道更多的細(xì)節(jié),那就往下看看吧!
1. feof
謹(jǐn)記:在讀取文件的過(guò)程中,feof的返回值不是用于判斷文件是否讀取結(jié)束。
feof函數(shù)是判斷文件在讀取的過(guò)程中給是否是遇到了文件結(jié)束標(biāo)志(EOF)。但是文件讀取結(jié)束的原因不僅僅是因?yàn)橛龅搅宋募Y(jié)束標(biāo)志,還可能是因?yàn)橛龅搅烁鞣N文件在讀取過(guò)程中發(fā)生的錯(cuò)誤所導(dǎo)致文件讀取提前結(jié)束的。
很多人誤用這個(gè)函數(shù)來(lái)判斷文件內(nèi)容是否為空,換句話(huà)說(shuō),就是判斷這個(gè)文件是否為空文件!
feof函數(shù)作用:當(dāng)文件讀取結(jié)束時(shí),判斷文件讀取結(jié)束的原因是否是:遇到了文件結(jié)束結(jié)束標(biāo)志
1.1 feof函數(shù)原型
在文件光標(biāo)處遇到文件末尾標(biāo)記時(shí),feof函數(shù)返回一個(gè)非0值,否則返回0值。
1.2 正確利用函數(shù)特性讀寫(xiě)文件
1.2.1 針對(duì)文本文件
對(duì)于文本文件來(lái)說(shuō),文件讀取結(jié)束時(shí)可能會(huì)返回EOF(fgetc),或者返回NULL(fgets)
fgetc
判斷是否為EOFfgets
判斷返回值是否為NULL
1.2.2 針對(duì)二進(jìn)制文件
對(duì)于二進(jìn)制文件來(lái)說(shuō),判斷的方法就比較單一了。用fread函數(shù)。
fread函數(shù)判斷其規(guī)定讀取的個(gè)數(shù)(也就是fread的返回值)是否大于實(shí)際讀取的個(gè)數(shù),如果大于的話(huà),就說(shuō)明文件讀取結(jié)束了。
1.3 feof函數(shù)的原理
feof()原理函數(shù):并不是通過(guò)讀取到文件的EOF來(lái)評(píng)判,這個(gè)文件是否為空。對(duì)feof()來(lái)說(shuō),它的工作原理是,站在光標(biāo)所在位置,向后看看還有沒(méi)有字符。如果有,返回0;如果沒(méi)有,返回非0。它并不會(huì)讀取相關(guān)信息,只是查看光標(biāo)后是否還有內(nèi)容。
1.4 feof函數(shù)實(shí)例演示
#include <stdio.h> #include <stdlib.h> int main(void) { int c; // 注意:int,?char,要求處理EOF FILE* fp = fopen("test.txt", "r"); if (!fp) { perror("File opening failed"); return EXIT_FAILURE; } //fgetc 當(dāng)讀取失敗的時(shí)候或者遇到?件結(jié)束的時(shí)候,都會(huì)返回EOF while ((c = fgetc(fp)) != EOF) // 標(biāo)準(zhǔn)C I/O讀取?件循環(huán) { putchar(c); } printf("\n"); //判斷是什么原因結(jié)束的 if (ferror(fp)) puts("I/O error when reading"); else if (feof(fp)) puts("End of file reached successfully"); fclose(fp); fp = NULL; return 0; }
2. ferror
在講解feof函數(shù)的實(shí)例演示時(shí),在例子中出現(xiàn)了一個(gè)ferror,那這個(gè)函數(shù)又是干嘛的?我們就來(lái)探討一下。
還記得,在講標(biāo)準(zhǔn)流時(shí),提到過(guò)stderr標(biāo)準(zhǔn)錯(cuò)誤流,這是一個(gè)根據(jù)系統(tǒng)遇到錯(cuò)誤,而通過(guò)器編譯器內(nèi)部提早定義的宏自動(dòng)對(duì)應(yīng)上錯(cuò)誤信息。
那么在文件緩沖系統(tǒng)中,自然也有這么一個(gè)設(shè)定??墒撬@個(gè)就沒(méi)有那么智能了。我們把這個(gè)就稱(chēng)作為文件錯(cuò)誤標(biāo)志。
ferror函數(shù)作用:在文件讀取結(jié)束時(shí),檢查是否是因?yàn)橛龅搅宋募e(cuò)誤標(biāo)志。
2.1 ferror函數(shù)原型
ferror的返回值為非0值時(shí),就說(shuō)明遇到了文件錯(cuò)誤標(biāo)志了,否則返回0 。
這個(gè)例子就不過(guò)多展示了,大家可以結(jié)合前面的例子進(jìn)行分析。
總結(jié)
到此這篇關(guān)于C語(yǔ)言中feof函數(shù)和ferror函數(shù)的文章就介紹到這了,更多相關(guān)C語(yǔ)言 feof函數(shù)和ferror函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++利用PCL點(diǎn)云庫(kù)操作txt文件詳解
這篇文章主要為大家詳細(xì)介紹了C++如何利用PCL點(diǎn)云庫(kù)操作txt文件,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下2024-01-01VSCode與Keil聯(lián)合開(kāi)發(fā)STM32的流程
這篇文章主要介紹了VSCode與Keil聯(lián)合開(kāi)發(fā)STM32的流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02C語(yǔ)言中結(jié)構(gòu)體、聯(lián)合體的成員內(nèi)存對(duì)齊情況
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中結(jié)構(gòu)體、聯(lián)合體的成員內(nèi)存對(duì)齊情況的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05Microsoft Visual C++ 6.0開(kāi)發(fā)環(huán)境搭建教程
這篇文章主要為大家詳細(xì)介紹了Microsoft Visual C++ 6.0開(kāi)發(fā)環(huán)境搭建教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04如何為Qt視圖中的文字實(shí)現(xiàn)彩虹漸變效果
這篇文章主要給大家介紹了關(guān)于如何為Qt視圖中的文字實(shí)現(xiàn)彩虹漸變效果的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Qt具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03C語(yǔ)言的動(dòng)態(tài)內(nèi)存管理你了解嗎
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的動(dòng)態(tài)內(nèi)存管理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03C++ 封裝 DLL 供 C# 調(diào)用詳細(xì)介紹
這篇文章主要介紹了C++ 封裝 DLL 供 C# 調(diào)用(以C# 調(diào)用C++ 二次封裝的VLC播放庫(kù)為介質(zhì),支持回調(diào)函數(shù)的封裝),需要的朋友可以參考下面我文章的具體內(nèi)容2021-09-09C基礎(chǔ) mariadb處理的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇C基礎(chǔ) mariadb處理的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06