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

fread讀取大文件以及返回值問題(轉載)

whether 個數 diff feof 字節 point fread byte 讀文件

今天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

fread讀取大文件以及返回值問題(轉載)