2010-08-29 3 views
16

В последнее время я просматривал много кода, сделанного другими, и случайно заметил, что все функции C шрифта типа printf очень много, но функции C++, изученные в школе (cout, в частности), не кажутся настолько популярными.Являются ли функции ввода-вывода C (printf, sprintf и т. Д.) Более популярными, чем IOStream, и если да, то почему?

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

Спасибо,

R

+9

'Everybody' выглядит немного экстремальным. –

+0

Также смотрите: http://stackoverflow.com/questions/119098/which-io-library-do-you-use-in-your-c-code/119194#119194 –

+0

, которые являются всеми, и вы не должны делать такие широкие предположения. – 2010-08-29 02:04:26

ответ

24

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

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

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

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

+11

+1 для указания различия состояния-без-безгражданства. это действительно хорошо, когда вам не нужно беспокоиться о том, будут ли ваши попытки вывода данных наступать друг на друга. – JustJeff

+6

Следует отметить также, что вы можете использовать флаги стиля printf со строками C++, используя 'boost :: format' – bdonlan

4

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

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

+4

Вы можете использовать потоки с спецификаторами формата printf в формате 'boost :: format', вы знаете :) – bdonlan

+2

Передача' ФАЙЛА * 'в качестве параметра будет такой же простой, как передача параметра« ostream ». Разрешить 'fprintf' писать на консоль или файл. – gwell

+2

@gwell: Последнее, что я проверил, я не могу сделать FILE * писать в буфер памяти. –

5

думаю есть один возможный причина. Лично я нахожу это:

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

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

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

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

+0

странный ответ. Поддержка локалей на самом деле является одной точкой, где iostreams значительно лучше, чем printf * и * не очень сложны в использовании. –

2

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

В, для которых один предназначен лучше, см Who architected/designed C++'s IOStreams, and would it still be considered well-designed by today's standards?

+0

+1 для хорошей перекрестной ссылки. –

0

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

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

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

+1

C++ - достаточно низкий уровень, который можно всегда стрелять в ногу, даже с потоками и «безопасностью типа» - например, 'cout << * (int *) &foo;' На оборотной стороне любой достойный компилятор C выдает предупреждения для типа строки типа 'printf' несоответствуют, поэтому я не думаю, что« безопасность »является допустимым аргументом для одного над другим. С другой стороны, потоки C++ имеют по крайней мере 2 основных недостатка перед 'printf' (особенно' printf' с расширениями расширения XSI): простота перевода сообщений для целей локализации и безгражданство (потенциально большая проблема с потоками). –

+0

Компилятор может проверить только строку формата, если он знает, что такое строка формата. Но одно из преимуществ 'printf' - над iostreams заключается в том, что вы можете настроить строку формата во время выполнения. Таким образом, безопасность типа, по-видимому, кажется мне веским аргументом. –

+3

@R любой достойный компилятор C++ поймает листинг C-стиля и выдаст предупреждение –

1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^