ホームページ >バックエンド開発 >C++ >関数が書式設定フラグを変更した後、「std::cout」の元の状態に戻すにはどうすればよいですか?

関数が書式設定フラグを変更した後、「std::cout」の元の状態に戻すにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-06 22:17:15141ブラウズ

How Can I Restore the Original State of `std::cout` After a Function Modifies Its Formatting Flags?

制御の回復: std::cout の整合性の復元

質問:

関数が次のようなシナリオで、これを printHex と呼びます。std::cout の状態を変更します (例:ベース、フィールド幅など)、関数呼び出し後に元の状態に戻すにはどうすればよいでしょうか?この問題は、std::cout を使用する後続の出力が printHex 内で行われた状態変更によって破損した場合に発生します。

回答:

std::cout と元の設定に戻すと、 の機能を利用できるようになります。ヘッダー (または ヘッダー)。この復元プロセスには 2 つの重要な手順が含まれます:

  1. 現在の状態をキャプチャする: std::ios_base::fmtflags f(cout.flags()) を使用して、現在のフォーマット フラグを取得します。そしてそれらを f という名前の変数に保存します。これにより、printHex によって変更される前に std::cout の状態がキャプチャされます。
  2. 元の状態に戻す: printHex がタスクを完了すると、std の元の設定を復元できます。 cout.flags(f) を呼び出して ::cout を実行します。このアクションにより、std::cout が関数呼び出し前の状態にリセットされ、後続の出力操作が期待どおりに機能することが保証されます。

あるいは、リソース取得は初期化を使用して復元プロセスを実装することもできます。 (RAII) フラグを自動的に管理するイディオム。以下に例を示します:

class RestoreCoutFlags {
public:
    RestoreCoutFlags(std::ostream& stream)
        : _savedFlags(stream.flags()) {}

    ~RestoreCoutFlags() {
        stream.flags(_savedFlags);
    }

    operator std::streambuf*() const {
        return stream.rdbuf();
    }

private:
    std::ios_base::fmtflags _savedFlags;
};

このクラスを使用すると、次のように復元を実現できます:

{
    RestoreCoutFlags r(std::cout);

    // Code that modifies std::cout flags

} // When the block exits, r is automatically destroyed, restoring the flags.

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。