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

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

Barbara Streisand
Barbara Streisandオリジナル
2024-12-07 00:49:13302ブラウズ

How Can I Restore the Original State of std::cout After Manipulating Its Formatting Flags?

操作後の std::cout 状態の復元

C で、 std::cout などの I/O ストリームの状態を変更する、その後の操作で意図しない結果が生じる可能性があります。次のコード スニペットを考えてみましょう:

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

この例では、std::cout が printHex 関数によって変更され、16 進数で出力されます。ただし、この変更は main に戻っても持続し、std::cout を使用した後続の出力が 10 進数ではなく 16 進数で表示されます。

この問題に対処するには、std::cout の元の状態に戻す必要があります。 printHex 関数が終了した後。これは、std::ios_base の flags メンバー関数を使用して実現できます。

#include <ios>
#include <iostream>

int main(){
    std::ios_base::fmtflags f( std::cout.flags() );

    std::cout << 100; // prints 100 base 10
    printHex(std::cout); //prints 123 in hex

    std::cout.flags( f );

    std::cout << 73; //prints 73 base 10
}

変更する前に std::cout.flags() を使用して現在のフラグをキャプチャすると、std:: を使用してそれらを復元できます。 cout.flags(f) を使用して、ストリームの状態を元の形式にリセットします。

この手法により、I/O ストリームを一時的に変更できます。プロパティを設定し、後続の I/O 操作が期待どおりに実行されるようにします。

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

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