Поведение fseek с SEEK_END и положительным смещением? - PullRequest
0 голосов
/ 17 апреля 2019

Допустим, у нас есть файл "x", содержащий строку "0123456789".

Мы открываем файл и имеем дескриптор файла fd.

Мы можем сделать read(fd, some_buffer, 5)чтобы прочитать 5 значений в буфер из файла.

Аналогично, мы можем использовать fseek для перемещения указателя на отдельные записи в файле.

Мой вопрос: каково поведениеfseek когда мы использовали SEEK_END с положительным смещением?Это поведение не определено, или оно переносится в начало содержимого файла?

Итак, если бы мы сделали fseek(fd, 5, SEEK_END), куда бы указатель указывал сейчас?

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

У меня вопрос, каково поведение 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 на практике не делает никаких различий между текстовым и двоичным потоками.

0 голосов
/ 17 апреля 2019

Почему бы не прочитать документацию ?

POSIX позволяет искать за пределами существующего конца файла. Если вывод выполняется после этого поиска, любое чтение из пробела вернет ноль байт. Где поддерживается файловой системой, это создает разреженный файл.

...