2011-10-06 28 views

Trả lời

22

Đối với tệp, bạn chỉ có thể tìm kiếm bất kỳ vị trí nào. Ví dụ, để tua lại để bắt đầu:

std::ifstream infile("hello.txt"); 

while (infile.read(...)) { /*...*/ } // etc etc 

infile.clear();     // clear fail and eof bits 
infile.seekg(0, std::ios::beg); // back to the start! 

Nếu bạn đã đọc qua Cuối cùng, bạn phải thiết lập lại các cờ báo lỗi với clear() như @Jerry Coffin gợi ý.

+4

Tôi đã thử điều này và nó chỉ hoạt động nếu 'clear' được gọi là * trước *' seekg'. Xem thêm tại đây: http://cboard.cprogramming.com/cplusplus-programming/134024-so-how-do-i-get-ifstream-start-top-file-again.html – Frank

+0

@Frank: Cảm ơn, đã chỉnh sửa. Tôi cho rằng bạn không thể hoạt động trên một dòng không thành công ở tất cả, mà làm cho tinh thần. –

+0

Đối với người đọc trễ: Theo [tham chiếu cpp] (http://en.cppreference.com/w/cpp/io/basic_istream/seekg), việc xóa không cần thiết nữa kể từ C++ 11 ... – Aconcagua

4

Có lẽ ý bạn là trên iostream. Trong trường hợp này, luồng clear() của luồng sẽ thực hiện công việc.

2

Tôi đồng ý với câu trả lời ở trên, nhưng đã gặp phải vấn đề tương tự tối nay. Vì vậy, tôi nghĩ rằng tôi sẽ đăng một số mã đó là một chút hướng dẫn hơn và cho thấy vị trí dòng tại mỗi bước của quá trình. Có lẽ tôi nên kiểm tra ở đây ... TRƯỚC KHI ... Tôi đã dành một giờ để tự mình tìm ra điều này.

ifstream ifs("alpha.dat");  //open a file 
if(!ifs) throw runtime_error("unable to open table file"); 

while(getline(ifs, line)){ 
     //....../// 
} 

//reset the stream for another pass 
int pos = ifs.tellg(); 
cout<<"pos is: "<<pos<<endl;  //pos is: -1 tellg() failed because the stream failed 

ifs.clear(); 
pos = ifs.tellg(); 
cout<<"pos is: "<<pos<<endl;  //pos is: 7742'ish (aka the end of the file) 

ifs.seekg(0); 
pos = ifs.tellg();    
cout<<"pos is: "<<pos<<endl;  //pos is: 0 and ready for action 

//stream is ready for another pass 
while(getline(ifs, line) { //...// } 
Các vấn đề liên quan