Ответ 1
Двоичные файлы будут представлять собой последовательности 8-битных байтов с точно заданным размером в любой системе, которую вы, скорее всего, будете использовать. Но не все системы хранят файлы таким образом, а стандарт C тщательно разработан, чтобы обеспечить переносимость систем с необычными характеристиками.
Например, соответствующая реализация C может выполняться в операционной системе, которая хранит файлы в виде последовательностей 512-байтовых блоков без указания того, сколько байтов последнего блока значимо. В такой системе, когда создается двоичный файл, ОС может заполнить остаток последнего блока нулевыми байтами. Когда вы читаете из такого файла, байты заполнения могут либо появляться на входе (даже если они никогда не были явно записаны в файл), либо они могут быть проигнорированы (даже если программа, которая создала файл, могла писать их явно).
Если вы читаете из потока, недоступного для поиска (например, ввод с клавиатуры), то fseek(file, 0, SEEK_END)
не просто даст вам плохой результат, он будет показывать отказ, возвращая ненулевой результат. (В POSIX-совместимых системах он возвращает -1 и устанавливает errno
; ISO C этого не требует.)
В большинстве систем fseek(file, 0, SEEK_END)
в двоичном файле будет либо искать фактический конец файла (позиция, определяемая точно количеством байтов в файле), либо возвращать четкую индикацию отказа. Если вы все равно используете POSIX-специфические функции, вы можете смело предположить это поведение; вы, вероятно, можете сделать то же предположение для Windows и ряда других систем. Если вы хотите, чтобы ваш код был на 100% переносимым в экзотические системы, вы не должны предполагать, что двоичные файлы не будут дополняться дополнительными нулевыми байтами.