В соответствии с использованием объекта cout
содержимое сначала будет сохраняться в выходном буфере до тех пор, пока не наступит условие триггера или пока программа не завершится.
Затем выходной буфер очищается.
Наконец, терминал отображает содержимое.
Но оно отображается сразу.
#include <iostream>
#include <windows.h>
int main() {
std::cout << "Hello, World!";
Sleep(10000);
return 0;
}
Как отразить эффект буфера метода cout
в выходном потоке?
Или это касается операционной системы?
Это зависит от реализации. Попробуйте построить его с помощью Release.
cout
— это не функция или метод, это объект.
В общем, std::cout не буферизуется по умолчанию: пока активен sync_with_stdio, каждый байт, записанный в буфер std::cout, немедленно помещается в буфер stdout.
По умолчанию стандартный вывод в POSIX буферизуется по строкам, поэтому, если вы запустите указанную выше программу с помощью gcc в Linux (со спящим режимом C++ вместо спящего режима Windows), вы не увидите вывод до тех пор, пока не пройдет пауза.
На основе «Sleep(5000);» однако это использует Windows. Там потоки ввода-вывода C не буферизуются. Вы можете это заметить, заменив std::cout << "test"; с printf("тест");. Вывод по-прежнему появляется немедленно.
Вы все равно можете заставить Windows задерживать вывод, если включите буферизацию на стандартном выводе:
#include <iostream>
#include <cstdio>
#include <windows.h>
int main()
{
char buf[BUFSIZ];
std::setbuf(stdout, buf);
std::cout << "test";
// std::fflush(stdout); // <- uncomment to see the text before the pause
Sleep(5000);
std::fflush(stdout);
std::setbuf(stdout, NULL); // don't let the stream outlive the buffer
}
Однако эта демонстрация не позволит вам наблюдать эффект std::flush, поскольку флеш только перемещает буфер cout (которого у него даже нет по умолчанию) в буфер stdout, где выходные данные находятся до тех пор, пока не будут сброшены с помощью std::fflush или неявные средства.
Чтобы наблюдать за std::flush, дайте std::cout собственный буфер и отключите его от потоков ввода-вывода C:
#include <iostream>
#include <windows.h>
int main()
{
char buf[BUFSIZ];
std::ios::sync_with_stdio(false);
std::cout.rdbuf()->pubsetbuf(buf, sizeof buf);
std::cout << "test";
//std::cout << std::flush; // <- uncomment to obseve the output before the pause
Sleep(5000);
std::cout << std::flush;
std::cout.rdbuf()->pubsetbuf(nullptr, 0); // don't let the stream outlive the buffer
}
На самом деле вы не контролируете, когда вывод сбрасывается. Это зависит от вашего терминала. Вы можете в какой-то степени повлиять на буферизацию, но действительно ли это проблема?