Восстановите состояние станд.:: суд после управления им

Предположим, что у меня есть код как это:

void printHex(std::ostream& x){
    x<<std::hex<<123;
}
..
int main(){
    std::cout<<100; // prints 100 base 10
    printHex(std::cout); //prints 123 in hex
    std::cout<<73; //problem! prints 73 in hex..
}

Мой вопрос состоит в том, если существует какой-либо способ 'восстановить' состояние cout к его исходному после возврата из функции? (Несколько как std::boolalpha и std::noboolalpha..) ?

Спасибо.

91
задан leiyc 17 September 2019 в 07:38
поделиться

3 ответа

вам нужно #include или #include , а затем, если требуется:

std::ios_base::fmtflags f( cout.flags() );

//Your code here...

cout.flags( f );

Вы можете поместить их в начале и в конце вашей функции, или ознакомьтесь с этим ответом о том, как использовать это с RAII .

82
ответ дан 24 November 2019 в 06:44
поделиться

Boost IO Stream State Saver, похоже, именно то, что вам нужно. :-)

Пример на основе вашего фрагмента кода:

void printHex(std::ostream& x) {
    boost::io::ios_flags_saver ifs(x);
    x << std::hex << 123;
}
60
ответ дан 24 November 2019 в 06:44
поделиться

С небольшими изменениями, чтобы сделать вывод более читаемым:

void printHex(std::ostream& x) {
   ios::fmtflags f(x.flags());
   x << std::hex << 123 << "\n";
   x.flags(f);
}

int main() {
    std::cout << 100 << "\n"; // prints 100 base 10
    printHex(std::cout);      // prints 123 in hex
    std::cout << 73 << "\n";  // problem! prints 73 in hex..
}
7
ответ дан 24 November 2019 в 06:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: