Cara Memulihkan Keadaan std::cout Selepas Memanipulasinya
Dalam C , memanipulasi keadaan aliran keluaran seperti std: :cout membenarkan pilihan pemformatan serba boleh. Walau bagaimanapun, kadangkala ia menjadi perlu untuk memulihkan keadaan asal selepas melakukan perubahan ini.
Pertimbangkan kod berikut:
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.. }
Di sini, selepas memanggil printHex, keadaan std::cout berubah kepada keluaran heksadesimal. Akibatnya, operasi cetakan seterusnya juga mencetak dalam perenambelasan, walaupun pengaturcara mungkin tidak menginginkan kelakuan ini.
Untuk menangani isu ini, seseorang boleh menggunakan teknik berikut:
#include <iostream> std::ios_base::fmtflags f( cout.flags() ); // Your code here... cout.flags( f );
Oleh menyimpan bendera semasa (pilihan pemformatan) std::cout dalam pembolehubah f sebelum melakukan sebarang manipulasi, seseorang boleh memulihkan keadaan asal dengan menetapkan bendera kembali ke f selepas perubahan yang diingini.
Sebagai alternatif, untuk kod yang lebih mudah dan berorientasikan objek, seseorang boleh menggunakan RAII (Pemerolehan Sumber Adalah Permulaan) seperti berikut:
#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) }
Atas ialah kandungan terperinci Bagaimana untuk Tetapkan Semula `std::cout` kepada Keadaan Asalnya Selepas Memformat Perubahan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!