背景
在项目中做大文件的增量读写,遇到了问题:
fopen : Value too large for defined data type.
习惯性地根据这个提示查阅的有关资料显示:
1)工具链太老了:海思的工具链我目前找不到更换的方法,也为了稳定性,不再增加新的ulibc库
2)文件系统的 inde是 64位的:查看了 cat /proc/fs/{文件系统类型}/{设备名}/options,发现一切正常
显然,这样的结果并不能让我满足。
Linux C/C++ 大文件读写下编程实现的不同
由于上文的方向不对,于是我换了个思路,直接根据需求查找: "Linux C 读写大文件"
了解到了有关信息:
Linux默认环境下打开、读、写超过2G的文件会返回错误。定义#define _FILE_OFFSET_BITS 64宏可以突破这个限制,对read/write和fread/fwrite同时有效。(注意必须定义在之前。至此,open文件算是没有问题了)
#define _LARGEFILE_SOURCE
#define _LARGEFILE64_SOURCE
#define _FILE_OFFSET_BITS 64
细心的读者肯定注意到了,还有2个宏,这2个宏是与 fpos_t 有关的;而这个 fpos_t 与 操作文件偏移量有关。
传统 偏移操作 : fseek() + ftell()
fseek(fp,0,SEEK_END);
length = ftell(fp);
fse