Я никогда не использовал много потоков ввода-вывода С++ и всегда выбирал то, что знаю. т.е. функции printf.
Я знаю, что есть некоторые преимущества использования потоков ввода-вывода, но я ищу несколько советов из сообщества stackoverflow, чтобы помочь мне (или убедить меня) переключиться. Потому что я все еще предпочитаю printf, и я думаю, что стиль printf намного проще читать и быстрее печатать.
Я все еще хотел бы быть знаком с ним, даже если я все еще продолжаю использовать printf.
Изменить. Интересно, что стиль кодирования Google С++ запрещает использование потоков, кроме ведения журнала. См.: http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml
Струйные
Использовать потоки только для ведения журнала. Определение: потоки являются замена для printf() и scanf().
Плюсы. С потоками вам не нужно знать тип объекта, который вы печать. У вас нет проблем с форматированием строк, а не сопоставляя список аргументов. (Хотя с gcc у вас нет этого проблема с printf.) В потоках есть автоматические конструкторы и деструкторы, которые открывают и закрывают соответствующие файлы.
Минусы. Потоки затрудняют выполнение таких функций, как pread(). Некоторые форматирование (в частности, идиома строки общего формата%. * s) трудно, если не невозможно, эффективно использовать потоки без используя printf-подобные хаки. Потоки не поддерживают переупорядочение операторов (директива% 1s), которая полезна для интернационализации.
Решение. Не используйте потоки, кроме случаев, когда это необходимо для ведения журнала. интерфейс. Вместо этого используйте printf-подобные подпрограммы.
Существуют различные плюсы и минусы использования потоков, но в этом случае, поскольку во многих других случаях согласованность превзошла дискуссию. Не использовать потоки в вашем коде.
Расширенная дискуссия
В этом вопросе шла дискуссия, поэтому это объясняет большая глубина. Напомним принцип "Единственный путь": мы хотим убедитесь, что всякий раз, когда мы выполняем определенный тип ввода-вывода, код выглядит то же самое во всех этих местах. Из-за этого мы не хотим позволять пользователи могут выбирать между использованием потоков или использованием printf plus Чтение/запись/и т.д.. Вместо этого мы должны согласиться на том или ином. Мы сделали исключение для ведения журнала, потому что это довольно специализированный приложения и по историческим причинам.
Сторонники потоков утверждают, что потоки - это очевидный выбор из двух, но вопрос на самом деле не так ясен. Для каждого преимущества потоков, которые они указывают, есть эквивалент недостаток. Самое большое преимущество в том, что вам не нужно знать тип объекта, подлежащего печати. Это справедливый вопрос. Но, есть недостаток: вы можете легко использовать неправильный тип, и компилятор не предупредит вас. Легко сделать такую ошибку не зная при использовании потоков.
cout << this; // Prints the address cout << *this; // Prints the contents
Компилятор не генерирует ошибку, поскольку < < < был перегружен. Мы препятствуем перегрузке именно по этой причине.
Некоторые говорят, что форматирование printf является уродливым и трудночитаемым, но потоки часто не лучше. Рассмотрим следующие два фрагмента, как с такой же опечатка. Что легче обнаружить?
cerr << "Error connecting to '" << foo->bar()->hostname.first << ":" << foo->bar()->hostname.second << ": " << strerror(errno); fprintf(stderr, "Error connecting to '%s:%u: %s", foo->bar()->hostname.first, foo->bar()->hostname.second, strerror(errno));
И так далее и т.д. для любой проблемы, которую вы можете вызвать. (Вы могли бы утверждать: "Вещи быть лучше с правые обертки", но если это верно для одной схемы, не правда ли это для другого? Кроме того, помните, что цель состоит в том, чтобы сделать язык меньше, не добавляйте еще больше машин, которые кто-то должен изучить.)
Любой путь привел бы к разным преимуществам и недостаткам, и нет четкого решения. Доктрина простоты мандаты мы урегулируем на одном из них, хотя, и решение большинства был на printf + read/write.