1. 程式人生 > >fread讀取大檔案以及返回值問題(轉載)

fread讀取大檔案以及返回值問題(轉載)

今天fread檔案讀取遇到問題,本來很小的一個問題,但是一直沒有注意到,導致花了不少時間除錯,所以寫下來備忘一下。

size_t fread ( 
    void * ptr, 
    size_t size, 
    size_t count, 
    FILE * stream 
);
//Parameters
/*
ptr
Pointer to a block of memory with a minimum size of (size*count) bytes.
size
Size in bytes of each element to be read.
count
Number of elements, each one with a size of size bytes.
stream
Pointer to a FILE object that specifies an input stream.
*/

Return Value


 

The total number of elements successfully read is returned as a size_t object, which is an integral data type.
If this number differs from the count parameter, either an error occured or the End Of File was reached.
You can use either ferror or feof to check whether an error happened or the End-of-File was reached.

---------------------
先複製一段函式定義,這裡首先要注意的是函式返回值的,函式返回的是讀取的元素個數,注意,不一定是讀取的位元組數,當且僅當下面的程式碼時返回的才是讀取的位元組數

fread(ptr, 1, count, fp);

我今天用fread讀檔案時遇到的問題是讀一個1M左右的檔案,總是隻讀取到前面的一部分,比如

numOfItem = fread(fontDotData, 1, allFontSize, fp);


上面的程式碼讀檔案,allFontSize的值是3657728,返回值numOfItem卻是10169

理論上numOfItem應該和allFontSize相等的,問題出在哪裡了呢?

FILE *fp = fopen(fontFilename, "r");

看出問題沒

錯誤原因:
用文字方式打開了二進位制檔案
文字方式讀取二進位制資料, 可能在檔案結束之前將某段資料判定為檔案末尾EOF, 所以結束讀取( 舉個例子, 比如遇到 0x00 0x00 0xff 0xff, 則文字方式方式的檔案流, 認為已經到檔案末尾, 不能讀取)
所以應該用二進位制方式開啟,不會讀到一部分就中斷了
--------------------- 

先看看下面的檔案開啟:
---------------------

FILE *fp = fopen(fontFilename, "rb");

轉載:

  https://blog.csdn.net/sunshineyy85/article/details/7901356