Могу ли я прочитать с самого начала файл, открытый для режима добавления, без начальной функции fseek ()? - PullRequest
2 голосов
/ 08 мая 2020

Когда существующий непустой файл успешно открывается fopen() в режиме "a+" или "ab+", я должен иметь возможность читать из него или писать до конца без первоначального вызова fseek() или rewind(). Указывает ли стандарт C, что начальное чтение из этого файла будет считываться с начала файла, или я должен всегда устанавливать позицию файла перед чтением?

Стандарт C кажется неоднозначным, как это указано в 7.21.5.2 функция fopen , которая:

6. Открытие файла в режиме добавления (a как первый символ в аргументе mode) заставляет все последующие записи в файл принудительно переходить к текущему концу файла, независимо от промежуточных вызовов функции fseek. В некоторых реализациях открытие двоичного файла в режиме добавления (b в качестве второго или третьего символа в приведенном выше списке из mode значений аргументов) может изначально позиционировать индикатор положения файла для потока за пределами последних записанных данных из-за заполнение пустым символом.

В тех системах, где индикатор положения файла будет указывать на последние записанные данные или за ними, произойдет ли сбой начальной операции чтения?

1 Ответ

1 голос
/ 08 мая 2020

Поведение определяется реализацией:

7.21.3 Файлы

1 Поток связаны с внешним файлом (который может быть физическим устройством) путем открытия файла, что может включать создание нового файла. При создании существующего файла его прежнее содержимое при необходимости удаляется. Если файл может поддерживать запросы позиционирования (например, файл на диске, в отличие от терминала), то индикатор положения файла, связанный с потоком, располагается в начале (номер символа ноль) файла, если только файл не открывается с режим добавления, в этом случае определяется реализацией, находится ли индикатор позиции файла изначально в начале или в конце файла. Индикатор положения файла поддерживается последующими запросами чтения, записи и позиционирования, чтобы упростить упорядоченное перемещение по файлу.

Таким образом, вызов rewind() или fseek(fp, 0L, SEEK_SET) требуется перед начальным чтение с начала файла, открытого для режима обновления / запись до конца, как определено строкой режима, начинающейся с "a+" или "ab+".

...