Подтвердить что ты не робот

Являются ли функции ввода-вывода C (printf, sprintf и т.д.) Более популярными, чем IOStream, и если да, то почему?

В последнее время я просматривал много кода, сделанного другими, и случайно заметил, что каждый использует функции C типа printf, но функции С++, изученные в школе (cout, в частности), не кажутся такими популярными.

Является ли это правильным наблюдением, и есть ли причина для этого? Конвенция?

Спасибо,

R

4b9b3361

Ответ 1

Лично я использую printf над файлом iostream (например, cout), потому что я думаю, что он понятнее.

Когда вы делаете форматирование с помощью iostream, вы должны << всевозможные странности, такие как setiosflags и setf. Я никогда не помню, в каком пространстве имен все это живет, не говоря уже о том, что все это делает. Даже когда я это делаю, я разочарован тем, насколько сложным и неинтуитивным выглядит код.

Параметры форматирования с printf могут сначала казаться неразборчивыми, но они краткие, четко документированные на одной странице руководства и общие для широкого диапазона языков.

Другим преимуществом является то, что printf является апатридом: в отличие от cout, мне не нужно помнить, какие функции-члены были вызваны на printf, или какая byzantine concoction из флагов была << 'ed внутрь. Это большой плюс для читаемости.

Ответ 2

Я думаю, что вкус - одна из возможных причин. Лично я нахожу это:

printf("%8d: %s\n", customer->id, customer->name);

более читаемый, чем это:

std::cout << customer->id << ": " << customer->name << std::endl;

Там также проблема с локализацией. printf позволяет изменять форматирование в соответствии с другими языками и культурами пользовательского интерфейса, что становится основной задачей с iostreams, если вы не используете что-то вроде Boost Format.

Ответ 3

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

Лично я использую потоки для большинства всего, потому что они позволяют мне записывать функцию в консоль, файл или строку без необходимости изменять функцию.

Ответ 4

Где я работаю, мы используем форматирование printf. Это связано с тем, что мы активно использовали класс MFC CString и его метод printf -style Format. Мы прекращаем работу с MFC, но не изменили наш подход к форматированию строк.

Что касается лучшего дизайна, см. Кто проектировал или разрабатывал С++ IOStreams и будет ли он по-прежнему считаться хорошо разработанным по сегодняшним стандартам?

Ответ 5

Я собираюсь угадать, что printf более широко используется, потому что

  • он использовался уже довольно много лет, прежде чем появились компиляторы и потоки С++.
  • C используется больше, чем С++
  • было выполнено много операций ввода-вывода для таких вещей, как Windows API, для которых printf является естественным подходом к Open/Read/Write/Close/etc

Ответ 6

Функции семейства printf и scanf имеют две основные проблемы: безопасность и безопасность памяти. Довольно легко сделать несоответствие между строкой спецификации и списком аргументов переменной длины. Кроме того, переполнение буфера через scanf является классической уязвимостью безопасности. Короче говоря, не используйте их.

Потоки С++ обеспечивают безопасность типов и памяти, а также расширяемость форматирования. Они намного мощнее и проще в использовании, чем printf и scanf.

Кроме того, как было предложено ShaderOp, библиотека формата Boost обеспечивает такую ​​же безопасность, но делает старых программистов C более комфортными.