cout vs printf30.09.2010, 12:17. Показов 24914. Ответов 54
Метки нет (Все метки)
0
|
|
| 30.09.2010, 12:17 | |
|
Ответы с готовыми решениями:
54
Printf() - Cout printf > cout Cout в printf |
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 21.07.2015, 11:20 | |
|
Eraston, Через iostream тоже, используя различные манипуляторы. Так же есть различные либы типа boost::format, которые позволяют форматированный вывод. Так же, iostream безопаснее, нежели printf и в С++11 довольно просто можно реализовать более безопасный printf, где компилятор будет контролировать типы значений, нежели есть сейчас в Си.
И вообще, теме 5 лет, один дигер нашелся, давайте больше не будем.
1
|
|
|
0 / 0 / 0
Регистрация: 29.05.2020
Сообщений: 9
|
|||||||||||
| 25.06.2020, 16:19 | |||||||||||
|
ну если разобраться как следует, то iostream в подмётки не годятся printf.Я пытался понять чем они аргументируют это? и почему...
Вот первый "аргумент" cout это С++, а printf это Си... ну если подумать, то это не аргумент вовсе. Ведь никто не мешает вам написать такое:
Не печатает '\0' А кому надо это печатать?! Если вы воспользуетесь функцией putchar, то она вам его напечатает...
можно написать ненужное кол-во аргументов и их типы да можно, но на каком нибудь оч древнем компиляторе потому что любой не оч старый компилятор всегда не только ругнётся, но и скажет что именно не так... Если вы конечно не отключили предупреждения. но это уже вы сами виноваты... Любой аргумент против можно разбить в пух и прах если только подумать, а не слушать всяких непонятных личностей ссылающихся на америкосов о том, что всё не так... своя голова на плечах должна быть! В этом всё дело... А плюсов тем не менее оч много. printf это функция нормальная вызываемая функция. правда с переменным числом аргументов. Это идёт вразрез их новомодной концепции протокола передачи аргументов в функцию ABI. Что касается cout, то это вообще шаблон, точнее одна из его специализаций для потока char со всеми вытекающими последствиями . printf работает в среднем раз в 10 быстрее чем cout. это известный факт. По сути cout это оч тормознутая штука. printf гораздо старше чем cout итам уже всё давно исправлено и доведено до совершенства. а cout иногда глючит. printf гораздо удобнее чем cout, потому что все действия пишутся водном формате где есть всё... и нчиего больше. Если вам надо выводить элементы в cout не по default режиму это заставвит вас применять многочисленные манипуляторы, что оч неудобно. а иногда даже не работает... Приходится выяснять почему... printf есть вещи, недоступные в cout, например нумерация аргументов вывода с помощью %$1-$n вместо %. И это позволяет вам печатать аргументы не по порядку, а по номерам. некоторые можно печатаь по 2 и более раз если указать в формате один и тот же номер аргумента. Можно печатать число в локальном представлении, если указать флаг ' или локальный набор цифр с помощью флага I ну и конечно вы можете динамически управлять точностью задав в формате *. В cout это тоже можно, но в printf удобнее Не печатает объекты... Представьте себе cout их тоже не печатает... Если конечно вы не перегрузите специальный оператор << c аргументом ostream. Но если дописать метод tostr, то printf так же будет их печатать. Это не аргумент. Есть многчисленные варианты для printf и он может работать с любыми потоками, включая память. Но больше всего мне понравился поток stringstream. Хотя есть функция aspprintf, которая делает тоже самое. Ноя не уверен, что она кроссплатформенная. Они уже 20 с лишним лет нас пытаются убедить что cout лучше. Но я не слышал пока ни одного разумного аргумента. Хотя в С++20 есть функция format. Она оч похожа на аналогичный format из python. Так вот она позволяет печатать двоичное представление числа. до сих пор это делалось вручную... Хотя конечно далеко не всё сделано. например пока нельзя выводить число типа __int128, как и __float128. На некоторых языках можно. Например на фортане. Yо там read и write разрабатывается не 30 лет, а 60! Функция write оч напоминает printf, но более продвинутая...и там нет различий в типах. Она универсальна и хватает любой тип... строки там не нуль терминированные, а с фиксированной длиной. Остаток строки это пробелы... Но в качестве потока можно указать строку и у вас write будет печатать в строку. А обрезать пробелы с конца это не проблема. Если вам надо работать с __int128 или __float128, то используйте фортран... Хотя вы можете написать свои функции преобразования. в С/C++ для этих типов поддерживаются только основные типы операций по синтаксису включая ве алгебраические функции. вышеупомянутые функции read, write так же обрабатывают все виды ошибок преобразования включая так же те. которые С/С++ даже не замечает. Хотя некоторые функции всё же замечают. Например переполнение. Фортран вообще ловит все перполнения во всех операциях и не только это. соединить фортрановкий модуль с С/С++ несложно! У нас в России он не популярен, хотя при СССР был оч популярным в последние годы. А в РФ о нём неоправданно забыли, а зря... Есть оч много хороших технологий и языков программирования, которые популярны везде в мире, но не в РФ почему-то... В РФ о них даже не слышали! Но в нете вы можете их найти, изучить и использовать... но они будут ту невостребованы. Ещё
0
|
|||||||||||
|
4086 / 2684 / 432
Регистрация: 09.09.2017
Сообщений: 11,939
|
|||||
| 25.06.2020, 17:29 | |||||
|
А вообще, ESC-последовательности работают независимо от функции - хоть через write или putchar пишите. Скорость вывода у std:cout выше, поскольку не надо парсить форматную строку. Вероятность ошибки ниже по той же причине. Но вот хитрые форматы делать на printf проще. Но в целом разница возможностей околонулевая, выбор из этих вариантов - вопрос вкуса.
1
|
|||||
|
2684 / 1343 / 483
Регистрация: 08.11.2016
Сообщений: 3,712
|
||||||
| 26.06.2020, 13:15 | ||||||
|
+1 предыдущему оратору: stdio vs iostream - в общем виде чистая вкусовщина.
Пожалуй добавлю один существенный + в копилку iostream: помимо того что функционал потокового в/в легко перегружается для пользовательских типов он так же дает существенную гибкость с точки зрения назначения (endPoint) например:
out легко и просто перенаправить вывод из стандартного потока в файл, файл-устройство, канал, сокет, да куда душа (или ТЗ) пожелает и менять как перчатки для подключения отладочного вывода хоть в рантайме. Также перегрузку операторов потокового в/в весьма удобно применять для задач сериализации пользовательских типов данных.
0
|
||||||
|
4086 / 2684 / 432
Регистрация: 09.09.2017
Сообщений: 11,939
|
|
| 26.06.2020, 17:42 | |
|
0
|
|
|
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,123
|
|||||||||||
| 26.06.2020, 18:57 | |||||||||||
|
Ещё одно небольшое наблюдение. Если из разных потоков делать вывод в консоль, то в варианте с
cout зачастую вывод между различными << прерывается выводом из других потоков. С printf такое не происходит вообще или происходит на порядок реже.
0
|
|||||||||||
|
4086 / 2684 / 432
Регистрация: 09.09.2017
Сообщений: 11,939
|
||
| 26.06.2020, 20:24 | ||
|
Добавлено через 1 минуту Даже не смотря на то, что в документации printf указано, что он thread-safety. Буфер все-таки не бесконечный.
0
|
||
|
0 / 0 / 0
Регистрация: 29.05.2020
Сообщений: 9
|
|
| 26.06.2020, 20:25 | |
|
Ещё раз повторяю, Для тех кто в танке... printf быстрее. Это проверено. И есть доказанный факт... Возьмите и проверьте! Напишите одну и ту же операцию и замерьте время и вы в этом убедитесь сами. Это конечно не самый быстрый способ чтения файлов, но значительно быстрее.
Аргумент что формат надо пасить потому медленно не канает... Потому что формат в printf парсится оч быстро. Это не регулярка и не xml или что-то ещё... Да там есть какая-то задержка, но небольшая... Просто вас убедили, что cout лучше но забыли сказать чем. А вы не верьте, а сами проверьте... Но пожалуй 1 плюс у cout всё же есть, там можно задать произвольный символ заполнения. В printf нет.. Но оч сомнительный плюс... А самый быстрый способ чтения и записи файлов это системные функции read write, Но там нет никакого формата... То, что такой вариант с форматом предпочтительней доказывает то, что форматы они опять появились, например в С++20. Они есть во многих языках программирования, а не только в С/С++. Просто так удобнее. А в cout мне бы пришлось писать множество манипуляторов всяких. Это неудобно... Можно привыкнуть коенчно. Но зачем приобретать плохие привычки?!
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 26.06.2020, 21:28 | |||
|
с чего ты это взял?
0
|
|||
|
Неэпический
|
|||||||||||
| 26.06.2020, 21:56 | |||||||||||
|
Neuton, по поводу производительности всё уже давно написано: https://habr.com/ru/post/246257/
Потоки могут быть независимыми от глобальной локали. printf/scanf работают только с глобальной. Локали в потоках более гибкие, поддаются полной перестройке. Правда, за это приходится платить, но локали - это вообще не очень быстрая штука, в т.ч. и в printf/scanf. Например, умеет ли scanf стандартным способом считывать слова с разными разделителями?Например, для потоков можно подцепить facet: https://wandbox.org/permlink/2WQs7C04RprdQLGWПричем, std::cin при этом остается нетронутым.С их помощью вообще много чего можно сделать. Потоки могут меняться буферами. И выводить весь буфер:
И вообще, поток - это обертка над буфером, так что можно создать два потока, пишущих в один буфер, например, в разных форматах:
Кстати, как там в printf дела с переносимым выводом значений заданных стандартными typedef'ами? Конечно, у нас есть макросы но это ужас же. Это не говоря о том, что изменив тип переменной, надо не забыть поменять форматы везде. Но, это совершенно не означает, что printf/scanf - говно. Они тоже очень удобны и полезны. Просто нужно решить что и где использовать будет предпочтительнее.
0
|
|||||||||||
|
4086 / 2684 / 432
Регистрация: 09.09.2017
Сообщений: 11,939
|
||||||||||||||||||
| 26.06.2020, 22:14 | ||||||||||||||||||
|
Да мне не жалко
Разница в 1.5 раза. Не в пользу printf. Но это не важно: ввод-вывод текста штука принципиально медленная. Добавлено через 5 минут "%[^.]" и подобные.
0
|
||||||||||||||||||
|
Неэпический
|
||||
| 26.06.2020, 22:23 | ||||
|
Стандарт C:
facet. ![]() А вывод в шаблоне - просто задница. Конечно, написать всегда можно. )))
0
|
||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||
| 26.06.2020, 22:23 | |||||
|
сейчас ты противоречишь самому себе. https://en.cppreference.com/w/cpp/io/c/fprintf https://www.opennet.ru/man.sht... &russian=0 https://man7.org/linux/man-pag... ntf.3.html
0
|
|||||
|
Заклинатель змей
705 / 560 / 219
Регистрация: 30.04.2016
Сообщений: 2,605
|
||
| 26.06.2020, 22:31 | ||
|
Neuton,
0
|
||
|
4086 / 2684 / 432
Регистрация: 09.09.2017
Сообщений: 11,939
|
|||||
| 26.06.2020, 22:41 | |||||
ATTRIBUTES, в ней черным по белому указано Thread safetyНо это особенность конкретной реализации! По другой вашей ссылке cppreference информации о блокировке или потоко-безопасности я не нашел. Реализация printf для контроллеров обычно делается через ввод-вывод отдельных символов, блокировка там отсутствует физически. Лучшее, что можно сделать - сформировать буфер и надеяться что за время вывода никто управление не перехватит. Но вот всякие хитрости вроде того же ввода по шаблону нужны довольно редко, их стоит осваивать по мере надобности. Скажем, я о facet не знаю ничего и ничуть по этому поводу не страдаю: в моей области оно не применяется.
1
|
|||||
|
Неэпический
|
||
| 26.06.2020, 22:53 | ||
![]() Например, - "Скажем, я о C++ не знаю ничего и ничуть по этому поводу не страдаю: в моей области оно не применяется". Я же думаю, что мы говорим о случае, когда применить можно и то и то.
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||
| 26.06.2020, 22:57 | ||||
|
когда осуществлять этот ввод-вывод нужно в разных потоках. ты утверждаешь, что "у тебя" UB. и это несмотря на то, что механизм thread-safe. я повторю свой вопрос: ты знаешь, что означает thread-safe ?
0
|
||||
|
Вездепух
13203 / 6838 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
|
||||||||
| 27.06.2020, 00:11 | ||||||||
printf нет. Местечковые студенческие фантазии авторов всяких "мой доморощенный суперпринтф" никому не интересны.printf работает только с С-строками никакого некостыльного способа обойти проблему через некий "метод tostr" не существует.
0
|
||||||||
| 27.06.2020, 00:11 | |
|
Помогаю со студенческими работами здесь
40
printf и cout
Cout и printf
Замена printf на cout Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
|
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2.
Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
|
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2.
Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом.
В. . .
|
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2.
Задача: отобразить спецтехнику, которая на данный момент находится в ремонте.
Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
|
|
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
|
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
|
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут
Суть:
- Группа наркоманов из 10 человек.
- Только один инфицирован ВИЧ.
- Колются одной иглой.
- Колются раз в день.
- Колются последовательно через. . .
|
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
|