Вопрос

И снова мой учитель не смог ответить на мой вопрос.Я знал, кто сможет...

Итак, я никогда по-настоящему не изучал C.В C++ я бы, очевидно, постоянно использовал оператор cout.В недавнем задании мой учитель посоветовал нам обязательно поставить

setbuf( stdout , NULL );

в верхней части main(), чтобы получить небуферизованный вывод, что позволяет нам правильно видеть вывод.

Мой вопрос таков:повлияет ли этот оператор на оператор cout или просто на оператор printf(), который я вызываю?

Заранее спасибо!

Это было полезно?

Решение

По умолчанию iostreams и stdio синхронизируются. Ссылка.

Однако это не означает, что ручная настройка буферизации stdio — хорошая идея!Вы можете использовать std::endl или std::flush (от <ostream>), что может вам помочь.например.,

std::cout << "Hello, world!" << std::endl;

или

std::cout << "Hello, world!\n" << std::flush;

Оба они делают одно и то же.(std::endl = вывести конечную строку, а затем сбросить ее.)

Другие советы

По умолчанию, если стандартный вывод или cout выводятся на консоль, вывод буферизуется по строкам.Это означает, что каждая напечатанная новая строка будет сбрасывать вывод.Вы можете явно вызывать флеш() всякий раз, когда хотите переопределить поведение, на всякий случай, скажем, выходные данные будут перенаправлены в файл, и вы хотите использовать Tail -f и вам нужны определенные выходные данные в реальном времени.

Как сказал Крис, sync_with_stdio должен связать небуферизованный стандартный вывод с небуферизованным cout (по умолчанию), но если все, что вы делаете, это использование cout вместо использования setbuf для стандартного вывода, лучшим вариантом будет использование pubsetbuf по указателю, возвращаемому rdbuf.то есть:

// make cout unbuffered
std::cout.rdbuf()->pubsetbuf(0, 0);

Еще одна функция, на которую может быть интересно обратить внимание: галстук.

Обычно, когда важно немедленно увидеть результат, мы говорим о сложной высоконадежной финансовой процедуре, которая должна регистрировать транзакцию на жестком диске, прежде чем фактическая ее отправка контрагенту.Или (гораздо более распространенный случай) мы хотим видеть отладочные сообщения даже при сбое программы.

Поскольку вы учитесь, я предполагаю, что вы имеете дело со вторым случаем.В этом случае я бы посоветовал использовать stderr, а не stdout.По умолчанию он не буферизован, и вы можете перенаправить его отдельно от стандартного вывода, поместив выходные данные в одно место, а журналирование — в другое.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top