2010-04-05 38 views

Trả lời

9

Edit: Bạn cũng có thể sử dụng std :: istream :: bỏ qua, xem https://stackoverflow.com/a/25012566/492336


Tôi có phải sử dụng getline số dòng tôi muốn bỏ qua?

Không, nhưng đây có thể là giải pháp rõ ràng nhất cho những người đọc mã của bạn. Nếu số lượng dòng bạn bỏ qua lớn, bạn có thể cải thiện hiệu suất bằng cách đọc các khối lớn và đếm các dòng mới trong mỗi khối, dừng và định vị lại tệp đến vị trí của dòng mới nhất. Nhưng trừ khi bạn đang gặp vấn đề về hiệu năng, tôi chỉ đặt đường dây trong vòng lặp cho số dòng bạn muốn bỏ qua.

+3

Đếm các dòng mới là sorta 'getline' lặp lại sẽ làm gì, đúng không? – GManNickG

+0

điều cần biết, thông tin tuyệt vời, cảm ơn !!!! – ufk

+0

@GMan - Lưu Unicorns: Có, nhưng bạn có thể sử dụng khối lớn hơn và dịch chuyển về phía trước một khoảng cách lớn hơn nếu bạn biết n lớn (tức là đếm nhiều hơn một dòng mới trong khối đệm) –

8

Có sử dụng std::getline trừ khi bạn biết vị trí của dòng mới.

Nếu vì một số lý do lạ bạn tình cờ biết vị trí của dòng mới xuất hiện thì bạn có thể sử dụng ifstream::seekg trước tiên.

Bạn có thể đọc theo các cách khác như ifstream::read nhưng std::getline có lẽ là giải pháp dễ nhất và rõ ràng nhất.

+0

+1 - hoặc ít nhất sẽ là +1 trong 13 phút khi tôi có phiếu bầu ... –

+2

+1 - thực tế lần này :) –

+0

@Billy: Thực sự sự chậm trễ của bạn đã cho tôi thêm 10 đại diện kể từ khi tôi đã ở giới hạn tối đa cho đến 10 phút trước. –

6

Đối với những gì nó có giá trị:

void skip_lines(std::istream& pStream, size_t pLines) 
{ 
    std::string s; 
    for (; pLines; --pLines) 
     std::getline(pStream, s); 
} 
11

Không, bạn không cần phải sử dụng getline chuỗi

Cách hiệu quả hơn là bỏ qua với std :: istream :: bỏ qua

for (int currLineNumber = 0; currLineNumber < startLineNumber; ++currLineNumber){ 
    if (addressesFile.ignore(numeric_limits<streamsize>::max(), addressesFile.widen('\n'))){ 
     //just skipping the line 
    } else 
     return HandleReadingLineError(addressesFile, currLineNumber); 
} 

HandleReadingLineLỗi không phải là standart nhưng làm bằng tay, tất nhiên. Tham số đầu tiên là số ký tự tối đa cần trích xuất. Nếu điều này là chính xác numeric_limits :: max(), không có giới hạn: Liên kết tại cplusplus.com: std::istream::ignore

Nếu bạn định bỏ qua nhiều dòng, bạn nên sử dụng nó thay vì getline: khi tôi cần để bỏ qua 100000 dòng trong tập tin của tôi mất khoảng một giây đối diện với 22 giây với getline.

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