Я сократил проблему до следующей базовой функции, которая должна просто печатать количество байтов в файле.
Когда я выполняю его для файла размером 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);
}
2^32 + 520093696 = 4815060992
Но это должно работать, видя, что ваш n имеет тип__int64
--- что бы это ни было :) - person pmg   schedule 27.10.2010