C++ 重置ostream,C++;

C++ 重置ostream,C++;,c++,linux,iostream,ostream,C++,Linux,Iostream,Ostream,我有两个不同的ostream,其中一个是cerr,使用同一个streambuffer,我有一些库可能会以某种方式修改cerr(flags?format modifiers?) 调试mystreambuffer我注意到cerr调用mystreambuffer->sync()每个尝试std::cerr.unset(std::ios\u base::unitbuf)。默认情况下,该标志对于cerr是打开的。ios::unitbuf标志是将cerr设置为默认的原因 您需要使用NonuitBuf操纵器来修

我有两个不同的ostream,其中一个是cerr,使用同一个streambuffer,我有一些库可能会以某种方式修改cerr(flags?format modifiers?)


调试
mystreambuffer
我注意到cerr调用
mystreambuffer->sync()
每个
尝试
std::cerr.unset(std::ios\u base::unitbuf)。默认情况下,该标志对于
cerr
是打开的。

ios::unitbuf标志是将cerr设置为默认的原因

您需要使用NonuitBuf操纵器来修复它。一些较旧的库可能没有,如果有,请使用unset

编辑:
unitbuf的默认设置取决于实现:)

请参阅我的问题更新,如何在新示例中启用unitbuf?@Arkaitz Jimenez:刷新流并不一定意味着写新行。刷新所做的是将输出字符从内部缓冲区传输到最终目的地,例如,在流的情况下传输到文件。你的
mystreambuffer->sync()
做什么?它是否插入了一个新行?它现在可以在unitbuf被移除的情况下工作。我只是想知道我正在使用的库是否在cerr中设置了unitbuf,或者这是否是一个默认值。我看到标准上说cerr是无缓冲的,但我粘贴的示例没有显示无缓冲的行为。@Arkaitz Jimenez:我不知道你为什么认为它是缓冲的。是的,cerr中的unitbuf在默认情况下是由标准强制执行的:27.3.1/5“在对象cerr初始化后,cerr.flags()和unitbuf为非零。”@Arkaitz Jimenez:例如,试试这个:
std::cerr
cerr.rdbuf(&mystreambuffer);
ostream teststream(&mystreambuffer);

cerr << "This " << " is " << " a " << " test";
teststream << "This " << " is " << " a teststream " << " test";
This
is
a
test
This is a teststream test
#include <iostream>
int main(){
    std::cerr << "This " << " is " << " a cerr " << " test\n";
    std::cout << "This " << " is " << " a cout " << " test\n";
}
Cobain /tmp$ ./test 
This  is  a cerr  test
This  is  a cout  test