fread返回值0 feof返回值為16 問題解決。


寫的一個程序,要從二進制文件中讀取,但是我讀取到11396字節的時候 fread返回0,其feof(fp)==16

百度百科看到:

  feof(fp)有兩個返回值:如果遇到文件結束,函數feof(fp)的值為非零值,否則為0。
  EOF是文本文件結束的標志。在文本文件中,數據是以字符的ASCⅡ代碼值的形式存放,普通字符的ASCⅡ代碼的范圍是32到127(十進制),EOF的16進制代碼為0x1A(十進制為26),因此可以用EOF作為文件結束標志。
  當把數據以二進制形式存放到文件中時,就會有-1值的出現,因此不能采用EOF作為二進制文件的結束標志。為解決這一個問題,ASCI C提供一個feof函數,用來判斷文件是否結束。feof函數既可用以判斷二進制文件又可用以判斷文本文件。
  “C”語言的“feof()”函數和數據庫中“eof()”函數的運做是完全不同的。數據庫中“eof()”函數讀取當前指針的位置,“C”語言的“feof()”函數返回的是最后一次“讀操作的內容”。多年來把“位置和內容”相混,從而造成了對這一概念的似是而非。

第一句話 真是誤導人啊,我明明沒到文件結束,卻返回非0.

繼續看,原來根據讀入的如果是 0x1A 就是feof非0 靠,我一看我的11396-8 字節,正是0x1A。

怎么辦呢?

我的fp是這么fopen的

fopen(this->relativeRoadIDFileName,"r");

r 改成 rb 即可。終於明白了,本以為 b 沒啥用呢。。對了 在linux下 b 應該沒用。 所以 這個情況 只在非posix環境下才是的。

這是  fopen 百度百科 里面 說的。

所以百度百科 feof里面 應該 有三種返回值 0 1 非0和1的。

 

 

 

還有 fread第二個參數,如果 實際沒有讀取那么多,則fread返回值 則可能小於 count。見:

http://yijiuzai.blog.163.com/blog/static/1037567272010417103312770/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM