Безопасное максимальное количество записей, прочитанных фредом - PullRequest
6 голосов
/ 30 августа 2011

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

fread(file, 4, 100000, data);

надежно завершается с ошибкой «Неверный аргумент», но 10 вызовов

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

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

Ответы [ 2 ]

7 голосов
/ 30 августа 2011

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

1 голос
/ 30 августа 2011

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

...