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)容是否為空,換句話說(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ù)特性讀寫文件
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ù),如果大于的話,就說(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è)就稱作為文件錯(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語(yǔ)言與Java中二叉樹的三種非遞歸遍歷方式
二叉樹是一種非常重要的數(shù)據(jù)結(jié)構(gòu),很多的數(shù)據(jù)結(jié)構(gòu)都是基于二叉樹的基礎(chǔ)演變過(guò)來(lái)的。二叉樹的前,中,后3種遍歷方式,因?yàn)闃涞亩x本身就是遞歸定義的,所以采用遞歸的方法來(lái)實(shí)現(xiàn)是很簡(jiǎn)單的2021-09-09
C++高性能服務(wù)器框架之協(xié)程調(diào)度模塊
這篇文章主要介紹了C++高性能服務(wù)器框架中的協(xié)程調(diào)度模塊,文中通過(guò)代碼示例介紹的非常詳細(xì),對(duì)我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-06-06
C++ STL 進(jìn)階:手寫 priority_ueue 與仿函數(shù)機(jī)制詳解
本文介紹了C++標(biāo)準(zhǔn)庫(kù)中的priority_queue(優(yōu)先級(jí)隊(duì)列)及其實(shí)現(xiàn)原理,同時(shí)通過(guò)代碼示例展示了仿函數(shù)在排序算法和條件判斷中的實(shí)際應(yīng)用,感興趣的朋友一起看看吧2026-05-05
C語(yǔ)言中關(guān)于庫(kù)函數(shù) qsort 快排的用法
快速排序Qsort是所有學(xué)習(xí)算法和數(shù)據(jù)結(jié)構(gòu)最基礎(chǔ)的一個(gè)部分,也是考試題和面試的一個(gè)小重點(diǎn)。本片文章帶你了解Qsort的詳細(xì)用法規(guī)則2021-09-09
怎么通過(guò)C語(yǔ)言自動(dòng)生成MAC地址
以下是對(duì)使用C語(yǔ)言自動(dòng)生成MAC地址的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-09-09
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之使用鏈表模擬棧的實(shí)例
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之使用鏈表模擬棧的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-08-08
用C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)掃雷小游戲
這篇文章主要為大家詳細(xì)介紹了用C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
C語(yǔ)言庫(kù)函數(shù)getchar()新見(jiàn)解
用getchar()函數(shù)讀取字符串時(shí),字符串會(huì)存儲(chǔ)在輸入緩沖區(qū)中,包括輸入的回車字符,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中g(shù)etchar()的用法以及案例的相關(guān)資料,需要的朋友可以參考下2022-07-07
Cocos2d-x學(xué)習(xí)筆記之CCLayerColor層的使用實(shí)例
這篇文章主要介紹了Cocos2d-x學(xué)習(xí)筆記之CCLayerColor層的使用實(shí)例,CCLayerColor是一個(gè)顏色布景層類,本文依然使用Hello World作為例子講解,需要的朋友可以參考下2014-09-09

