簡體   English   中英

ifstream如何使用C ++從特定行開始讀取行

[英]ifstream how to start read line from a particular line using c++

我正在使用ifstream解析C ++代碼中的文件。 我無法使用seekg()tellg()跳轉到代碼的特定行。

特別是,我想使用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 {
        // todo: handle the error
    }
}

第一個參數是要提取的最大字符數。 如果這恰好是numeric_limits :: max(),則沒有限制。

由於性能更好,因此應使用is代替std :: getline。

似乎沒有滿足您需要的特定C ++函數,例如“ seekline”,我看到了兩種解決此任務的方法:

  1. 初步,您可以使用空格擴展文本文件中的每一行,以達到恆定的長度L。 比,要查找所需的行N ,只需使用具有L * N偏移量的seekg
  2. 這種方法比較復雜。 您可以創建一個輔助二進制文件,該文件的每個字節將保持源文件每一行的長度。 該輔助文件是一種數據庫。 接下來,您必須在初始化階段將此二進制文件加載到程序中的數組中。 文本文件中所需行的偏移量應計算為前N個數組元素的總和。 當然,有必要同時更新輔助文件和源文件。

如果文本文件符合其大小要求,則第一種情況會更有效。 第二種情況為長文本文件和罕見的編輯操作帶來了最佳性能。

暫無
暫無

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

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