ホームページ > バックエンド開発 > C++ > 一部の C イオマニピュレータが「粘着性」動作を示すのはなぜですか?

一部の C イオマニピュレータが「粘着性」動作を示すのはなぜですか?

Patricia Arquette
リリース: 2024-12-25 19:32:10
オリジナル
743 人が閲覧しました

Why Do Some C   Iomanipulators Exhibit

C におけるマニピュレータとその「スティッキー」な性質

C では、特定の iomanip マニピュレータは「スティッキー」として知られる動作を示し、次の時点までストリームに影響を与え続けます。明示的にリセットします。この動作は、次のコード スニペットに見られるように、予期しない結果を引き起こす可能性があります:

std::stringstream ss;
ss.fill('0'); ss.setf(ios::right, ios::adjustfield);
ss << setw(2) << timestruct.tm_mday;
ss << timestruct.tm_hour;
ss << timestruct.tm_min;
std::string filingTime = ss.str(); // BAD: '0794'
ログイン後にコピー

この例では、setw() マニピュレーターが tm_mday フィールドを幅 2 でフォーマットし、右揃えにすることを想定しています。出力。ただし、tm_hour と tm_min はフォーマットされずに出力されます。これは、setw() が「スティッキー」マニピュレーターではないためです。つまり、次の挿入操作にのみ影響します。

どのマニピュレーターがスティッキーですか?

コメントでの議論に基づいて、次のようになります。マニピュレーターは次のように分類されます'sticky':

  • setiosflags
  • resetiosflags
  • setbase
  • setfill
  • setprecision

これらのマニピュレータはすべてオブジェクトを返しますストリームではなく、ストリームに挿入される次のオブジェクトに対してのみ操作を実行することを示します。

Non-Stickyマニピュレーター

  • [no]boolalpha
  • [no]showbase
  • [n o]showpoint
  • [no]showpos
  • [no]skipws
  • [no]unitbuf
  • [no]大文字
  • dec/hex/oct
  • 固定/科学
  • 内部/左/右
  • ws/endl /ends/flush

これらマニピュレータは、後続の操作の状態に影響を与えることなく、ストリーム自体に対して操作を実行します。

例外: setw()

特に、setw() は、ストリーム上で異なる動作をするように見える唯一のマニピュレータです。作者のシステム。これは「スティッキー」マニピュレータではありませんが、次のコードに示すように、カスタム形式オブジェクトを使用したマニピュレータと同じように動作させることができます。

#include <iostream>
#include <iomanip>

struct SquareBracktAroundNextItem
{
    SquareBracktAroundNextItem(std::ostream& str) : m_str(str) {}
    std::ostream& m_str;
};

struct PutSquareBracket {};

SquareBracktAroundNextItem operator<<(std::ostream& str, PutSquareBracket const& data)
{
    return SquareBracktAroundNextItem(str);
}

template<typename T>
std::ostream& operator<<(SquareBracktAroundNextItem const& bracket, T const& data)
{
    std::ios_base::fmtflags flags = bracket.m_str.flags();
    std::streamsize currentPrecision = bracket.m_str.precision();

    bracket.m_str << '[' << std::fixed << std::setprecision(10) << data << std::setprecision(currentPrecision) << ']';

    bracket.m_str.flags(flags);

    return bracket.m_str;
}

int main()
{
    std::cout << 5.34 << "\n"                        // Before
              << PutSquareBracket() << 5.34 << "\n"  // Temp change settings.
              << 5.34 << "\n";                       // After
}
ログイン後にコピー

出力:

5.34
[5.3400000000]
5.34
ログイン後にコピー

要約すると、C のほとんどの iomanip マニピュレータは「スティッキー」です。つまり、明示的にリセットされるまでストリームに影響を与え続けます。 setw() は注目すべき例外ですが、カスタム フォーマット オブジェクトを使用して「スティッキー」にすることができます。

以上が一部の C イオマニピュレータが「粘着性」動作を示すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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