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

フォーマットフラグを変更した後に std::cout を元の状態に戻すにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-02 15:11:13
オリジナル
672 人が閲覧しました

How Can I Restore the Original State of std::cout After Modifying its Formatting Flags?

変更後の std::cout の状態の復元

C では、入出力ストリームを操作すると、その状態が一時的に変更されることがあります。たとえば、以下のコード スニペットは std::cout の基数を 16 進数に変更します:

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 進数が使用され、潜在的に予想外の結果。これに対処するには、std::cout の元の状態を復元する方法が必要です。

解決策

解決策には、std::ios_base::fmtflags の使用が含まれます。ストリームの書式設定フラグをキャプチャして復元するクラス。その方法は次のとおりです。

  1. Include または
  2. std::cout を変更する関数の先頭:

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

    これにより、現在の書式設定フラグが f 変数に保存されます。

  3. 必要な変更を実行します。 std::cout.
  4. ストリームを元の状態に戻した後の関数の終了時:

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

    これにより、最初にキャプチャされた書式設定フラグが復元されます。のfunction.

  5. 以下のコード スニペットでは、restoreCoutState 関数が std::cout:

    の状態をキャプチャして復元します。
    void restoreCoutState(std::ostream& os){
        std::ios_base::fmtflags f( os.flags() );
        os << std::hex << 123;
        os.flags( f );
    }
    
    int main(){
        std::cout << 100; // prints 100 base 10
        restoreCoutState(std::cout); // prints 123 in hex
        std::cout << 73; // prints 73 base 10
    }
    ログイン後にコピー

    以上がフォーマットフラグを変更した後に std::cout を元の状態に戻すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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