7

我试图让 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;

这是我的输出
日期之后:| 2013 年 1月 31
日之后的日期:| 2012 年 3月 21
日之后的日期:| 2011年 11 月 11
日之后的日期:| 2010年 10 月 1
日之后的日期:| 2012 年 1 月 2 日

因此,您可以看到对 cout 的第一次调用从未刷新,但正如我之前所说,缓冲区将成功地使用 endl 刷新,它本身调用刷新。我目前在运行 Mountain Lion 的主机 macbook pro 上运行带有 VirtualBox 的 Ubuntu 12.04。

在我的刷新调用中我可能做错了什么,或者这可能是系统问题吗?

4

3 回答 3

9

两者std::cout << flush;std::cout.flush();都会冲洗std::cout

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

于 2013-10-20T23:10:25.983 回答
6

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

要禁用它以运行您的程序,请使用如下命令stdbuf

stdbuf -o 0 ./yourprogram --yourparams

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

stdbuf -o 0 gdb --args ./yourprogram --yourparams
于 2016-05-26T14:15:47.997 回答
1

Flush 仅将流的缓冲区写入实际设备(文件或 tty)。

如果这是您所期望的,它不会移动到下一行。

这是设计使然。

请注意,这是代码的更简洁版本,它似乎可以像宣传的那样工作(就此而言,有或没有刷新):

在 Coliru 上看到它

#include <sstream>
#include <iostream>
#include <vector>
#include <cassert>

struct Game { 
    std::string _date;
    std::string date() const { return _date; }
};

int main()
{
    for (Game game : std::vector<Game> { {"01/02/1999"}, {"24/10/2013"}})
    {
        std::istringstream stm (game.date());
        int day, month, year;
        char delim = '/';

        std::cout << "Date before: " << game.date();

        stm >> month >> delim;
        assert(stm && '/' == delim);

        stm >> day >> delim;
        assert(stm && '/' == delim);

        stm >> year;

        std::cout << " Date after: " << " | " << month << "/" << day << "/" << year << std::endl;
    }
}
于 2013-10-20T23:10:50.373 回答