2012-06-23 58 views
5

我想爲C++文本輸出流提供類似標籤的功能。該功能應該允許我說「注意這個位置」,然後允許多次插入操作,最後讓我說「添加足夠的填充字符,以便最終在最初記錄的位置之後結束字符」。爲什麼cout.tellp總是返回-1?

標準iostream系統似乎不能保持列位置,但我曾想過我可以使用tellp()來僞造它。我的假設是,我的輸出序列中兩點處的tellp()之間的差異將對應於中間字節的數量。

不幸的是,至少在我的Gnu C++環境中,cout不保留流位置的小說。每cout.tellp()請致電returns -1。這是爲什麼?

+6

'tellp'從來不是任何流中的列位置。它只在可尋求的流中才有意義。 –

+1

@ R.MartinhoFernandes是正確的。 'tellp'應該告訴你爲'seekp'提供什麼值以回到當前位置。在這種情況下,它告訴你沒有這種可能性。 Entabbing必須得到其他方面的支持。 –

+0

謝謝你們兩位。這是seekp的關係,我沒有把握。 –

回答

2

tellp在流中返回一個位置,以便您可以找到它。控制檯不允許尋求。此外,即使您將位置解釋爲「自創建之後寫入流的字節數」,該數字對於光標定位而言將沒有任何用處 - 屏幕環繞,其寬度通常是不可預知的。由於行長是可變的,你只是不知道你在哪個列上。

如果你想在屏幕上定位合理的光標,請查看ANSI終端規格和隨其附帶的轉義命令。它們允許光標位置發現和放置。

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

+0

謝謝Seva。 seekp和tellp之間的關係是我沒有把握的。 –

+0

謝謝@Seva。我不想做光標操作。對於alignmnet,我只是想將帶有標點符號的左對齊值發送到固定寬度列(例如「1:」和「12:」)。因爲這需要更多的單個插入操作,所以標準寬度()操縱器不夠。如果您重讀我最初的問題,您會看到我不打算將tellp()解釋爲列位置。這是兩次對tellp()的調用之間的區別,我期望能夠確定它們之間插入了多少個字節。 –