У меня вопрос, каково поведение fseek
, когда мы использовали SEEK_END
с положительным смещением? Это поведение не определено, или оно переносится
к началу содержимого файла?
Если поток является текстовым потоком, то для языка C поведение не определено, поскольку стандарт определяет, что:
Для текстового потока либо offset
должно быть равно нулю, либо offset
должно быть
значение, возвращаемое ранее успешным вызовом функции ftell
в потоке, связанном с тем же файлом, и whence
должен быть
SEEK_SET
.
( C2011, 7.21.9.2/4). Не определено поведение для комбинации ненулевого смещения и SEEK_END
.
Для двоичного потока
новая позиция, измеренная в символах от начала
файл, получается путем добавления смещения в положение, указанное
whence
( C2011, 7.21.9.2/3), поэтому нет, это абсолютно не оборачивается. Стандарт гласит, что
Бинарный поток не обязательно должен поддерживать fseek
вызовы с
откуда значение SEEK_END
, поэтому такой вызов, который вы описываете, может (определенно) просто потерпеть неудачу, возвращая код ошибки. Однако, если это все-таки удастся - и с некоторыми реализациями можно ожидать, что это будет сделано для некоторых потоков - тогда это приведет к тому, что позиция файла окажется за концом файла. Попытки чтения в такой позиции должны иметь такой же результат, как если бы позиция была в EOF. Попытки записи имеют поведение, зависящее от режима открытия файла (все записи в потоки, открытые в режиме добавления, переходят в текущий конец файла) и от реализации.
Например, в системе POSIX реализация системы C указана, чтобы разрешить позиционирование потоков, связанных с обычными файлами, после конца файла, и успешная запись в такую позицию ведет себя так, как если бы байты со значением 0 были записаны в все позиции между этим и предыдущим концом файла. Кроме того, POSIX на практике не делает никаких различий между текстовым и двоичным потоками.