ホームページ > バックエンド開発 > C++ > フォーマット変更後に「std::cout」を元の状態にリセットするにはどうすればよいですか?

フォーマット変更後に「std::cout」を元の状態にリセットするにはどうすればよいですか?

DDD
リリース: 2024-12-02 10:57:11
オリジナル
954 人が閲覧しました

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

操作後に std::cout の状態を復元する方法

C で、 std などの出力ストリームの状態を操作します。 :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 の状態が変更されます。 16 進数出力に変換します。その結果、プログラマがこの動作を望まない場合でも、後続の印刷操作も 16 進数で印刷されます。

この問題に対処するには、次の手法を利用できます。

#include <iostream>

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

// Your code here...

cout.flags( f );
ログイン後にコピー

By操作を実行する前に 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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート