Сброс ostream, C ++ - PullRequest
       41

Сброс ostream, C ++

3 голосов
/ 25 ноября 2010

У меня есть 2 разных ostream, один из них cerr, использующий один и тот же потоковый буфер, у меня есть несколько библиотек, которые могли как-то изменить 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

Отладка mystreambuffer Я заметил, что cerr вызывает mystreambuffer->sync() каждую << операцию, тогда как testtream вообще не вызывает ее.
Если я прав, cerr это простотогда стандартный ostream, почему я вижу эту разницу во времени промывки?Как я могу сбросить cerr обратно к обычным операциям очистки?

РЕДАКТИРОВАТЬ: Я вижу, что вы, ребята, комментируете unitbuf и он по умолчанию в cerr, но если это было по умолчанию, не так линапиши здесь пошагово тоже?

#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

Ответы [ 2 ]

1 голос
/ 25 ноября 2010

Флаг ios :: unitbuf является причиной того, что для cerr установлено значение по умолчанию.

Вам необходимо использовать манипулятор nounitbuf, чтобы исправить это.Некоторые старые библиотеки могут не иметь его, если так, тогда используйте unsetf.

Редактировать: Настройка по умолчанию для unitbuf зависит от реализации:)

1 голос
/ 25 ноября 2010

Попробуйте std::cerr.unsetf( std::ios_base::unitbuf );. Этот флаг включен для cerr по умолчанию.

...