2013-04-25 67 views
0

我有要求讀取文本文件,但它太大,我決定只讀取此文件中的一些行。我可以使用查找方法跳轉給定線嗎?然後,我只能閱讀該行,因爲該文本文件太大,讀整個文件浪費很多時間。如果不可能的話,任何人都可以提供更好的解決方案? (求給定線和讀吧)(我知道二進制文本文件閱讀逐字節)我想行的一個事件,它的顯示號碼後,我的文件C++只讀取文件中的隨機行

event1 0 

subevent 1 

subevent 2 

event2 3 

EX(在我的文件以尋求以前的事件)

+0

你不能尋求一個新的說法,這個概念不存在。您必須找到該行手動結束的位置。你可以實現一個「行」概念的唯一方法是,如果你對每一行都有固定的長度,否則你必須逐行讀取並跳過你不想要的行。 – Nim 2013-04-25 11:02:57

+0

...或通過向文件添加行號。 – hansmaad 2013-04-25 11:04:44

+1

多大? – 2013-04-25 11:08:59

回答

0

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

如果你想跳過它,你可以掃描它,保存每一行的偏移量在你選擇的容器中,然後用它來尋找特定的行。

1

是的,你可以尋找文件中的一個點然後從那裏讀取。一個可能的問題是,如果線條長度不同,文件中隨機位置的長度會更長:您不能獲得不同線條的均勻分佈概率。如果你確實必須有相同的概率,那麼你至少需要對文件進行一次遍歷才能找到每一行的開始 - 然後你可以將這些偏移存儲在一個向量中並隨機選擇一個向量元素來指導尋找行數據在文件中。如果你只關心一點,那麼你或許可以將一小部分隨機數的曲線推過最初尋找的曲線......這甚至可能會有一些可能性,避免了最初的曲調,但並不完美。 hansmaad的評論也增加了一個簡潔的方法 - 完美的結果和非常好的性能 - 但要求你在文件本身編號的所有行。

+0

「您可以在文件中找到一個點然後從那裏讀取」:如果文件是以文本模式打開,則不是。尋找任意點是未定義的行爲。 (它通常在Unix下工作,並且會把你放在Windows附近的某個地方,但它可能會做一些完全隨機的事情。) – 2013-04-25 11:33:28

+0

@JamesKanze:有趣的一點 - 那麼使用二進制模式很好。乾杯。 – 2013-04-25 16:13:36

+0

@JamesKanze:不Posix定義文本和二進制模式是相同的?如果真的可以解釋它通常在Unix下工作;-)我不記得這個參考,所以它有可能在你看到的數據方面保證是相同的,但是在尋找方面不是這樣。 – 2013-04-26 08:22:56

0

假設行是可變/隨機長度,我不相信有任何內置的方式直接跳到特定行的開始。你可以在文件中尋找任意的字節位置。但是,這可能會落在一條線的開始/中間/結尾的任何地方。

我最好的建議是分兩步來攻擊問題:

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

+0

謝謝你的所有答案,其實你的第二個想法目前也在我的腦海裏工作,但是如果在創建後,這個文件由引擎創建,我想快速完成這個任務問題是它得到了大量的時間,但我也認爲他們沒有其他方式要做到這一點:(當考慮到這種情況時間非常重要,因爲時間做出一些重要的決定:) – 2013-04-25 12:28:46

0

據我所知,沒有內在的方法去尋找新的生產線而不知道生產線在哪裏。我無法告訴你最好的方法達到你的目標,因爲你的大部分問題的詳細信息如何你試圖完成它,而不是什麼它是你實際上試圖完成。因此,我可以有兩種選擇,與此一:

1)如果你確實需要數據的每一點從文件(沒有元數據或其他信息,可以被丟棄):有人提到

掃描文件,隨時跟蹤線條,並用它建立索引,以便一次讀入一行。這可能會奏效,如果你真的需要每一行的全部內容,或者你只需​​要一行一行地閱讀小部分的行號和計劃,那麼這將是一條路。但是,如果不知道有關約束或要求的細節,我不建議使用此方法在整行中讀取一個主要原因:我無法知道一行不會太大以至於無法加載(如果只有文件中有一行?)。

相反,我只是簡單地分配一個大小適當的緩衝區,一次處理一個合適的數量,然後按照該大小處理文件,直到達到最終。您可以隨時傳送更多數據。如果沒有額外的細節,我不能告訴你這個幻數應該是多少,但是可能需要處理的最大信息量是一個很好的起點。 2)如果你不需要文件中的每一位數據(你可以放棄其中的一些信息),那麼你只需要它的一部分。如果你只需要選擇一些數據,那麼他們更容易找到是否被標記(這是XML的用途)。有很多免費的XML解析器,或者你可以自己寫。然後,您將搜索標籤而不是任意的行號,對文件所做的更改會導致數據位於不同的位置,這不會影響您在標記時查找它的能力,因爲如果您只是要進行標記按行數。