2014-12-06 15 views
5

chương trình của tôi đọc một dòng từ một tập tin văn bản sử dụng:Quay trở lại một dòng trên một tập tin văn bản C++

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

Và nếu nó tìm thấy một cái gì đó mà tôi đang tìm (tag) nó lưu dòng đó trong một chuỗi tạm thời. Tôi không thể tiếp tục điều này cho đến khi tôi tìm thấy một số thẻ khác, nếu tôi tìm thấy một thẻ khác tôi muốn để có thể quay trở lại dòng trước đó để chương trình đọc nếu một lần nữa như một số thẻ khác và làm cái gì khác.

Tôi đã xem xét putback() và unget() tôi nhầm lẫn về cách sử dụng chúng và nếu chúng có thể là câu trả lời đúng.

+1

Tôi nghĩ rằng ['std :: istream :: seekg'] (http://en.cppreference.com/w/cpp/io/basic_istream/seekg) hòa hợp với độ dài của dòng bạn vừa đọc có thể có phần nào hữu ích. – WhozCraig

Trả lời

6

Tốt nhất là xem xét thuật toán một lần, lưu trữ trong bộ nhớ những gì nó có thể cần ở thẻ đầu tiên mà không cần quay lại.

Nếu đây là không thể, bạn có thể "đánh dấu" vị trí dòng và truy xuất nó sau này với tellg()seekg():

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

Nếu bạn đọc thẻ đệ quy nhúng (html ví dụ), bạn thậm chí có thể sử dụng a stack<streampos> để đẩy và bật các vị trí trong khi đọc. Tuy nhiên, lưu ý rằng hiệu năng bị chậm lại bởi các truy cập chuyển tiếp/lùi.

Bạn đề cập đến putback()unget(), nhưng chúng được giới hạn ở một char và dường như không phù hợp với cách tiếp cận getline() của bạn.

1

Điều dễ nhất từ ​​trước đến nay, nếu bạn chỉ muốn quay lại một dòng, luôn theo dõi đường bạn đang ở trên dòng trước đó.

Duy trì biến số cur lưu trữ dòng hiện tại và prev lưu cửa hàng trước đó. Khi bạn chuyển sang dòng tiếp theo, bạn sao chép cur vào prev và đọc dòng mới vào cur.

Bằng cách đó, bạn luôn có sẵn dòng trước đó.

Các vấn đề liên quan