输出缓冲区不会刷新的情况?
Case(s) where output buffer won't flush?
我正在了解 iostream
对象并刷新缓冲区。我知道何时保证刷新输出缓冲区以及如何显式刷新缓冲区。但是,我从未见过 not 刷新输出缓冲区的情况。在我看来,即使我不使用 endl
、flush
和 ends
.
等操纵器,输出缓冲区也会在每个语句的末尾被刷新
那么,有没有输出缓冲区不会(或者至少,可能经常不会)被刷新的简单示例?我觉得我需要看到这样的案例才能真正理解输出缓冲区。
取决于系统。
以下面的程序为例:
#include <iostream>
#ifdef WIN32
#include <windows.h>
#define sleep(n) Sleep((n)*1000)
#else
#include <unistd.h>
#endif
using namespace std;
int main()
{
cout << "This is line 1";
sleep(4);
cout << endl;
cout << "This is line 2" << endl;
return 0;
}
通过检查程序,您可能会猜测程序会打印 This is line 1
,然后暂停 4 秒,然后打印 This is line 2
.
如果您在 Windows 上使用 Visual Studio 编译为 运行,您将获得完全相同的行为。
然而,在 Linux 和其他 Unix 操作系统上,程序将在打印出两行之前显示为无声 4 秒。在输出流中遇到换行符之前,输出不会可靠地刷新。
我正在了解 iostream
对象并刷新缓冲区。我知道何时保证刷新输出缓冲区以及如何显式刷新缓冲区。但是,我从未见过 not 刷新输出缓冲区的情况。在我看来,即使我不使用 endl
、flush
和 ends
.
那么,有没有输出缓冲区不会(或者至少,可能经常不会)被刷新的简单示例?我觉得我需要看到这样的案例才能真正理解输出缓冲区。
取决于系统。
以下面的程序为例:
#include <iostream>
#ifdef WIN32
#include <windows.h>
#define sleep(n) Sleep((n)*1000)
#else
#include <unistd.h>
#endif
using namespace std;
int main()
{
cout << "This is line 1";
sleep(4);
cout << endl;
cout << "This is line 2" << endl;
return 0;
}
通过检查程序,您可能会猜测程序会打印 This is line 1
,然后暂停 4 秒,然后打印 This is line 2
.
如果您在 Windows 上使用 Visual Studio 编译为 运行,您将获得完全相同的行为。
然而,在 Linux 和其他 Unix 操作系统上,程序将在打印出两行之前显示为无声 4 秒。在输出流中遇到换行符之前,输出不会可靠地刷新。