Предположим, что у меня есть код как это:
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
..) ?
Спасибо.
вам нужно #include
или #include
, а затем, если требуется:
std::ios_base::fmtflags f( cout.flags() );
//Your code here...
cout.flags( f );
Вы можете поместить их в начале и в конце вашей функции, или ознакомьтесь с этим ответом о том, как использовать это с RAII .
Boost IO Stream State Saver, похоже, именно то, что вам нужно. :-)
Пример на основе вашего фрагмента кода:
void printHex(std::ostream& x) {
boost::io::ios_flags_saver ifs(x);
x << std::hex << 123;
}
С небольшими изменениями, чтобы сделать вывод более читаемым:
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..
}