Intereting Posts
Неопределенная ссылка на t1sl_steup_key_block при связывании OpenSSL Предоставляет ли C ++ параметр VLA как параметр функции Любые ссылки на анализ динамического кода? «Нажать любую клавишу для продолжения» в C неопределенная ссылка на `getline ‘в c Чтение текстового файла до определенного символа SIGIO, прибывающий для файловых дескрипторов, я не установил его и когда нет возможности ввода-вывода Как читать звездочку (*) в качестве аргумента из командной строки в C Предоставление двух аргументов опции командной строки с использованием getopt Содействовать использованию C ++ в рамках существующей реализации C Проверка значения argc чтение строк с использованием fscanf Проблема с S_ISDIR () приводит к C (возможно, потому, что stat () не правильно устанавливает свою структуру?) Является ли подразумеваемая декларация функции законной в C89? Понимание ограничителя по примерам

На windowsх _fseeki64 не ищет SEEK_END правильно для больших файлов

Я уменьшил проблему до следующей базовой функции, которая должна просто напечатать количество байтов в файле.

Когда я выполняю его для файла размером 83886080 байт (80 МБ), он печатает правильный номер. Однако для файла 4815060992 байт (4,48 ГБ) он печатает 520093696, что является способом к минимуму.

Кажется, что это связано с опцией SEEK_END, потому что, если я вручную установил указатель на 4815060992 байт (например, _fseeki64(fp, (__int64)4815060992, SEEK_SET) _ftelli64 вернет правильную позицию. Поэтому обходным _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); } 

    В Windows вы должны иметь возможность «перейти на родной язык» и просто использовать GetFileSizeEx() .

    Я бы также посоветовал вам прочитать сгенерированный код, чтобы узнать, может быть, это некоторая 64-битная путаница, которая предотвращает работу вашего кода на основе stdio.

    извините за то, что вы не опубликовали раньше, но я некоторое время занимался другими проектами. Следующее решение работает:

     __int64 nsamples(char* filename) { int fh; __int64 n; /* Open file */ fh = _open( filename, _O_BINARY ); /* Find end of file */ n = _lseeki64(fh, 0, SEEK_END); /* Close file */ _close(fh); return n / sizeof(short); } 

    Для открытия файла фокус использовал _open вместо fopen . Я до сих пор не понимаю, почему это нужно сделать, но, по крайней мере, сейчас это работает. Спасибо всем за ваши предложения, которые в конце концов указали мне в правильном направлении. (это копия ответа на вопрос номер 4003405).