2012-06-23 11 views
5

Chcę zapewnić funkcję podobną do zakładki dla strumieni wyjściowych tekstu w C++. Ta funkcja powinna pozwolić mi powiedzieć "zanotuj tę pozycję", a następnie pozwól na wiele operacji wstawiania, a na koniec pozwól mi powiedzieć "dodaj tyle znaków wypełnienia, aby zakończyć postacie o jeden za pierwotnie zanotowaną pozycją".dlaczego cout.tellp zawsze zwraca -1?

Standardowy system iostream wydaje się nie utrzymywać pozycji kolumny, ale pomyślałem, że mogę go sfałszować za pomocą tellp(). Moje założenie było takie, że różnica między tellp() w dwóch punktach w mojej sekwencji wyjściowej odpowiadałaby liczbie pośrednich bajtów.

Niestety, przynajmniej w moim środowisku Gnu C++, cout nie utrzymuje fikcji pozycji strumienia. Każdy telefon cout.tellp() zadzwoń pod numer returns -1. Dlaczego?

+6

'tellp' nigdy nie jest pozycja kolumny w każdym strumieniu. Ma to sens tylko w dostępnych strumieniach. –

+1

@ R.MartinhoFernandes jest poprawny. 'tellp' ma ci powiedzieć, jaką wartość podać' seekp', aby powrócić do aktualnej pozycji. W tym przypadku mówi, że nie ma takiej możliwości. Entabbing musi być wspierany w inny sposób. –

+0

Dziękuję wam obojgu. To był związek z szukaniem, którego nie udało mi się pojąć. –

Odpowiedz

2

tellp zwraca pozycję w strumieniu, aby można było do niej dążyć. Konsola nie zezwala na wyszukiwanie. Poza tym, nawet ty interpretujesz pozycję jako "liczbę bajtów zapisanych w strumieniu, odkąd został utworzony", liczba ta nie będzie przydatna do pozycjonowania kursora - ekran zawija się, jego szerokość jest generalnie nieprzewidywalna. Po prostu nie wiesz, w której kolumnie się znajdujesz, ponieważ długość wiersza jest zmienna.

Jeśli chcesz uzyskać sensowne pozycjonowanie kursora na ekranie, sprawdź specyfikację terminala ANSI i zawarte w nim komendy sterujące. Pozwalają one na odnajdywanie i umieszczanie pozycji kursora.

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

+0

Dzięki Seva. To był związek pomiędzy seekp i tellp, których nie udało mi się zrozumieć. –

+0

Dzięki @Seva. Nie próbuję manipulować kursorem. W przypadku alignmnet chciałem po prostu wysłać lewostronne wartości z końcową interpunkcją do kolumn o stałej szerokości (np. "1:" i "12:"). Ponieważ pociąga to za sobą więcej niż jedna operacja wstawiania, standardowy manipulator width() jest niewystarczający. Jeśli ponownie przeczytasz moje oryginalne pytanie, zobaczysz, że nie miałem zamiaru interpretować tellp() jako pozycji kolumny. To była różnica pomiędzy dwoma wywołaniami funkcji tellp(), która, jak się spodziewałem, pozwoli mi określić, ile bajtów wstawiono między nie. –