关于fread读取的长度问题

2012年06月20日 分类:学习笔记C++

在使用fread读取一个位图文件的时候,发现总是无法读取后面的一些字节,观察fread的返回值,并不是正确的读取次数,看来是最后几次读取没有成功。

首先查看是否单次读取超出了限制,这是fread的函数原型:

size_t fread(void* buffer,size_t size,size_t count,FILE* stream);

size和count都是size_t类型,在32位系统里就是unsigned int类型, 0 ~ 2^32-1的范围完全够用了。

既然fread的用法没错,那是不是读取的文件问题,替换其他图片,发现有些能全部读取,有些还是不行。看来还是程序问题,参考其他人写的读取代码发现是fopen的问题。fopen读取参数中除了比较常用的r和w之外还有个b,他的意思就是以二进制形式读取。比如像图片这样的二进制文件来说,必须以二进制的形式来读取,否则里面可能会有文件结束符EOF。以文本形式打开的文件在读取时一碰到文件结束符就会停止,这也是我在读取图片文件时不能完全读取的原因。正确的写法如下:

FILE *fp = fopen("test.bmp", "rb"); 
fread(buff,size,count,fp);

下面列出fopen的一些参数,供参考。

‘r’ 只读方式打开,将文件指针指向文件头。
‘r+’ 读写方式打开,将文件指针指向文件头。
‘w’ 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
‘w+’ 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
‘a’ 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
‘a+’ 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
‘x’ 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE
‘x+’ 创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE

每种都可在末尾加b,表示以二进制方式打开。

作者:wuyuan 本文来自Wuyuan's Blog 转载请注明,谢谢! 文章地址: https://wuyuans.com/2012/06/about-the-length-of-fread