解決方法
總結最近乙個大一的朋友找我說是不會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...