Я никогда особо не использовал потоки ввода-вывода C ++ и всегда выбирал то, что знаю.
т.е. функции printf.
Я знаю, что использование потоков ввода-вывода дает некоторые преимущества, но я ищу несколько советов
от сообщества stackoverflow, чтобы помочь мне (или убедить) переключиться. Потому что я все еще
Я предпочитаю printf, и я думаю, что стиль printf намного легче читать и быстрее набирать.
Я все равно хотел бы ознакомиться с ним, даже если я продолжу использовать printf.
Потоки
Используйте потоки только для ведения журнала. Определение: потоки - это
замена для printf () и scanf ().
Плюсы : С потоками вам не нужно знать тип объекта, который вы
печатают. У вас нет проблем со строками формата не
соответствие списку аргументов. (Хотя с gcc у вас нет этого
проблема с printf тоже.) У потоков есть автоматические конструкторы и
деструкторы, которые открывают и закрывают соответствующие файлы.
Минусы : потоки затрудняют выполнение таких функций, как pread (). Некоторые
форматирование (в частности, идиома строки общего формата%. * s)
сложно, если не невозможно, эффективно использовать потоки без
используя printf-подобные хаки. Потоки не поддерживают изменение порядка оператора
(директива% 1s), которая полезна для интернационализации.
Решение : Не используйте потоки, кроме случаев, когда этого требует ведение журнала
интерфейс. Вместо этого используйте подпрограммы, подобные printf.
Существуют различные плюсы и минусы использования потоков, но в данном случае как
во многих других случаях согласованность важнее дискуссии. Не использовать потоки
в вашем коде.
Расширенное обсуждение
По этому вопросу ведутся дебаты, поэтому это объясняет рассуждения в
большая глубина. Вспомните руководящий принцип «Только один путь»: мы хотим
убедитесь, что всякий раз, когда мы выполняем определенный тип ввода-вывода, код выглядит
то же самое во всех этих местах. Из-за этого мы не хотим позволять
пользователи могут выбирать между использованием потоков или использованием printf plus
Чтение / запись / и т. Д. Вместо этого мы должны остановиться на одном или другом. Мы сделали
исключение для ведения журнала, потому что это довольно специализированный
приложения, и по историческим причинам.
Сторонники потоков утверждали, что потоки являются очевидным выбором
из двух, но на самом деле проблема не так ясна. Для каждого
преимущество потоков, которые они указывают, есть эквивалент
недостаток. Самым большим преимуществом является то, что вам не нужно знать
тип печатаемого объекта. Это справедливый момент. Но,
есть обратная сторона: вы легко можете использовать неправильный тип, и
компилятор вас не предупредит. Такую ошибку легко сделать
не зная, когда используются потоки.
cout
Компилятор не выдает ошибку, потому что
Некоторые говорят, что форматирование printf некрасиво и трудно читается, но потоки
часто не лучше. Рассмотрим следующие два фрагмента, оба с
та же опечатка. Что легче обнаружить?
cerr bar () -> hostname.first
bar () -> hostname.second bar () -> hostname.first, foo-> bar () -> hostname.second,
strerror (ошибка));
И так далее и тому подобное по любому вопросу, который вы могли бы поднять. (Вы могли бы возразить: "Все будет
будь лучше с
правильные обертки ", но если это верно для одной схемы, не правда ли,
для другого? Также помните, что цель - сделать язык
меньше, не добавлять еще больше механизмов, которым кто-то должен научиться.)
Любой из этих путей принесет разные преимущества и недостатки, и
явно лучшего решения не существует. Доктрина простоты
мандаты мы выбираем по одному из них, и решение большинства
был на printf + чтение / запись.