如何在操作 std::cout 后恢复其状态
在 C 中,操作 std::cout 等输出流的状态: :cout 允许多种格式选项。然而,有时在执行这些更改后需要恢复原始状态。
考虑以下代码:
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.. }
这里,在调用 printHex 后,std::cout 的状态发生变化为十六进制输出。因此,后续的打印操作也会以十六进制打印,即使程序员可能不希望这种行为。
要解决此问题,可以利用以下技术:
#include <iostream> std::ios_base::fmtflags f( cout.flags() ); // Your code here... cout.flags( f );
通过在执行任何操作之前,将 std::cout 的当前标志(格式选项)保存在变量 f 中,可以通过在所需的操作之后将标志设置回 f 来恢复原始状态
或者,为了更方便和面向对象的代码,可以使用 RAII(资源获取即初始化),如下所示:
#include <iostream> struct FlagsSaver { FlagsSaver() : flags( cout.flags() ) {} ~FlagsSaver() { cout.flags( flags ); } private: std::ios_base::fmtflags flags; }; void printHex(std::ostream& x) { FlagsSaver saver; // RAII to restore flags x << std::hex << 123; } int main() { std::cout << 100; // prints 100 base 10 printHex(std::cout); //prints 123 in hex std::cout << 73; // prints 73 base 10 (original flags restored) }
以上是格式更改后如何将 `std::cout` 重置为原始状态?的详细内容。更多信息请关注PHP中文网其他相关文章!