Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/119: Рейтинг темы: голосов - 119, средняя оценка - 4.88
104 / 94 / 14
Регистрация: 20.06.2010
Сообщений: 966
Записей в блоге: 16

cout vs printf

30.09.2010, 12:17. Показов 25039. Ответов 54
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Что лучше и удобней использывать в написаннии программ? cout или printf?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.09.2010, 12:17
Ответы с готовыми решениями:

Printf() - Cout
Простой вопрос. Как заменить printf ("%09d", a); на cout?

printf > cout
Помогите переделать printf("| %3.2f | %3.1f | %7.5f |\n",a,b,y); на cout.

Cout в printf
Здравствуйте, может кто-нибудь помочь переделать cout в printf на 87-88 строках в данной программе? #include<iostream> ...

54
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.06.2020, 00:14
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Evg Посмотреть сообщение
Глядя на такой код, сразу понятно, переменные каких типов идут в печать, чего не скажешь о cout
А зачем знать их типы? Главное что и куда, а не какого типа.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
27.06.2020, 00:39
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Цитата Сообщение от Neuton Посмотреть сообщение
Но больше всего мне понравился поток stringstream. Хотя есть функция aspprintf, которая делает тоже самое.
Нет, такой функции нет.
... а если бы и была, то была бы лишь фактом, иллюстрирующим гигантскую катастрофическую проблемы всего подхода.

Потоки вывода в С++ полностью инкапсулируют в себе все детали целевого потока вывода, в том числе на уровне run-time полиморфизма, тем самым позволяя нам переисползовать любой код вывода в поток независимо от того, в какой поток мы выводим данные. И количество разнообразных потоков - бесчисленно.

А через механизм printf/sprintf/aspprintf и т.д. ничего подобного невозможно. Любые попытки приблизиться к мощи С++ потоков со стороны printf потребуют тонн, тонн и тонн надстроечного "гамнокода", который фактически сведется к ручной перереализации C++ потоков на стороне С.
0
 Аватар для COKPOWEHEU
4138 / 2716 / 433
Регистрация: 09.09.2017
Сообщений: 12,050
27.06.2020, 00:48
Цитата Сообщение от Croessmah Посмотреть сообщение
Я же думаю, что мы говорим о случае, когда применить можно и то и то.
Согласитесь, задачи вывода "просто текста" и "просто переменных" встречаются гораздо чаще, чем всякие хитрые форматы. Я ведь не говорю, что это не нужно никому и никогда, я говорю что сначала выбирается окружение (грубо говоря, Си или С++), а уже потом идет углубленное изучение выбранного инструмента.
Копать другой инструмент имеет смысл только если текущего уже не хватает, либо не вписывается в окружение.
Цитата Сообщение от hoggy Посмотреть сообщение
много-поточные программы не могут не конкурировать за ввод-вывод в ситуации,
когда осуществлять этот ввод-вывод нужно в разных потоках.
если возникает задача вывода из нескольких потоков одновременно, то в программе что-то не так этот вывод так или иначе придется синхронизировать. Либо блокировка-разблокировка, либо выделить отдельный поток специально для ввода-вывода, а остальные будут общаться через него.
Цитата Сообщение от hoggy Посмотреть сообщение
ты утверждаешь, что "у тебя" UB.
Это утверждение ложно. Я НЕ утверждаю что у меня UB.
Цитата Сообщение от hoggy Посмотреть сообщение
и это несмотря на то, что механизм thread-safe
И еще раз повторю: thread-safe это свойство конкретной реализации.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
есть функция aspprintf, которая делает тоже самое.
Нет, такой функции нет.
Очевидно, имелась в виду гнутая asprintf
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.06.2020, 01:19
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
если возникает задача вывода из нескольких потоков одновременно, то в программе так или иначе придется синхронизировать. Либо блокировка-разблокировка, либо выделить отдельный поток специально для ввода-вывода, а остальные будут общаться через него.
Копетан Очевидность?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Это утверждение ложно. Я НЕ утверждаю что у меня UB.
ты утверждаешь:
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Это UB в обоих вариантах.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Из самых очевидных соображений: используется многопоточный доступ к какому-то ресурсу без малейших попыток синхронизации.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Даже не смотря на то, что в документации printf указано, что он thread-safety
ты осознаешь какой бред несешь?
0
 Аватар для COKPOWEHEU
4138 / 2716 / 433
Регистрация: 09.09.2017
Сообщений: 12,050
27.06.2020, 09:19
hoggy, знаешь, мне уже надоело разжевывать тебе очевидные вещи. Попробуй просто перечитать тред.
1
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
27.06.2020, 11:06
COKPOWEHEU, почему UB, я не понимаю?
Доступ к общему ресурсу из разных потоков всегда носит некоторую неопределённость в порядке доступа, но это не делает его UB. Похоже, что printf получает доступ к консоли (общему ресурсу) один раз на один вызов функции или типа того. А в std доступ к консоли выполняется отдельно в каждом операторе вывода <<.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.06.2020, 12:14
А чем его это его делает? Как воспринимать пользователю кашу из строк?

Добавлено через 1 минуту
Цитата Сообщение от Ygg Посмотреть сообщение
в std доступ к консоли выполняется отдельно в каждом операторе вывода <<.
Наверное зависит от того кода выполняется flush()
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
27.06.2020, 12:48
Цитата Сообщение от Avazart Посмотреть сообщение
А чем его это его делает? Как воспринимать пользователю кашу из строк?
Это логика работы программы, что программист заложил, то и должно быть. Если программист сделал вывод каши, значит будет вывод каши и это не будет никаким UB. Вопрос лишь в том, понимает ли программист как работают базовые функции, которые он использует. Вызов одного printf можно условно считать неделимым. А для std неделимым будет только вызов одного оператора << в выражении.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.06.2020, 13:13
Более вероятнее что до std::endl когда буфер будет сброшен в stdout.
Но вообще это само по себе странный случай писать из разных потоков в консоль без синхронизации.
Главная проблема printf это безопасность, частая ошибка неверный подбор флагов.
Вот интересно будет ли нормальный форматер строк в С++
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
27.06.2020, 13:19
Цитата Сообщение от Avazart Посмотреть сообщение
Но вообще это само по себе странный случай...
Согласен. Иногда можно для отладки что-то подобное использовать, но для конечных продуктов не особо полезно.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.06.2020, 13:26

Не по теме:

Я вот хотел бы попробовать написать свой qDebug() или поток с выводом через ConsoleWrite что бы кириллицу нормально выводить и с раскраской символов как в python coloramа но никак не возьмусь.



Добавлено через 1 минуту
Цитата Сообщение от Ygg Посмотреть сообщение
Иногда можно для отладки что-то подобное использовать, но для конечных продуктов не особо полезно.
Для потоков наверное лучше для каждого свой лог файл.
0
 Аватар для COKPOWEHEU
4138 / 2716 / 433
Регистрация: 09.09.2017
Сообщений: 12,050
27.06.2020, 14:05
Цитата Сообщение от Ygg Посмотреть сообщение
Похоже, что printf получает доступ к консоли (общему ресурсу) один раз на один вызов функции или типа того.
Он не гарантирует атомарности доступа. Точнее, некоторые реализации таки гарантируют, но в общем случае ОС может прервать вашу программу прямо в середине вывода строки и переключиться на другую.
Ну и главное Avazart сказал: а что потом с этой кашей делать?
Цитата Сообщение от Ygg Посмотреть сообщение
Иногда можно для отладки что-то подобное использовать
Для отладки подобное UB не проблема. Это юзеру опасно для мозга такое смотреть, а разработчик привычный.
Цитата Сообщение от Avazart Посмотреть сообщение
Я вот хотел бы попробовать написать свой qDebug() или поток с выводом через ConsoleWrite что бы кириллицу нормально выводить и с раскраской символов
А чем обычная curses не устроила? Проблем с выводом кириллицы вроде нет, с раскраской тоже.
Цитата Сообщение от Avazart Посмотреть сообщение
Для потоков наверное лучше для каждого свой лог файл.
Либо добавить систему синхронизации вроде того же блокирования. Да банальный mutex повесить хотя бы. Плюс лог файл все же не предназначен для юзера, а профессионал сумеет скормить его каким-нибудь фильтрам.
Цитата Сообщение от Avazart Посмотреть сообщение
Более вероятнее что до std::endl когда буфер будет сброшен в stdout.
С чего бы?
Оператор << возвращает объект потока. То есть операция std::cout << a << b << c; разворачивается во что-то такое:
C++
1
2
3
f1 = std::cout << a;
f2 = f1::cout << b;
f3 = f2::cout << c;
В результате компилятор вынужден работать с потоком на каждом операторе, общую строку он не формирует.
1
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
27.06.2020, 14:40
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Он не гарантирует атомарности доступа. Точнее, некоторые реализации таки гарантируют, но в общем случае ОС может прервать вашу программу прямо в середине вывода строки и переключиться на другую.
Если это так и стандарт допускает такое, то подобное прерывание нельзя назвать UB. Каша в консоли вполне ожидаема и её появление вина нерадивого программиста, вроде меня. Хочу лишь заметить, что один вызов printf имеет все возможности для организации атомарности, тогда как конструкция из нескольких операторов << потенциально не может быть атомарной.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.06.2020, 15:56
Цитата Сообщение от Avazart Посмотреть сообщение
А чем его это его делает? Как воспринимать пользователю кашу из строк?
unspecified поведением делает.

разницу понимаешь между unspecified и undefined?



и кстати, нет никакой каши из строк
имеет место быть каше из буковок

например, один поток выводит маму: std::cout << "мама";
а другой поток выводит папу: std::cout << "папа";

в результате может получится: мапапама
слово было разорвано и смешалось с выводом от другого потока.

Добавлено через 12 минут
Цитата Сообщение от Ygg Посмотреть сообщение
конструкция из нескольких операторов << потенциально не может быть атомарной.
есть такой паттерн: "атомарный стрим"

вот например:
Начальное значение ссылки на неконстантный пар-р должно быть левосторонним значением

вот здесь ещё какая-то реализация:
Std::thread приостановка потока


вопрос лишь в том: нужна ли атомарная версия в общем случае?
я думаю, что лучше пусть будет обычный std::cout,
и его атомарный собрат.

а дальше программист пусть сам cпляшет от задачи.
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.06.2020, 16:22
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А чем обычная curses не устроила? Проблем с выводом кириллицы вроде нет, с раскраской тоже.
Надо посмотреть ибо не факт что там винда поддерживается. И это по большей части что бы понят как оно работает.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Либо добавить систему синхронизации вроде того же блокирования. Да банальный mutex повесить хотя бы. Плюс лог файл все же не предназначен для юзера, а профессионал сумеет скормить его каким-нибудь фильтрам.
Ну с блокировками то медленнее будет работать.

Добавлено через 1 минуту
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
С чего бы?
Оператор << возвращает объект потока. То есть операция std::cout << a << b << c; разворачивается во что-то такое:
Ну в принципе да. Есть то буфер но он то тоже ресурс.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.06.2020, 16:22

printf и cout
У меня возник вопрос, что луче еспользовать в C++, printf/scanf или cout/cin ? Что работает быстрее? Есть такой фрагмент кода ...

Cout в printf
Возможно глупый вопрос, но как переделать cout &lt;&lt; arr - (sum / m) &lt;&lt; &quot; &quot;; в printf? Как только не пытался, программа перестает работать...

Cout и printf
Привет форумчане, не могу разобраться как правильно записать выражение использую не printf, a cout. Вот исходное выражение: ...

Переделать cout на printf
cout&lt;&lt;x&lt;&lt;&quot; &quot;;

Замена printf на cout
Ув. коллеги, Можно ли заменить printf на cout в последнем выражении тернарного оператора (строка 13) без создания новой функции? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
55
Ответ Создать тему
Новые блоги и статьи
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru