Я сократил проблему до следующей базовой функции, которая должна просто напечатать число байтов в файле.
Когда я выполняю его для файла 83886080 байтов (80 МБ), он печатает правильное число,Однако для файла размером 4815060992 байта (4,48 ГБ) он печатает 520093696, что является слишком низким значением.
Кажется, что-то связано с параметром SEEK_END , потому что если я установлю указатель на4815060992 байта вручную (например, _fseeki64(fp, (__int64)4815060992, SEEK_SET)
_ftelli64
возвращает правильную позицию. Таким образом, обходной путь может быть для получения правильного размера файла без использования SEEK_END , как это сделать?
код скомпилирован в 32-битной системе Windows (отсюда __int64
, _iseeki64
и _ftelli64
) с MinGW.
Короче: что я здесь не так делаю?
void printbytes(char* filename)
{
FILE *fp;
__int64 n;
int result;
/* Open file */
fp = fopen(filename, "rb");
if (fp == NULL)
{
perror("Error: could not open file!\n");
return -1;
}
/* Find end of file */
result = _fseeki64(fp, (__int64)0, SEEK_END);
if (result)
{
perror("Error: fseek failed!\n");
return result;
}
/* Get number of bytes */
n = _ftelli64(fp);
printf("%I64d\n", n);
/* Close file */
fclose(fp);
}