問題タブ [manipulators]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - iostream は、読み取る文字の最大数を制限します
Bruce Eckel の「Thinking in C++」の助けを借りて C++ を学習します。「Iostreams」の章の演習 05 で行き詰まりました:
演習テキスト
setw( ) で最小限の文字数しか読み取れないことはわかっていますが、最大数の文字数を読み取りたい場合はどうすればよいでしょうか? ユーザーが抽出する文字の最大数を指定できるようにするエフェクターを作成します。幅の制限内に収まるように、必要に応じて出力フィールドが切り捨てられるように、エフェクターを出力用にも機能させます。
パラメータを使用しない場合と使用する場合の両方でマニピュレータを作成する方法を理解しています (本の用語ではエフェクタと呼ばれます)。ただし、抽出する最大文字数を制限する方法がわかりません。std::ios_base::width
最小文字数を指定します。
streambuf
基になるオブジェクトでいくつかのトリックを行う必要がありますか?
c++ - インデント付きのc++カスタム出力ストリーム
カスタムストリームクラスを実装して、出力ファイルに適切にインデントされたコードを生成しようとすると、問題が発生します。私はオンラインで広範囲に検索しましたが、これを達成するための最良の方法についてのコンセンサスはないようです。ストリームの導出について話す人もいれば、バッファの導出について話す人もいますが、ロケール/ファセットなどの使用を提案する人もいます。
基本的に、私は次のようなコードをたくさん書いていることに気づいています。
タブが増え始めると、それはひどいように見えます、そしてそれはこのようなものを持っているといいようです:
つまり、現在のインデントの深さを追跡する派生ストリームクラスを作成し、次にインデントの深さを増減するマニピュレータ、および改行の後にいくつものタブを書き込むマニピュレータを作成します。
これが、クラスとマニピュレータの実装に関する私のショットです。
ind_ofstream.h
ind_ofstream.cpp
これはビルドされますが、期待される出力を生成しません。カスタムマニピュレータを使用しようとすると、何らかの理由でブール値にキャストされ、ファイルに「1」が書き込まれます。新しいクラスの<<演算子をオーバーロードする必要がありますか?(私はこれを構築する方法を見つけることができませんでした)
ありがとう!
ps
1)スペースを節約するために、コードスニペットから名前空間などを使用して#includesを省略しました。
2)2番目のコードスニペットにあるようなインターフェイスを使用できるようにすることを目指しています。投稿全体を読んだ後、それが悪い考えだと思う場合は、その理由を説明し、代替案を提供してください。
c++ - 標準のC++MoneyPunct / put_moneyバグ?
これらの為替操作国に関する文書はほとんどないようです。私はこれを試行錯誤で理解しようとしています。サンプルプログラムを考えてみましょう。
このコードの問題は、12,345.67を出力することです。小数点以下が失われただけでなく、100倍ずれているため、これはかなり悪いことです。MSVC++ STLの実装を見ると、かなり困惑していました。
doubleを取るが、すべての小数を切り落とすsprintfを持つ関数を観察します。車輪の再発明をやり直す前に、ここでC++の専門家の意見を聞きたいと思います。
c++ - C++ のストリーム マニピュレータを使用して固定幅フィールドのテキストを中央揃えにする
printf
概念的には次のように見えるプレーンテキストのテーブルヘッダーを出力するために、(実際の書式設定なしで) long 文字列を使用しているいくつかのレガシーコードをリファクタリングしています:
現在、次のように作成されています。
1の効果を持つコードを使用して上記を作成したいと思います。
<iomanip>
ストリームマニピュレータstd::left
、std::right
およびがあるため、コンパイルされませんstd::internal
が、 はないようですstd::center
。標準の C++ ライブラリで既にこれを行うクリーンな方法はありますか、それとも必要な間隔を手動で計算する必要がありますか?
1これは C コードよりも冗長ですが、printf
ステートメントの数と文字列内の固定重複の量により、長期的にはそれほど冗長ではなくなります。また、拡張性と保守性も向上します。
c++ - ストリームマニピュレータのテンプレートタイプの推定
このコードがコンパイルされないかどうかはわかりません。
私が使用しているサンプルコード:
これはエラーです:
endl
の代わりに(ostream& (*)(ostream&)
)の関数型を使用できない理由については混乱していますT
。ここで、指定すると明らかに問題ありません。cout << endl;
これで問題が解決するのはさらに不可解だと思います[編集済み]
質問が明確でない場合は、そもそもなぜテンプレートを推測できなかったのかを尋ねています。
c++ - スレッドセーフなログ クラスに対する私のアプローチはひどいものですか?
私はスレッドセーフロギングの問題に対するさまざまなアプローチを見てきましたが、このようなものはまったく見たことがありません。および iostream。私が行った基本的なテストではうまくいくようです。
基本的に、標準マニピュレータ用に設定された operator<< を持つ Log クラス (クリエイティブ、私は知っています...) を持っているので、好きなものを喜んで渡すことができます。
ただし、次のようなことは承知しています。
複数のスレッドが cout (または Log ostream が指している場所) に書き込みを行っている場合、インターリーブされる可能性があります。そのため、これを可能にする Log クラスに固有のマニピュレータをいくつか作成しました。
これが本質的にひどい考えであるかどうかを知りたいだけです.Logクラスのユーザーは「ロック」と「ロック解除」で訓練する必要があることを喜んで受け入れることを念頭に置いて. 「std::endl」を自動的にロック解除することを検討しましたが、それはより多くの頭痛の種を作成するように思われます... どうせテストで無秩序な使用法が出てくると思いますが、そのような使用法がコンパイルを引き起こす方法を誰かが見ることができれば-タイムエラー、いいですね。
また、コードをよりクリーンにするための提案もいただければ幸いです。
これは、デモンストレーション用のクラスの縮小バージョンです。全体には、ファイル名のようなものを取るコンストラクターがさらにいくつかあるため、質問にはあまり関係ありません。
以下でコンパイルされたUbuntu 12.04 g ++で動作します。
カスタムマニピュレータの作成に関連するビットは、恥知らずにここから盗まれましたが、私の無能なコピーパスタのせいにしないでください.
c++ - このマニピュレータの使用方法
これは学校向けの演習なので、完全な例ではなく、ヒントだけを提供してください ;-)
私は自分のマニピュレータを持っています:
フォームでマニピュレータを書かなければならないので、私はこれを書きましたios_base& my_manip(basic_ios&)
。
このように使用すると(戻り値を使用せずに):
...それはうまくいきます。しかし、そのように使用すると:
これは機能しません (後述のように std::ios_base には operator<<() がないため)。
一般的に、何ios_base& my_manip(basic_ios&)
が役立つのかわかりません...ヒント/例はありますか?
あなたたちはすでに私をたくさん助けてくれました!私がまだ理解していないのは、合格しbasic_ios
て恩返しをする動機ios_base
です(私が解決しなければならない演習でそれを行うことが提案されているため...)。これを使用する可能性のあるシナリオは何ですか???
c++ - std::flush マニピュレータ関数のアドレスを静的 const 変数に以前に格納されたアドレスと等しくない
ストリーム挿入演算子をオーバーロードするロガー クラスを開発しています。std::flush
マニピュレーターをキャッチするのに苦労しています。
まず、私がやっていることの簡単な要約:
のオブジェクトが与えられた場合LogClass
、次のことを行います。
std::flush
...そしてマニピュレータをキャッチします。
すべての入力は、次のインライン演算子によって後でログに記録するために、内部文字列ストリームに直接送信されます (正常に動作します)。
次のようにオーバーロードしてマニピュレーターをキャッチしようとしてstd::flush
います (これも正常に動作します)。
flushFunc
次のように、ローカル変数を静的にしようとすると問題が発生します。
この場合、着信manip
ポインタの値はと等しくありませんflushFunc
。
何故ですか?std::flush
の関数のテンプレートのインスタンス化と関係がありますchar
か?
MS Visual Studio 2010 Pro を使用しています。
この問題は、次の小さな作業コード スニペットにも示されています。
...これにより、私のマシンで次の出力が得られます。
何か案は?
よろしく、 Rein A. Apeland