Почему fseek или сброс всегда требуются между чтением и записью в режимах обновления?

Не делать. Используйте StringTemplate вместо этого - нет никакой причины рассмотреть любой другой движок шаблонов, как только Вы знаете об этом.

13
задан Jonathan Leffler 20 August 2017 в 17:31
поделиться

3 ответа

Я попытаюсь подытожить некоторые из уже приведенных здесь пунктов, с которыми я согласен.

Лично я не думаю, что есть ответ "полегче". Существуют веские причины , почему вам не нужен служебный класс, заполненный статическими методами.

Короткий ответ заключается в том, что в объектно-ориентированном мире вы должны использовать объекты и все хорошее, что с ними связано (инкапсуляция, полиморфизм).

Полиморфизм

Если метод расчета расстояния между генами варьируется , вы должны примерно (более вероятно, Стратегия ) иметь класс гена для каждого варианта. Инкапсулируйте то, что меняется. В противном случае вы получите несколько «если».

Open For Extension, Закрыт для модификации

. Это означает, что если новый метод расчета расстояния между генами появится в дальнейшем, вы не должны изменять существующий код , а скорее добавить новый . В противном случае вы рискуете сломать то, что уже есть.

В этом случае вам следует добавить новый класс Gene, а не изменять код, написанный в #geneDistance

Скажите, не спрашивайте

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

Тестируемость

Статические методы вполне могут быть легко протестированы изолированно, но в будущем вы будете использовать этот статический метод в других классы. Когда дело доходит до тестирования этих классов на изоляцию, вам будет сложно это сделать. Проверьте параметры setvbuf () и _IOFBF , _IOLBF для этой функции.

fseek () или fflush () требует библиотеки для фиксации буферизованных операций.

Стандарт определяет операцию поиска или сброса как обязательную, чтобы позволить библиотеке использовать некоторые ярлыки; в противном случае для каждой операции ввода-вывода библиотека должна будет проверять, была ли предыдущая операция также операцией чтения (или операцией записи), и запускать сброс сама по себе, если "направление" ввода-вывода изменилось. Со спецификациями как есть, библиотека может предположить, что клиент выполнил поиск / сброс перед изменением направления ввода-вывода.

fseek () или fflush () требуют библиотеки для фиксации буферизованных операций.

Стандарт определяет операцию поиска или сброса как обязательную, чтобы позволить библиотеке использовать некоторые ярлыки; в противном случае для каждой операции ввода-вывода библиотека должна будет проверять, была ли предыдущая операция также операцией чтения (или операцией записи), и запускать сброс сама по себе, если "направление" ввода-вывода изменилось. Со спецификациями как есть, библиотека может предположить, что клиент выполнил поиск / сброс перед изменением направления ввода-вывода.

fseek () или fflush () требуют библиотеки для фиксации буферизованных операций.

Стандарт определяет операцию поиска или сброса как обязательную, чтобы позволить библиотеке использовать некоторые ярлыки; в противном случае для каждой операции ввода-вывода библиотека должна будет проверять, была ли предыдущая операция также операцией чтения (или операцией записи), и запускать сброс сама по себе, если "направление" ввода-вывода изменилось. Со спецификациями как есть, библиотека может предположить, что клиент выполнил поиск / сброс перед изменением направления ввода-вывода.

15
ответ дан 1 December 2019 в 21:38
поделиться

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

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

5
ответ дан 1 December 2019 в 21:38
поделиться

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


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

§7.21.5. приведенный выше список значений аргументов режима), как ввод, так и вывод могут выполняться на связанный поток. Тем не менее, за выходом не должен следовать вход без промежуточный вызов функции fflush или функции позиционирования файла ( fseek , fsetpos или rewind ), и ввод не должен сопровождаться непосредственно выводом без промежуточный вызов функции позиционирования файла, если операция ввода не встречает конец файла. Открытие (или создание) текстового файла в режиме обновления может вместо этого открыть (или создать) двоичный поток в некоторых реализациях.

5
ответ дан 1 December 2019 в 21:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: