2012-06-23 7 views
5

C++のテキスト出力ストリームにタブのような機能を提供したい。この機能は私に "この位置を書き留めて"と言って、複数の挿入操作を許して、最後に "最初に指摘された位置を超えてN文字になるように十分な文字を追加する"ことを許可するべきです。なぜcout.tellpは常に-1を返しますか?

標準iostreamシステムでは列の位置は維持されていないようですが、私はtellp()を使って偽造することができると考えていました。私の前提は、出力シーケンスの2つの点におけるtellp()の違いは、介在するバイトの数に対応するということでした。

残念ながら、少なくとも私のGnu C++環境では、coutはストリーム位置のフィクションを維持しません。すべてcout.tellp()returns -1としてください。何故ですか?

+6

'tellp'は決してストリーム内の列位置にはなりません。シーク可能なストリームでのみ意味があります。 –

+1

@ R.MartinhoFernandesは正しいです。 'tellp'は現在の位置に戻るための' seekp'にどのような値を渡すべきかを伝えます。この場合、そのような可能性はないことを伝えています。 Entabbingは他の方法でサポートされなければならない。 –

+0

ありがとうございます。私が把握できなかったことを求めることは、関係性でした。 –

答えて

2

tellpはストリーム内の位置を検索して検索します。コンソールはシークを許可しません。さらに、位置を "作成されてからストリームに書き込まれたバイト数"と解釈しても、その数はカーソルの位置付けには使用されません。画面が折り返され、その幅は一般的に予測できません。行の長さが可変であるため、現在表示されている列はわかりません。

カーソルの位置を画面上で適切に設定したい場合は、ANSI端末の仕様とそれに付属するエスケープコマンドを確認してください。カーソル位置の検出と配置が可能です。

http://ascii-table.com/ansi-escape-sequences.php

+0

Sevaに感謝します。 seekpとtellpとの関係は私が理解できなかった。 –

+0

ありがとう@Seva。私はカーソル操作をしようとしていません。 alignmnetでは、後ろの句読点を固定幅の列(たとえば、「1:」と「12:」)にして左揃えの値を出力したかっただけです。これは、1回の挿入操作で標準のwidth()マニピュレータが不十分であるためです。あなたが私の元の質問を読んだ場合、私はtellp()を列の位置として解釈しようとはしなかったことがわかります。 tellp()への2回の呼び出しの間に、私はそれらの間にいくつのバイトが挿入されているかを判断できるとの違いがありました。 –

関連する問題