2012-10-15 30 views
5

Sau khi tôi đọc một dòng từ một tệp bằng cách sử dụng ifstream, có cách nào để đưa luồng trở lại đầu dòng mà tôi vừa đọc, có điều kiện không?Làm cách nào để trả về ifstream về đầu dòng đã được đọc trong C++?

using namespace std; 
//Some code here 
ifstream ifs(filename); 
string line; 
while(ifs >> line) 
{ 
    //Some code here related to the line I just read 

    if(someCondition == true) 
    { 
    //Go back to the beginning of the line just read 
    } 
    //More code here 
} 

Vì vậy, nếu someCondition là đúng, dòng tiếp theo được đọc trong lần lặp trong vòng lặp tiếp theo sẽ là cùng dòng mà tôi vừa đọc ngay bây giờ. Nếu không, lặp lại trong vòng lặp tiếp theo sẽ sử dụng dòng sau trong tệp. Nếu bạn cần làm rõ thêm, xin đừng ngần ngại hỏi. Cảm ơn trước!

CẬP NHẬT # 1

Vì vậy, tôi thử như sau:

while(ifs >> line) 
{ 
    //Some code here related to the line I just read 
    int place = ifs.tellg(); 
    if(someCondition == true) 
    { 
    //Go back to the beginning of the line just read 
    ifs.seekg(place); 
    } 
    //More code here 
} 

Nhưng nó không đọc cùng một dòng một lần nữa khi điều kiện là đúng. Là một số nguyên một loại chấp nhận được ở đây?

CẬP NHẬT # 2: Giải pháp

Có lỗi trong logic của tôi. Dưới đây là phiên bản chỉnh sửa mà làm việc như tôi muốn nó cho bất kỳ những người tò mò:

int place = 0; 
while(ifs >> line) 
{ 
    //Some code here related to the line I just read 

    if(someCondition == true) 
    { 
    //Go back to the beginning of the line just read 
    ifs.seekg(place); 
    } 
    place = ifs.tellg(); 
    //More code here 
} 

Các cuộc gọi đến tellg() đã được chuyển đến cùng vì bạn cần phải tìm cách đầu đọc trước đó hàng. Lần đầu tiên xung quanh tôi gọi là tellg() và sau đó được gọi là seekg() trước khi luồng thậm chí thay đổi, đó là lý do tại sao nó có vẻ như không có gì thay đổi (bởi vì nó thực sự đã không). Cảm ơn tất cả các bạn vì những đóng góp của bạn.

+1

Sử dụng tellg() để lấy vị trí luồng trước khi bạn đọc dòng và xemkg() để đặt vị trí dòng cho vị trí bạn đã lưu trước đó. –

+1

Nhân tiện, nếu >> chuỗi không nhận được dòng, nhưng từ. Sử dụng std :: getline –

+0

Cảm ơn về getline. Nó có thể đã gây ra lỗi gây phiền nhiễu trong tương lai. –

Trả lời

3

Không có cách nào trực tiếp để nói "lấy lại cho sự bắt đầu của dòng cuối cùng". Tuy nhiên, bạn có thể quay lại vị trí bạn đã giữ bằng cách sử dụng std::istream::tellg(). Tức là, trước khi đọc một dòng bạn muốn sử dụng tellg() và sau đó seekg() để quay lại vị trí.

Tuy nhiên, việc gọi hàm tìm kiếm thường xuyên là khá tốn kém, tức là, tôi sẽ xem xét xóa yêu cầu đọc lại dòng.

+0

Cảm ơn. Hiệu quả không phải là mối quan tâm trước mắt của tôi, nhưng tôi sẽ cố gắng xem xét một số phương tiện khác để thực hiện nó sau này. Ngay bây giờ trọng tâm chính của tôi là chỉ nhận được một cái gì đó hoạt động. –

+0

Tôi cần phải đọc các ký tự từ một tệp 40GB trong một hàm cho đến khi tôi nhấn một ký tự (ký tự dấu tách) mà hàm không nên đọc. Đang sử dụng peek() ít tốn kém hơn hoặc tellg() seekg() để đánh dấu vị trí ký tự trước đó, mà tôi cần phải quay lại? Tôi đoán hiệu quả nhất sẽ là không sử dụng bất kỳ điều này và chỉ trả lại ký tự đọc thêm. – bkarj

+0

@BehroozKarjoo: sử dụng 'peek()' khá rẻ. Về cơ bản nó có 'trả về this-> gptr()! = This-> egptr()? * this-> gptr(): this-> underflow(); '(nó đúng mở rộng' char' thành 'int', mặc dù). Giả sử luồng được đệm, đây là con trỏ chuột và một tham số. Lệnh gọi 'peek()' hoạt động nhiều hơn. –

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