我试图让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.
在我的同花顺电话中,我可能遇到了什么问题,或者这可能是系统问题?
双方std::cout << flush;并std::cout.flush();会刷新std::cout.
看起来您的代码\r在流中插入了一个回车符().假设您打印今年,看来你将它插入一个char带有值13恰好是\r.这样做的结果是你的后期输出只会覆盖输出,因为它将在同一行上.您可以通过\n在刷新流之前显式插入换行符()来验证这一点.
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)
| 归档时间: |
|
| 查看次数: |
8782 次 |
| 最近记录: |