「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > C++ で後続の出力に影響を与えるカスタム ストリーム マニピュレータを作成するにはどうすればよいですか?

C++ で後続の出力に影響を与えるカスタム ストリーム マニピュレータを作成するにはどうすればよいですか?

2024 年 11 月 14 日公開
ブラウズ:478

How to Create Custom Stream Manipulators that Affect Subsequent Outputs in C  ?

C で後続の出力を変更するためのカスタム ストリーム マニピュレーター

C では、ストリーム マニピュレーターは、入出力操作をカスタマイズおよび強化するための強力なツールです。一般的なマニピュレータの 1 つは std::hex で、後続の数値出力の形式を 16 進数に変更します。

ただし、ストリームに要素を追加するだけでなく、項目の値も変更するマニピュレータが必要な場合はどうすればよいでしょうか。その後に来るのは?この記事では、このようなマニピュレータの作成方法を検討し、簡単な例でその使用例を示します。

状態ストレージを使用したカスタム マニピュレータ

ストリーム上の後続の項目を変更するには、各ストリームに関連付けられた状態情報を保存する必要があります。これは、ios_base::iword 関数と、xalloc.

inline int geti() {
    static int i = ios_base::xalloc();
    return i;
}

このメカニズムを導入すると、add_one と add_none という 2 つのマニピュレータを定義できます。 add_one は保存された状態を 1 に設定し、add_none はそれを 0 に設定します。 add_one(ostream& os) { os.iword(geti()) = 1; OSを返します。 } オーストリーム& add_none(ostream& os) { os.iword(geti()) = 0; OSを返します。 }

ostream& add_one(ostream& os) { os.iword(geti()) = 1; return os; }
ostream& add_none(ostream& os) { os.iword(geti()) = 0; return os; }
数値出力のカスタマイズ

C の数値出力はファセットによって処理されます。数値出力の動作を変更するには、カスタム ファセットを定義できます。ここでは、保存された状態値によって各数値をインクリメントする my_num_put というカスタム ファセットを作成します。 { iter_type do_put(iter_type s, ios_base& f, char_type fill, long v) const { return num_put::do_put(s, f, fill, v f.iword(geti())); } iter_type do_put(iter_type s, ios_base& f, char_type fill, unsigned long v) const { return num_put::do_put(s, f, fill, v f.iword(geti())); } };

マニピュレータのテスト
ostream& add_one(ostream& os) { os.iword(geti()) = 1; return os; }
ostream& add_none(ostream& os) { os.iword(geti()) = 0; return os; }

カスタム マニピュレータをテストするには、出力ストリームに新しいファセットを埋め込み、マニピュレータを使用して数値出力を変更します。int main() { // 出力: 11121011 cout.imbue(locale(locale(), new my_num_put)); コート

この例では、出力ストリームは数値 10、11、10、および 11 を出力します。最初の 2 つの数値のそれぞれに値 1 が追加され、結果は 11、12、10、および 11 になります。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3