Это горячая тема.
Некоторые люди предпочитают использовать ввод-вывод C ++, поскольку они безопасны по типу (вы не можете иметь расхождения между типом объекта и типом, указанным в строке формата) и более естественным образом работают с остальной частью C ++. способ кодирования.
Однако есть и аргументы для функций C IO (мои личные фавориты). Вот некоторые из них:
- Они легче интегрируются с локализацией, поскольку вся локализуемая строка не разбивается на более мелкие строки, а в некоторых случаях локализатор может изменить порядок вставленного значения, переместить их в строку, ...
- Вы можете непосредственно увидеть формат текста, который будет написан (это может быть очень сложно с потоковыми операторами).
- Поскольку встраивания нет, и только один экземпляр функции
printf
, сгенерированный код меньше (это может быть важно во встроенной среде).
- Быстрее, чем функция C ++ в некоторых реализациях.
Лично я не считаю плохой практикой использование C-потока в C ++-коде. Некоторые организации даже рекомендуют использовать их в потоке C ++. То, что я считаю плохим стилем - это использовать оба в одном проекте Думаю, здесь важна последовательность.
Как уже отмечалось, в относительно большом проекте вы, вероятно, не будете использовать их напрямую, но вы будете использовать набор функций-оболочек (или классов), которые лучше всего соответствуют вашему стандарту кодирования и вашим потребностям (локализация, типа безопасность, ...). Вы можете использовать тот или иной интерфейс ввода-вывода для реализации этого интерфейса более высокого уровня, но, вероятно, вы будете использовать только один.
Редактирование: добавление некоторой информации о преимуществах семейства функций форматирования printf
, связанных с локализацией. Обратите внимание, что эта информация действительна только для некоторых реализаций.
Вы можете использовать %m$
вместо %
для ссылки на параметр по индексу вместо последовательной ссылки на них. Это может быть использовано для изменения порядка значений в отформатированной строке. Следующая программа напишет Hello World!
на стандартный вывод.
#include <stdio.h>
int main() {
printf("%2$s %1$s\n", "World!", "Hello");
return 0;
}
Рассмотрите возможность перевода этого кода на C ++:
if (nb_files_deleted == 1)
stream << "One file ";
else
stream << nb_file_deleted << " files ";
stream << removed from directory \"" << directory << "\"\n";
Это может быть очень сложно. С printf
(и библиотекой типа gettext
для обработки локализации) код не смешивается со строкой. Таким образом, мы можем передать строку команде по локализации, и нам не придется обновлять код, если на каком-то языке есть особый случай (на каком-то языке, если число объектов равно 0, вы используете форму множественного числа, на другом языке, Есть три формы, одна для единственного числа, одна, когда есть два объекта и форма множественного числа, ...).
printf (ngettext ("One file removed from directory \"%2$s\"",
"%1$d files removed from directory \"%2$s\"",
n),
n, dir);