好吧,我一直在读fread()[它返回一个类型size_t],并看到有关大型文件和其他一些问题的一些问题 - 但我仍然有一些问题。这个函数传入一个文件指针和一个long long int。该lld是从我使用另一个函数获取实际文件大小为6448619520字节的主要位置。fread()在6GB文件失败
char *getBuffer(FILE *fptr, long long size) {
char *bfr;
size_t result;
printf("size of file in allocate buffer: %lld\n", size);
//size here is 6448619520
bfr = (char*) malloc(sizeof(char) * size);
if (bfr == NULL) {
printf("Error, malloc failed..\n");
exit(EXIT_FAILURE);
}
//positions fptr to offset location which is 0 here.
fseek(fptr, 0, SEEK_SET);
//read the entire input file into bfr
result = fread(bfr, sizeof(char), size, fptr);
printf("result = %lld\n", (long long) result);
if(result != size)
{
printf("File failed to read\n");
exit(5);
}
return (bfr);
}
我已经测试过它的面积约为1-2GB的文件,它工作正常,但是,当我测试它6GB的文件中,没有到缓冲区中读取。忽略其他结果(注重结果的粗体),问题在于读取数据bfr。这里是我得到的一些结果。一个文件的
第一即735844352个字节(700 + MB)
根@红盒子:/数据/项目/ C /存根/#./testrun -x 45004E00 -i /数据/ Helix2008R1 .ISO
图像文件是/data/Helix2008R1.iso
十六进制字符串= 45004E00
>文件的总大小:735844352
在GET缓冲文件尺寸:735844352
结果= 735844352
** 开始解析所述命令行十六进制值:45004E00
在十六进制字符串的总字节数:
十六进制字符串45004E00被发现在字节位置:4个十六进制字符串搜索结果:37441
十六进制字符串45004E00被发现在字节位置:524768
....
试验#2针对一个6GB的文件: 根@redbox:/数据/项目/ C /存根/#./testrun -x BF1B0650 -i /data/images/sixgbimage.img
图片文件/data/images/sixgbimage.img
十六进制字符串= BF1B0650
文件的总大小:在文件6448619520
大小分配缓冲区:6448619520
结果= 0
文件无法读取
我仍然不知道为什么它是大文件,而不是失败小一些,这是一个> 4GB的问题。我使用以下内容:
/* Support Large File Use */
#define _LARGEFILE_SOURCE 1
#define _LARGEFILE64_SOURCE 1
#define _FILE_OFFSET_BITS 64
顺便说一句,我使用的是Ubuntu 9.10盒(2.6.x内核)。 TIA。
它是一个32位函数吗? 32位,你只能访问4 GB的字节寻址内存。如果您无法访问超过4GB的任何内容,我怀疑这至少是部分责任。 – 2010-07-20 00:23:08
是的,它是一个32位函数。我猜测这可能是一个> 4GB的问题,仍然在研究如何解决这个问题.. – labgeek 2010-07-20 00:54:36
我正在阅读这个权利吗?你试图一次性读取6GB的文件到RAM中?即使你认为自己有足够的记忆,也不要这样做。像sarnold建议使用mmap。 – 2010-07-20 01:02:26