c принудительно std::cout промыть (печать на экран)

#c #multithreading #qt #cout #qdebug

Вопрос:

У меня есть такой код, как следующий:

 std::cout << "Beginning computations..."; // output 1
computations();
std::cout << " done!n";                  // output 2
 

Проблема, однако, заключается в том, что часто вывод № 1 и вывод № 2 появляются (практически) одновременно. То есть часто вывод #1 не выводится на экран до тех пор, пока computations() не вернется. Поскольку вся цель вывода № 1 состоит в том, чтобы указать, что что-то происходит в фоновом режиме (и, таким образом, поощрять терпение пользователя), эта проблема не является хорошей.

Есть ли какой-либо способ заставить std::cout буфер распечатываться перед computations() вызовом? В качестве альтернативы, есть ли какой-то другой способ (используя что-то другое, кроме std::cout ) для печати в стандартном режиме, который мог бы решить эту проблему?

Комментарии:

1. Я слышал std::endl , что это довольно популярно для такого рода вещей…

2. @ebyrob, Но это приведет к завершению строки, и если он хочет продолжить печать в той же строке после вычисления, ему нужно вручную выполнить очистку.

3. @leemes это очень верно. В этом случае он может либо использовать fprintf() std::flush (как показано ниже), либо изменить свою версию cout , чтобы автоматически сбрасывать в конце каждой строки кода… У меня была такая нить для этого последнего, но, похоже, я ее потерял.

4. @synaptik с чем ты сталкиваешься, с чем я не сталкиваюсь. все работает нормально. Я только что создал computation функцию с одной cout строкой. но это необходимо сделать перед вызовом функции. "Beginning computations..." но мне нужно найти, в каком конкретном случае буфер не будет свободным.

Ответ №1:

Просто вставьте std::flush :

 std::cout << "Beginning computations..." << std::flush;
 

Также обратите внимание, что вставка std::endl также будет удалена после ввода новой строки.

Комментарии:

1. @user1810087 Извините, я отредактировал его, но довольно быстро. Я думаю, это было до того, как ты ответил.

2. Мне понравились комментарии 😀

3. @JosephMansfield но в моем случае этого не происходит, значит, нет необходимости использовать std::flush . можете ли вы привести случай, когда буфер не заполнен, поэтому cout печать не выполняется.

Ответ №2:

В дополнение к ответу Джозефа Мэнсфилда, std::endl также выполняет сброс (помимо новой строки).

Вставляет символ конечной строки в выходную последовательность os и очищает ее, как будто вызывая os.put(os.widen(‘n’)), за которым следует os.флеш().