C++ 对flush cout的调用无效

C++ 对flush cout的调用无效,c++,cout,flush,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

我试图在操作字符串之前刷新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;
std::istringstream stm(game.date());
整数日、月、年;
char delim='/';
std::cout delim;
stm>>day>>delim;
stm>>年份>>德利姆;

std::coutBoth
std::coutFlush仅将流的缓冲区写入实际设备(文件或tty)

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

这是故意的

注意,这里有一个更干净的代码版本,它看起来像广告中所说的那样工作(不管有没有刷新):

查看它

#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;
    }
}
#包括
#包括
#包括
#包括
结构游戏{
std::string\u date;
std::string date()常量{return\u date;}
};
int main()
{
对于(游戏:std::vector{{“01/02/1999”}、{“24/10/2013”})
{
std::istringstream stm(game.date());
整数日、月、年;
char delim='/';
标准::月份>>熟食;
断言(stm&&'/'==delim);
stm>>day>>delim;
断言(stm&&'/'==delim);
stm>>年;

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

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

stdbuf -o 0 ./yourprogram --yourparams
stdbuf -o 0 gdb --args ./yourprogram --yourparams
如果需要在调试器中禁用缓冲,请按如下方式使用:

stdbuf -o 0 ./yourprogram --yourparams
stdbuf -o 0 gdb --args ./yourprogram --yourparams

我发现了一个。你是怎么决定刷新不起作用的?至于XY问题的Y部分,看这里,例如,试着做一个SSCCE()。这可能会帮助您自己解决问题。呃。
\n
是否会导致stdout在大多数系统上刷新?@sehe:遗憾的是,这可能会导致stdout刷新,因为大多数IOStreams实现选择较慢并委托给
例程。因为大多数程序也不会调用
std::ios\u base::sync\u with\u stdio(false)
(如果他们不将
与标准流上的
操作相混合,他们应该这样做),它会将每个字符写入
标准流。但是,一个实现可以做得更好,在这种情况下,它可能不会在
\n
上刷新。谢谢你的回答。我将日期的
substr
从0改为(长度-1)我还做了一个
查找
来验证它是
'\r'
字符,并且是这样的。