Почему fseek или fflush всегда требуются между чтением и записью в режимах обновления? - PullRequest
12 голосов
/ 11 ноября 2009

В: Я пытаюсь обновить файл в место, используя fopen режим "r+", чтение определенной строки и запись вернуть измененную строку, но это не так рабочий.

A: Обязательно позвоните fseek до вы пишете, чтобы искать обратно к начало строки, которую вы пытаетесь перезаписать, и , потому что fseek или fflush всегда требуется между чтение и запись в режиме чтения / записи Режимы "+".

У меня вопрос , почему fseek или fflush всегда требуются между чтением и записью в режимах чтения / записи "+"? Раздел 5.2 Эндрю Кенига C Ловушки и ловушки (1989) упоминали, что это связано с проблемой обратной совместимости. Кто-нибудь может объяснить подробно?

Ответы [ 3 ]

14 голосов
/ 11 ноября 2009

Библиотека буферизует операций ввода и вывода. Посмотрите setvbuf () и параметры _IOFBF, _IOLBF для этой функции. Для fseek () или fflush () требуется библиотека для фиксации буферизованных операций. Стандарт определяет операцию поиска или сброса как обязательную, чтобы позволить библиотеке некоторые сочетания клавиш; в противном случае для каждой операции ввода / вывода библиотека должна была бы проверить, была ли предыдущая операция также операцией чтения (или операцией записи), и инициировать сброс самостоятельно, если изменилось «направление» ввода / вывода.

5 голосов
/ 11 ноября 2009

Потому что это делает код ОС / библиотеки проще. Файловый поток может иметь отдельные буферы read и write , и для обеспечения их постоянной синхронизации потребуются дополнительные усилия. Это будет стоить производительности в те моменты, когда это не нужно.

Поэтому вместо этого программист должен делать это явно, когда это необходимо.

4 голосов
/ 11 ноября 2009

Прочтите Plauger " Стандартная библиотека C ", чтобы узнать, почему различные функции стандартной библиотеки (C89) таковы, какие есть, и, в частности, почему части стандартной библиотеки ввода-вывода они есть. Одна из причин заключается в том, что C работает в самых разных системах и с разными средами; устройства, такие как ленты, вполне могут нуждаться в обработке, отличной от той, с которой вы привыкли думать. Кроме того, в Unix рассмотрим ваше «tty» устройство - оно соединяет клавиатуру и мышь с экраном - три совершенно разных аппаратных элемента. Координация между ними достаточно сложна; правила в стандарте упрощают.


Обратите внимание, что стандарт обязывает это. Это из стандарта C11, ISO / IEC 9899: 2011, но формулировка была похожа в предыдущих выпусках:

§7.21.5.3 Функция fopen

¶7 Когда файл открывается в режиме обновления («+» в качестве второго или третьего символа в Приведенный выше список значений аргументов режима), ввод и вывод могут выполняться на связанный поток. Однако за выводом не следует непосредственно вводить без промежуточный вызов функции fflush или функции позиционирования файла (fseek, fsetpos, или rewind), и за входом не должно следовать непосредственно выход без промежуточный вызов функции позиционирования файла, если только операция ввода не встречает конец файла. Открытие (или создание) текстового файла в режиме обновления может вместо этого открыть (или создать) бинарный поток в некоторых реализациях.

...