好吧,我一直在讀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