Я бы предпочел согласиться с их основным выводом о том, что вам, как правило, не следует использовать код fseek
/ ftell
непосредственно в основной части вашего кода - но вы , вероятно, не должны используйте fstat
либо. Если вам нужен размер файла, большая часть вашего кода должна использовать что-то с ясным прямым именем, например filesize
.
Теперь, вероятно, лучше лучше реализовать, используя fstat
там, где это возможно, и (например) FindFirstFile
в Windows (наиболее очевидная платформа, где fstat
обычно не будет доступна ).
Другая сторона истории заключается в том, что многие (большинство?) Ограничений на fseek
в отношении двоичных файлов фактически были созданы с помощью CP / M, который явно нигде не сохранял размер файла. Конец текстового файла был сигнализирован с помощью control-Z. Однако для двоичного файла все, что вы действительно знали, это то, какие сектора использовались для хранения файла. В последнем секторе у вас было некоторое количество неиспользованных данных, которые часто (но не всегда) были заполнены нулями. К сожалению, могут быть нули, которые были значительными, и / или ненулевые значения, которые не были значимыми.
Если бы весь стандарт С был написан непосредственно перед его утверждением (например, если бы он был начат в 1988 году и закончился в 1989 году), они, вероятно, полностью проигнорировали бы CP / M. Однако, к лучшему или худшему, они начали работу над стандартом C примерно в 1982 году, когда CP / M все еще широко использовался, и его нельзя было игнорировать. К тому времени, когда СР / М ушла, многие решения уже были приняты, и я сомневаюсь, что кто-то хотел вернуться к ним.
Однако для большинства людей сегодня просто нет смысла - большая часть кода не будет переноситься в CP / M без большой работы; это одна из относительно незначительных проблем, с которыми приходится иметь дело. Создание современной программы, выполняющей только 48 КБ (или около того) памяти как для кода, так и для данных, является намного более серьезной проблемой (наличие максимум мегабайта или около того для запоминающего устройства было бы другой серьезной проблемой) .
CERT имеет одно хорошее замечание: вам, вероятно, следует , а не (как это часто делается), найти размер файла, выделить столько места, а затем предположить, что содержимое файла поместится туда , Несмотря на то, что fseek / ftell даст вам правильный размер с современными системами, эти данные могут устареть к тому моменту, когда вы фактически прочитаете данные, так что вы в любом случае можете переполнить буфер.