Безопасное максимальное количество записей, считываемых fread

Я использую fread для чтения большого куска данных изображения (>1 МБ) из файла. Недавно я столкнулся с ошибкой в MinGW с сетевыми ресурсами Windows, где один вызов fread нравится

fread(file, 4, 100000, data);

сбой надежно с ошибкой" недопустимый аргумент", но 10 вызовов

fread(file, 4, 10000, data); data += 10000;

преуспеть и дать правильный результат. Я делаю вывод, что должен быть максимальный размер для fread, о котором я раньше не знал. Я разделил разрешенный размер fread и обнаружил, что он находится между 31000 и 32000 блоков по 4 байта. Кто-нибудь сталкивался с этим раньше? Это ошибка в MinGW? Есть ли способ определить максимальный "безопасный" размер для fread?

2 ответов


Это известная ошибка в MSVCRT (среда выполнения Microsoft Visual C, которую использует mingw), что fread (и, возможно, также основной _read или что-то еще..?) не в меру долго читал длины. Вы можете разбить чтение на более мелкие части, написать свою собственную версию fread для замены системного (но только при компиляции на сломанных системах!) или переключиться на лучшую среду выполнения (например, cygwin), которая не полна ошибок...


fread() не должен возвращать короткое количество элементов, если не достигнута ошибка чтения или конец файла. Это похоже на ошибку в библиотеке C, с которой вы связываетесь (не MinGW связывается с библиотекой C Microsoft по умолчанию?).