Хорошо, я читал о fread () [который возвращает тип size_t] и видел несколько постов, касающихся больших файлов и некоторых проблем, которые были у других, - но у меня все еще есть некоторые проблемы. Эта функция передает указатель файла и long long int. Lld из main, где я использую другую функцию для получения фактического размера файла, который составляет 6448619520 байт.
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-2 ГБ, и он работает нормально, однако, когда я тестирую его на файле 6 ГБ, в буфер ничего не зачитывается. Не обращайте внимания на другие результаты (фокусируйтесь на жирном шрифте для результатов), проблема заключается в чтении данных BFR. Вот некоторые результаты, которые я получаю.
1-й файл размером 735844352 байта (700 + МБ)
root @ redbox: / data / projects / C / stubs / # ./testrun -x 45004E00 -i /data/Helix2008R1.iso
Файл изображения: /data/Helix2008R1.iso
шестнадцатеричная строка = 45004E00
> Общий размер файла: 735844352
размер файла в буфере получения: 735844352
результат = 735844352
**
Начните анализ шестнадцатеричного значения командной строки: 45004E00
Общее количество байтов в шестнадцатеричной строке: 4
Результаты поиска в шестнадцатеричной строке:
Шестнадцатеричная строка 45004E00 была найдена в расположении байта: 37441
Шестнадцатеричная строка 45004E00 была найдена в байтовом местоположении: 524768
....
Запуск # 2 для файла 6 ГБ:
root @ redbox: / data / projects / C / stubs / # ./testrun -x BF1B0650 -i /data/images/sixgbimage.img
Файл изображения /data/images/sixgbimage.img
шестнадцатеричная строка = BF1B0650
Общий размер файла: 6448619520
размер файла в буфере выделения: 6448619520
результат = 0
Не удалось прочитать файл
Я до сих пор не уверен, почему это происходит с большими файлами, а не с маленькими, это проблема> 4 ГБ. Я использую следующее:
/* Support Large File Use */
#define _LARGEFILE_SOURCE 1
#define _LARGEFILE64_SOURCE 1
#define _FILE_OFFSET_BITS 64
Кстати, я использую Ubuntu 9.10 box (ядро 2.6.x). ТИА.