簡體   English   中英

C ++只讀文件中的隨機行

[英]C++ Read only random lines in a file

我需要讀取文本文件,但是它太大了,因此我決定只讀取此文件中的某些行。 我可以對跳轉給定的行使用搜索方法嗎? 然后我只能讀取該行,因為該文本文件太大,讀取整個文件浪費了很多時間。 如果不可能,那么誰能提供更好的解決方案? (尋找給定的行並讀取)(我知道二進制文本文件正在逐字節讀取)

我檔案的前

event1 0

subevent 1

subevent 2

event2  3 

(在我的文件中,一個事件發生后,其顯示的行數是我要查找的上一個事件的行數)

是的,您可以在文件中尋找一個點,然后從那里讀取。 一個可能的問題是,如果行的長度都不同,則文件中的隨機位置出現在較長行中的可能性更高:您不會獲得不同行的平均分布概率。 如果您確實確實具有相同的概率,那么您需要對文件進行至少一次遍歷才能找到每一行的開頭-然后,您可以將這些偏移量存儲在向量中,並隨機選擇一個向量元素來指導尋找行數據在文件中。 如果您只關心一點,那么您也許可以將少量但隨機的行數越過您最初尋求的行數……這甚至會使賠率有所提高,避免了初次通過,但並不完美。 hansmaad的注釋也添加了一種簡潔的方法-完美的結果和相當不錯的性能-但要求您在文件本身中對所有行進行編號。

除非每一行的長度都完全相同,否則您將不得不對其進行掃描。

如果要在其中跳轉,可以對其進行掃描,將每行的偏移量保存在您選擇的容器中,然后使用該偏移量查找到特定的行。

假設這些行是可變的/隨機長度,我不認為有任何內置的方法可以直接跳到特定行的開頭。 您可以查找文件中的任意字節位置 但是,它可能落在行的開始/中間/結尾的任何地方。

我最好的建議是分兩個步驟解決問題:

首先,逐字節完整遍歷文件,搜索每一行的開頭。 記錄每行的字節位置,並將其存儲到數組,向量等中(基本上,您正在創建一個從行號映射到起始位置的索引。)然后,在建立此索引時,您可以輕松地跳轉通過查找索引中的位置將其定位到特定行。

據我所知,沒有內置的方法可以在不知道新行的情況下尋找新行。 我不能告訴你實現你的目標的最佳途徑 ,因為大多數你的問題的細節,你是如何想完成它,它不是實際上試圖完成的任務。 因此,我可能會采用以下兩種方式之一:

1)如果您實際上需要文件中的數據的最后每一位(沒有元數據或其他可以丟棄的信息):

有人提到掃描文件,跟蹤行並使用它建立索引,以便一次可以讀一行。 這可能行得通,如果您確實需要完整的每一行,或者您只需要行號並計划從那里一次讀取小段內容,這將是一種方法。 但是,在不了解有關約束或要求的詳細信息的情況下,出於以下一個主要原因,我不建議您使用此方法閱讀整行內容:我無法知道一行本身不會太大而無法加載(如果只有文件中的一行?)。

取而代之的是,我只分配一個大小適合每次處理的適當大小的緩沖區,然后以該大小的塊來處理文件,直到到達結尾為止。 您可以隨時輸入更多數據。 沒有更多細節,我無法告訴您該魔術數字應該是多少,但是您可能需要處理的最大信息塊的大小至少是一個很好的起點。

2)如果您不需要文件中的所有最后數據(可以丟棄其中的某些信息),則只需要其中的一些信息。 如果只需要選擇數據,則更容易查找是否已被標記(這就是XML的意思)。 有很多免費的XML解析器,或者您可以編寫自己的解析器。 然后,您將搜索標簽而不是任意的行號,並且對文件的更改導致數據位於不同的位置,這不會影響您是否對其進行了標記(如果您只是去標記)就無法找到它。按行號。

暫無
暫無

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

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