Вопрос

У меня есть 2 разных stakreams, один из них Cerr, используя один и тот же streambuffer, у меня есть некоторые библиотеки, которые могут быть изменены как-то, (флаги? Модификаторы формата?).

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() каждый << Операция во время Teststream вообще не называет это.
Если я правильно cerr Тогда это просто стандартный остром, почему я вижу эту разницу в разных временах? Как я могу сбросить 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
Это было полезно?

Решение

Пытаться std::cerr.unsetf( std::ios_base::unitbuf );. Отказ Этот флаг включен для cerr по умолчанию.

Другие советы

IOS :: Флаг UnitBuf - это причина того, что установлено значение по умолчанию для CERR.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top