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

cout vs printf

30.09.2010, 12:17. Показов 24914. Ответов 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
В астрале
Эксперт С++
 Аватар для ForEveR
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 это Си... ну если подумать, то это не аргумент вовсе. Ведь никто не мешает вам написать такое:
C++
1
2
#include <cstdio>
printf("Hello, %s!\n", "Piter")
В C++ и всё будет отлично работать...

Не печатает '\0' А кому надо это печатать?! Если вы воспользуетесь функцией putchar, то она вам его напечатает...
C++
1
printf("Hello, %s!\nNull symb #%c#", "Piter", '\0')
Тоже должна его напечатать.(я не проверял, но думаю должна). Хотя что у вас будет на терминале не знаю... Потому что первые 32 символа непечатные, некоторые управляющие, но не этот. Если их начать печатать с терминалом начнут происходить всякие странные вещи... иногда оч полезное. Например если попробовать напечатать "\033[1mPiter\033[0m" то вы увидите слово Piter напчатаное жирным шрифтом. Можно сделать инверсию, мигание, расцечивать всякими цветами вплоть до rgb и всё с помощью печати esc последовательностей. Есть лр последовательности переключающие режимы терминала но ни в одну из них не входит символ '\0'

можно написать ненужное кол-во аргументов и их типы

да можно, но на каком нибудь оч древнем компиляторе потому что любой
не оч старый компилятор всегда не только ругнётся, но и скажет что именно не так... Если вы конечно не отключили предупреждения. но это уже вы сами виноваты...
Любой аргумент против можно разбить в пух и прах если только подумать, а не слушать всяких непонятных личностей ссылающихся на америкосов о том, что всё не так... своя голова на плечах должна быть! В этом всё дело...

А плюсов тем не менее оч много.
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
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
25.06.2020, 16:58
Столько написано, но все "разносимые" в пух и прах плюсы из разряда "вчера сел за книжку" или "не разобрался, что можно было так". А где же настоящие плюсы?
0
 Аватар для COKPOWEHEU
4086 / 2684 / 432
Регистрация: 09.09.2017
Сообщений: 11,939
25.06.2020, 17:29
Цитата Сообщение от Neuton Посмотреть сообщение
Не печатает '\0'
Функция вывода строки не печатает служебный непечатный символ конца строки? И это поведение вас удивляет? А главное, чего вы хотели добиться этим выводом?
Цитата Сообщение от Neuton Посмотреть сообщение
если попробовать напечатать "\033[1mPiter\033[0m"
Непереносимо. Если хотите извращаться с цветами, миганием и тому подобным, используйте curses.
А вообще, ESC-последовательности работают независимо от функции - хоть через write или putchar пишите.
Цитата Сообщение от Neuton Посмотреть сообщение
Что касается cout, то это вообще шаблон, точнее одна из его специализаций для потока char со всеми вытекающими последствиями .
Точно? Мне казалось, это перегруженный метод.
Цитата Сообщение от Neuton Посмотреть сообщение
ну если разобраться как следует, то iostream в подмётки не годятся printf
Это не так. Преимущества есть у обоих вариантов.
Скорость вывода у std:cout выше, поскольку не надо парсить форматную строку. Вероятность ошибки ниже по той же причине. Но вот хитрые форматы делать на printf проще.
Но в целом разница возможностей околонулевая, выбор из этих вариантов - вопрос вкуса.
1
 Аватар для Annemesski
2684 / 1343 / 483
Регистрация: 08.11.2016
Сообщений: 3,712
26.06.2020, 13:15
+1 предыдущему оратору: stdio vs iostream - в общем виде чистая вкусовщина.

Пожалуй добавлю один существенный + в копилку iostream: помимо того что функционал потокового в/в легко перегружается для пользовательских типов он так же дает существенную гибкость с точки зрения назначения (endPoint) например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <fstream>
 
int main()
{
    char msg[] = "Hello stream!";
//  std::ostream &out = std::cout;
    std::ofstream &out = std::ofstream("./1.txt", std::ofstream::out);
 
    out << msg << std::endl;
 
    return 0;
}
Далее, оформив вывод в программе в переменную out легко и просто перенаправить вывод из стандартного потока в файл, файл-устройство, канал, сокет, да куда душа (или ТЗ) пожелает и менять как перчатки для подключения отладочного вывода хоть в рантайме.
Также перегрузку операторов потокового в/в весьма удобно применять для задач сериализации пользовательских типов данных.
0
 Аватар для COKPOWEHEU
4086 / 2684 / 432
Регистрация: 09.09.2017
Сообщений: 11,939
26.06.2020, 17:42
Цитата Сообщение от Annemesski Посмотреть сообщение
Пожалуй добавлю один существенный + в копилку iostream
Через *printf это делается ничуть не сложнее.
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,123
26.06.2020, 18:57
Ещё одно небольшое наблюдение. Если из разных потоков делать вывод в консоль, то в варианте с cout зачастую вывод между различными << прерывается выводом из других потоков. С printf такое не происходит вообще или происходит на порядок реже.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <thread>
 
void outputText()
{
    static int a = 0;
    static int b = 0;
    static int c = 0;
 
    //printf("%d %d %d\n", a, b, c);
    std::cout << a << " " << b << " " << c << std::endl;
 
    a += 1;
    b += 2;
    c += 3;
}
 
void threadFunc()
{
    for (int i = 0; i < 10; i++)
        outputText();
}
 
int main()
{
    std::thread t1(threadFunc);
    std::thread t2(threadFunc);
 
    t1.join();
    t2.join();
 
    return 0;
}
Вероятный результат исполнения:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
0 0 0
1 2 30 0
 2 4 60
3
 46  98
 512
6  10 1512 18
 
7 148 16 24 
21
910  18 2720 30
 
11 2212 24 36
 1333
14  2628  3942
 
1516 32  3048 
45
17 34 51
19 38 57
0
 Аватар для COKPOWEHEU
4086 / 2684 / 432
Регистрация: 09.09.2017
Сообщений: 11,939
26.06.2020, 20:24
Цитата Сообщение от Ygg Посмотреть сообщение
Если из разных потоков делать вывод в консоль
Это UB в обоих вариантах. Следовательно, так делать нельзя. Следовательно, сравнение вообще бессмысленно.

Добавлено через 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
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.06.2020, 21:28
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Это UB в обоих вариантах.
нет, не UB.
с чего ты это взял?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Даже не смотря на то, что в документации printf указано, что он thread-safety.
что это за документация такая, в которой такое написано?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
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 при этом остается нетронутым.
С их помощью вообще много чего можно сделать.
Потоки могут меняться буферами. И выводить весь буфер:
C++
1
std::cout << std::ifstream(__FILE__).rdbuf();//Весь файл в cout
К потоку можно прицепить свой буфер и писать куда угодно и как угодно.
И вообще, поток - это обертка над буфером, так что можно создать два потока, пишущих в один буфер, например, в разных форматах:
C++
1
2
3
4
std::ostream s(std::cout.rdbuf());
s << std::hex;
s << 123;
std::cout << " " << 123;
И еще там куча всего.
Кстати, как там в printf дела с переносимым выводом значений заданных стандартными typedef'ами?
Конечно, у нас есть макросы но это ужас же. Это не говоря о том, что изменив тип переменной, надо не забыть поменять форматы везде.

Но, это совершенно не означает, что printf/scanf - говно. Они тоже очень удобны и полезны.
Просто нужно решить что и где использовать будет предпочтительнее.
0
 Аватар для COKPOWEHEU
4086 / 2684 / 432
Регистрация: 09.09.2017
Сообщений: 11,939
26.06.2020, 22:14
Цитата Сообщение от Neuton Посмотреть сообщение
Ещё раз повторяю, Для тех кто в танке... printf быстрее. Это проверено. И есть доказанный факт... Возьмите и проверьте!
Да мне не жалко
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <sys/time.h>
#include <iostream>
 
unsigned long get_time_ms(){
  struct timeval tv;
  unsigned long time_ms;
  gettimeofday(&tv,NULL);
  time_ms = tv.tv_usec/1000 + tv.tv_sec*1000;
  return time_ms;
}
 
int main(){
  unsigned long t_old = get_time_ms();
  float i;
  for(i=0; i<200000; i++){
    printf("%f%f%f%f%f%f%f%f%f%f\n", i, i, i, i, i, i, i, i, i, i);
  }
  unsigned long t_new = get_time_ms();
  for(i=0; i<200000; i++){
    std::cout <<i<<i<<i<<i<<i<<i<<i<<i<<i<<i<<std::endl;
  }
  unsigned long t_cout = get_time_ms();
  
  printf("\nprintf: %lu\ncout: %lu\n", t_new - t_old, t_cout - t_new);
}
Code
1
2
printf: 6195
cout: 4366

Разница в 1.5 раза. Не в пользу printf.
Но это не важно: ввод-вывод текста штука принципиально медленная.
Цитата Сообщение от Neuton Посмотреть сообщение
Просто вас убедили, что cout лучше но забыли сказать чем.
Не угадали. Просто я имею хотя бы минимальное представление о том, как это устроено. И сам пользуюсь printf, потому что, во-первых, обычно пишу на Си, а во-вторых - см. выше - ввод-вывод текста штука принципиально медленная, значит надо оптимизировать само представление информации, а не конкретную функцию вывода.
Цитата Сообщение от hoggy Посмотреть сообщение
нет, не UB.
Из самых очевидных соображений: используется многопоточный доступ к какому-то ресурсу без малейших попыток синхронизации.
Цитата Сообщение от hoggy Посмотреть сообщение
что это за документация такая, в которой такое написано?
А какая у нас самая доступная документация? man, конечно.

Добавлено через 5 минут
Цитата Сообщение от Croessmah Посмотреть сообщение
Например, умеет ли scanf стандартным способом считывать слова с разными разделителями?
Имеется в виду ввод строки по шаблону? Ну там "%[^.]" и подобные.
Цитата Сообщение от Croessmah Посмотреть сообщение
Кстати, как там в printf дела с переносимым выводом значений заданных стандартными typedef'ами?
Для типов вроде uint32_t форматы все-таки есть, правда реализованы вырвиглазно.
Цитата Сообщение от Croessmah Посмотреть сообщение
Просто нужно решить что и где использовать будет предпочтительнее.
Даже не так. По функционалу и использованию они очень близки, выбор того или иного по большей части - хеморецепторный выбор фломастеров.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
26.06.2020, 22:23
Стандарт C:
7 Each stream has an associated lock that is used to prevent data races when multiple threads of execution access a stream, and to restrict the interleaving of stream operations performed by multiple threads. Only one thread may hold this lock at a time. The lock is reentrant: a single thread may hold the lock multiple times at a given time.
8 All functions that read, write, position, or query the position of a stream lock the stream before accessing it. They release the lock associated with the stream when the access is complete.
Добавлено через 6 минут
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Имеется в виду ввод строки по шаблону? Ну там "%[^.]" и подобные.
Угу. Но это лишь один пример работы с facet.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Для типов вроде uint32_t форматы все-таки есть, правда реализованы вырвиглазно.
Да, а если у нас еще и свои typedef'ы для типов, то придется еще и макросы писать.
А вывод в шаблоне - просто задница. Конечно, написать всегда можно. )))
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.06.2020, 22:23
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Из самых очевидных соображений: используется многопоточный доступ к какому-то ресурсу без малейших попыток синхронизации.
и при этом ты заявляешь:

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Даже не смотря на то, что в документации printf указано, что он thread-safety. Буфер все-таки не бесконечный.
таки у тебя thread-safety, или "без малейших попыток синхронизации"?

сейчас ты противоречишь самому себе.



Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А какая у нас самая доступная документация? man, конечно.
https://en.cppreference.com/w/c/io/fprintf
https://en.cppreference.com/w/cpp/io/c/fprintf

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
man, конечно.
у тебя какой то особенный man?

https://www.opennet.ru/man.sht... &russian=0
https://man7.org/linux/man-pag... ntf.3.html
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
26.06.2020, 22:26
Цитата Сообщение от Neuton Посмотреть сообщение
Можно привыкнуть коенчно. Но зачем приобретать плохие привычки?
Ты неправильный вывод делаешь. Пользоваться нужно уметь и тем и тем.
0
Заклинатель змей
 Аватар для DobroAlex
705 / 560 / 219
Регистрация: 30.04.2016
Сообщений: 2,605
26.06.2020, 22:31
Neuton,
Это проверено. И есть доказанный факт... Возьмите и проверьте! Напишите одну и ту же операцию и замерьте время и вы в этом убедитесь сами
Доказывать истинность высказывания должен тот, кто его высказал
0
 Аватар для COKPOWEHEU
4086 / 2684 / 432
Регистрация: 09.09.2017
Сообщений: 11,939
26.06.2020, 22:41
Цитата Сообщение от hoggy Посмотреть сообщение
сейчас ты противоречишь самому себе.
Хорошо, попробую разжевать специально для вас:
Цитата Сообщение от hoggy Посмотреть сообщение
у тебя какой то особенный man?
https://man7.org/linux/man-pag... ntf.3.html
Внизу есть табличка ATTRIBUTES, в ней черным по белому указано Thread safety
Но это особенность конкретной реализации!
По другой вашей ссылке cppreference информации о блокировке или потоко-безопасности я не нашел.
Реализация printf для контроллеров обычно делается через ввод-вывод отдельных символов, блокировка там отсутствует физически. Лучшее, что можно сделать - сформировать буфер и надеяться что за время вывода никто управление не перехватит.
Цитата Сообщение от hoggy Посмотреть сообщение
таки у тебя thread-safety, или "без малейших попыток синхронизации"?
"у меня" многопоточные программы не конкурируют за ввод-вывод, чего и остальным желаю.
Цитата Сообщение от Croessmah Посмотреть сообщение
Ты неправильный вывод делаешь. Пользоваться нужно уметь и тем и тем.
Не могу согласиться. То есть очевидно, что базовые представления о том и другом иметь придется - просто потому что они часто встречаются в чужом коде. С другой стороны, такие базовые вещи осваиваются чуть ли не сами собой.
Но вот всякие хитрости вроде того же ввода по шаблону нужны довольно редко, их стоит осваивать по мере надобности. Скажем, я о facet не знаю ничего и ничуть по этому поводу не страдаю: в моей области оно не применяется.
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
26.06.2020, 22:53
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Скажем, я о facet не знаю ничего и ничуть по этому поводу не страдаю: в моей области оно не применяется.
Так можно сказать про что угодно.
Например, - "Скажем, я о C++ не знаю ничего и ничуть по этому поводу не страдаю: в моей области оно не применяется".
Я же думаю, что мы говорим о случае, когда применить можно и то и то.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.06.2020, 22:57
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Внизу есть табличка ATTRIBUTES, в ней черным по белому указано Thread safety
спасибо.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
"у меня" многопоточные программы не конкурируют за ввод-вывод, чего и остальным желаю.
много-поточные программы не могут не конкурировать за ввод-вывод в ситуации,
когда осуществлять этот ввод-вывод нужно в разных потоках.

ты утверждаешь, что "у тебя" UB.
и это несмотря на то, что механизм thread-safe.
я повторю свой вопрос:
Цитата Сообщение от hoggy Посмотреть сообщение
с чего ты это взял?
как это вообще возможно?

ты знаешь, что означает thread-safe ?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13203 / 6838 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
27.06.2020, 00:11
Цитата Сообщение от Neuton Посмотреть сообщение
printf это функция нормальная вызываемая функция. правда с переменным числом аргументов. Это идёт вразрез их новомодной концепции протокола передачи аргументов в функцию ABI.
Это какой-то бред. Передача переменных аргументов никогда не шла и не идет вразрез ни с каким ABI.

Цитата Сообщение от Neuton Посмотреть сообщение
printf работает в среднем раз в 10 быстрее чем cout. это известный факт. По сути cout это оч тормознутая штука.
Во-первых, вы все перепутали с точностью "до наоброт". printf НЕ работает в 10 быстрее чем cout. Это известный факт. Во-вторых, скорость форматированного ввода-вывода все равно не имеет никакого значения. То есть это просто никому не интересно.

Цитата Сообщение от Neuton Посмотреть сообщение
printf гораздо старше чем cout итам уже всё давно исправлено и доведено до совершенства. а cout иногда глючит.
Это уже совсем смешное "пионэрство" какое-то...

Цитата Сообщение от Neuton Посмотреть сообщение
printf есть вещи, недоступные в cout, например нумерация аргументов вывода с помощью %$1-$n вместо %.
Ничего подобного, разумеется, в printf нет. Местечковые студенческие фантазии авторов всяких "мой доморощенный суперпринтф" никому не интересны.

Цитата Сообщение от Neuton Посмотреть сообщение
Не печатает объекты... Представьте себе cout их тоже не печатает... Если конечно вы не перегрузите специальный оператор << c аргументом ostream. Но если дописать метод tostr, то printf так же будет их печатать. Это не аргумент.
Это очень важный и мощный аргумент. Учитывая, что printf работает только с С-строками никакого некостыльного способа обойти проблему через некий "метод tostr" не существует.

Цитата Сообщение от Neuton Посмотреть сообщение
Есть многчисленные варианты для printf и он может работать с любыми потоками, включая память.
... только через костыльные средства, которые фактически представляют собой "закат солнца вручную", т.е. ручную перереализацию С++ на С.

Цитата Сообщение от Neuton Посмотреть сообщение
Но больше всего мне понравился поток stringstream. Хотя есть функция aspprintf, которая делает тоже самое.
Нет, такой функции нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.06.2020, 00:11
Помогаю со студенческими работами здесь

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) без создания новой функции? ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Благородство как наказание
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
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru