ストリームバッファ実装のstd :: endlと '\ n'の違い
-
27-10-2019 - |
質問
現在、stringbufのサブクラスを実装して、バッファーが特定の文字(私の場合は「\ n」)をトークン化できるようにし、この文字が発生した場合にアクションを実行しようとしています(メッセージをロガーにダンプしてバッファーをクリアします)その後、私の場合)。 この目標を達成するために、sputc( '\ n'の監視を実装するため)とxsputn(GCC実装はデフォルトではこれを行わないように見えるため、実際にsputcを使用するため)をオーバーライドしました。 デバッグの目的で、sputcに渡された各文字をstdoutに書き出させます。
これが私の質問です:次のようなものを使用する場合 ジェネラコディセタグプレ
sputcは、std :: endlによって誘導される「\ n」を除く各文字を受け取ります。したがって、「\ n」が渡されないため、期待されるアクションは実行されません。 のようなものを使用する場合 ジェネラコディセタグプレ
または ジェネラコディセタグプレ
すべてが期待どおりに機能し、私のsputc実装は '\ n'文字を取得します。
つまり、私の質問は、両方のコード行が背後のstringbufに関してまったく同じことを行うべきではないか、そうでない場合は、「\ n」を取得するために他のどのメソッドをオーバーライドする必要があるかということです。
解決
sputc
は仮想ではないため、sputc
をオーバーライドすることはできません。overflow
とsync
をオーバーロードし、\n
の発生について保留中のシーケンス全体を調べる必要があります。
ストリームタイプをバックアップするデバイスについて何か特別なことを知っているので、最適なことを実行できない限り、xsputn
をオーバーロードする必要はありません。