呼叫冲洗cout是无效的

Tyl*_*ler 7 c++ cout flush

我试图让cout缓冲区刷新以在我操作之前查看字符串.我试图通过调用两者来刷新缓冲区,但实际上std::flush()std::cout.flush()没有刷新我的输出.

只有一个调用std::endl已经为我成功刷新了缓冲区.

这是我的代码

std::istringstream stm (game.date());
int day, month, year;
char delim = '/';

std::cout << "Date before: " << game.date() << std::flush; // first flush attempt
std::cout.flush();  // second flush attempt doesnt work
//std::cout << std::endl;   // if this is executed the buffer will flush

// Split date string into integers for comparison
stm >> month >> delim;
stm >> day >> delim;
stm >> year >> delim;

std::cout << "Date after: " << " | " << month << "/" << day << "/" << year << std::endl;
Run Code Online (Sandbox Code Playgroud)

这是我的输出
日期:| 1/31/13
日期之后:| 3月21
日至21 日之后:| 11/11/11
之后的日期:| 10/1/10
之后的日期:| 12年1月2日

因此,你可以看到第一次调用cout并没有被刷新,但正如我之前所说,缓冲区将成功刷新endl,它调用flush本身.我目前正在运行Mountain Lion的主机macbook pro上运行带有VirtualBox的Ubuntu 12.04.

在我的同花顺电话中,我可能遇到了什么问题,或者这可能是系统问题?

Die*_*ühl 8

双方std::cout << flush;std::cout.flush();会刷新std::cout.

看起来您的代码\r在流中插入了一个回车符().假设您打印今年,看来你将它插入一个char带有值13恰好是\r.这样做的结果是你的后期输出只会覆盖输出,因为它将在同一行上.您可以通过\n在刷新流之前显式插入换行符()来验证这一点.

  • @sehe:遗憾的是,它可能会这样做,因为大多数IOStreams实现选择缓慢并委托给`<stdio>`例程.因为大多数程序也不调用`std :: ios_base :: sync_with_stdio(false)`(如果他们不将`<stdio>`与标准流上的`<iostream>`操作混合在一起),它们就应该这样做了将每个字符写入`stdout`.但是,实现可以做得更好,在这种情况下它可能不会刷新`\n`. (2认同)

Nic*_*y77 6

cout在现代 Linux 系统中,系统缓冲区仍然可以缓冲您的输出。

要在程序运行时禁用它,请使用如下命令stdbuf

stdbuf -o 0 ./yourprogram --yourparams
Run Code Online (Sandbox Code Playgroud)

如果您需要在调试器中禁用缓冲,请像这样使用它:

stdbuf -o 0 gdb --args ./yourprogram --yourparams
Run Code Online (Sandbox Code Playgroud)