2014-12-06 26 views
5

mój program odczytuje linię z pliku tekstowego przy użyciu:Wróć jednej linii w pliku tekstowym C++

std::ifstream myReadFile("route.txt"); 
getline(myReadFile, line) 

A jeśli znajdzie coś, szukam (tag) przechowuje tej linii w sposób temp String. Nie będę kontynuował tego, dopóki nie znajdę jakiegoś innego znacznika, jeśli znajdę inny znacznik, chcę móc powrócić do poprzedniej linii, aby program mógł odczytać, jeśli znowu, jak jakiś inny tag i zrobić coś innego.

Spoglądam na putback() i unget() Jestem mylący, jak z nich korzystać i czy mogą być poprawną odpowiedzią.

+1

Myślę, że ['std :: istream :: seekg'] (http://en.cppreference.com/w/cpp/io/basic_istream/seekg) w połączeniu z długością linii, którą właśnie przeczytałeś, może być nieco pomocny. – WhozCraig

Odpowiedz

6

Najlepiej byłoby rozważyć algorytm jednoprzebiegowy, który przechowuje w pamięci to, czego może potrzebować przy pierwszym tagu bez powrotu.

Jeśli nie jest to możliwe, można „zakładka” pozycja strumień i retreive go później tellg() i seekg():

streampos oldpos = myReadFile.tellg(); // stores the position 
.... 
myReadFile.seekg (oldpos); // get back to the position 

Jeśli czytasz rekurencyjnie wbudowanych tagów HTML (na przykład), można nawet użyć a stack<streampos> do popychania i pop pozycji podczas czytania. Należy jednak pamiętać, że wydajność jest spowolniona dzięki takim dostępom do przodu/do tyłu.

Podajesz putback() i unget(), ale są one ograniczone do jednego znaku i wydają się nieodpowiednie dla twojego podejścia getline().

1

Najłatwiejszą rzeczą, jeśli chcesz cofnąć się o jedną linię, zawsze jest śledzenie linii, na której jesteś i linii wcześniej.

Zachowaj zmienną cur, która przechowuje bieżącą linię, a prev, która przechowuje poprzednią. Po przejściu do następnej linii kopiujesz cur do prev i czytasz nową linię w cur.

W ten sposób zawsze dostępna jest poprzednia linia.

Powiązane problemy