Heim >Backend-Entwicklung >C++ >Wie setze ich „std::cout' nach Formatierungsänderungen auf seinen ursprünglichen Zustand zurück?

Wie setze ich „std::cout' nach Formatierungsänderungen auf seinen ursprünglichen Zustand zurück?

DDD
DDDOriginal
2024-12-02 10:57:11915Durchsuche

How to Reset `std::cout` to its Original State After Formatting Changes?

So stellen Sie den Status von std::cout nach der Manipulation wieder her

In C wird der Status von Ausgabestreams wie std manipuliert: :cout ermöglicht vielseitige Formatierungsoptionen. Manchmal ist es jedoch erforderlich, nach der Durchführung dieser Änderungen den ursprünglichen Zustand wiederherzustellen.

Bedenken Sie den folgenden Code:

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..
}

Hier ändert sich nach dem Aufruf von printHex der Status von std::cout zur hexadezimalen Ausgabe. Infolgedessen werden nachfolgende Druckvorgänge auch im Hexadezimalformat gedruckt, auch wenn der Programmierer dieses Verhalten möglicherweise nicht wünscht.

Um dieses Problem zu beheben, kann man die folgende Technik verwenden:

#include <iostream>

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

// Your code here...

cout.flags( f );

Von Wenn man die aktuellen Flags (Formatierungsoptionen) von std::cout in der Variablen f speichert, bevor man irgendwelche Manipulationen durchführt, kann man den ursprünglichen Zustand wiederherstellen, indem man die Flags nach dem gewünschten wieder auf f setzt Änderungen.

Alternativ kann man für bequemeren und objektorientierteren Code RAII (Resource Acquisition Is Initialization) wie folgt verwenden:

#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)
}

Das obige ist der detaillierte Inhalt vonWie setze ich „std::cout' nach Formatierungsänderungen auf seinen ursprünglichen Zustand zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn