C語言feof重複讀取的問題

2021-10-03 05:23:00 字數 1503 閱讀 9224

解決方法

總結最近乙個大一的朋友找我說是不會c語言的檔案讀寫,我就想著給他寫個demo,沒想到卻遇到了乙個問題(之前也遇到過,但是沒有記錄下來,現在居然錯了第二次了,所以現在記錄下來)。

用feof來作為迴圈控制條件時會重複讀取一次文字末尾的內容

下面是我寫的錯誤demo:

#include

#include

typedef

struct stu stu,

*p_stu;

intmain

(void

) p2->next =

null

;//寫檔案

file *fp =

fopen

("d:hh.txt"

,"w+");

if(!fp)

exit(0

);p1 = head;

while

(p1)

//讀檔案

rewind

(fp)

;//檔案開頭

stu tmp;

while(!

feof

(fp)

)//就是這裡,會多讀一次

fclose

(fp)

;system

("pause");

return0;

}

第一種解釋:feof並不是返回當前的位置在不在文字末尾,而是返回當前位置後方還有沒有內容。而在文字末尾系統會新增乙個eof標誌來表示文字結束,所以當到eof前時,明明應該停止讀取,但因為當前位置後方還有內容(eof也算內容),所以feof並不是馬上返回非零值,而是下一次才返回非零值,這也就導致最後一次的結果會被列印兩次。

第二種解釋:feof會fread或fgets等函式是否讀取到內容來決定返回值。如果打到文字末尾,fread為空,因此feof作為標誌返回非零。因此在已經讀過一次最後內容的情況下,還會繼續讀取(因為fread讀到了內容,所以feof還是返回0),所以下一次就會再次列印一次結果。也就是我們看到的被重複列印。

解決辦法是將feof換成fread即可(fread返回讀取到的count,而非size,注意)(fgets也可行)

while

(fread

(&tmp,

sizeof

(stu),1

, fp)

)

更改之後程式正常執行。

1.不能用feof判斷文字檔案讀取是否達到文字末尾,用fread或fgets代替。

2.二進位制檔案不能用eof來判斷是否到檔案末尾,因為即使不在末尾也可能出現eof的值(不同系統下eof的值有別),只適用於文字檔案。

3.fread對二進位制檔案和文字檔案均適用

4.文字讀寫模式要記清。w+表示以文字模式開啟檔案(沒有會建立),可以讀出也可以寫入。但是重複開啟原有內容會被清空。

C語言中關於feof的使用問題

當你想讀取文字檔案的全部內容時,卻發現容易出現奇怪的現象或者最後一行重複讀取?細心看完這篇你就知道為什麼了。include define test file test.txt intmain fclose fp return0 輸出結果為 可以看到明明只有三個字元的檔案卻輸出了四行!第四行ascii...

c語言 判斷檔案結束問題 feof

最近做開發的時候用到c語言檔案的讀寫函式fread 採用while feof fp 來控制迴圈,結果發現每次讀取資料的時候總會把最後乙個資料單元讀取兩次,很是不解。後來查詢資料發現,原來fread 在讀到檔案最後乙個位元組時,feof fp 還是為0值,此時while feof fp 的控制條件依然...

Request IO流無法重複讀取的原因和解決方法

歡迎關注驛外殘香 hc的部落格 只能讀一次的原因 首先要知道為什麼httpservletrequest的流只能讀取一次。呼叫httpservletrequest.getinputstream 可以看到獲取的流型別為servletinputstream,繼承inputstream。下面複習下input...