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

原文地址:https://www.cnblogs.com/bwbfight/p/9903216.html