簡體   English   中英

跳過std :: istream中的行

[英]Skip lines in std::istream

我正在使用std :: getline()從std :: istream派生類中讀取行,如何前進幾行?

我是否必須閱讀並丟棄它們?

不,您不必使用getline

更有效的方法是使用std :: istream :: ignore忽略字符串

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);
}

當然,HandleReadingLineError不是標准的而是手工制作的。 第一個參數是要提取的最大字符數。 如果這恰好是numeric_limits :: max(),則沒有限制:cplusplus.com上的鏈接: std :: istream :: ignore

如果您要跳過很多行,那么您絕對應該使用它而不是getline:當我需要跳過文件中的100000行時,使用getline花費的時間與22秒相反,大約需要一秒鍾。

編輯:您也可以使用std :: istream :: ignore,請參閱https://stackoverflow.com/a/25012566/492336


我是否必須使用getline我要跳過的行數?

不,但是對於那些閱讀您的代碼的人來說,這可能是最清晰的解決方案。 如果要跳過的行數很大,則可以通過讀取大塊並在每個塊中計數換行符,停止並將文件重新定位到最后一個換行符的位置來提高性能。 但是除非您遇到性能問題,否則我只是將getline放在循環中,以獲取要跳過的行數。

是的,除非您知道換行符的位置,否則請使用std::getline

如果由於某種奇怪的原因而碰巧知道換行出現的位置,則可以先使用ifstream::seekg

您可以用其他方式閱讀,例如ifstream::readstd::getline可能是最簡單,最清晰的解決方案。

物有所值:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM