2014-03-03 90 views
-3

我需要幫助,使得在C++程序中通過文本文件搜索更高效的方法。更高效地搜索文本文件

該項目規定,我們需要創建姓名,地址和帳號的文本文件。

例如:


弗蘭克

1990莫斯利大街

巴拿馬市,佛羅里達州,32444

CHL10910454


這是寫入文本文件的每個數據塊的結構。該程序的用戶需要能夠搜索數據文件中的特定人員並編輯他們的信息。

我知道平時我會讀每一行到一個數組,通過排序數組找到有問題的人的數據,進行更正的陣列和重寫整個文本文件。但是,我想知道是否有更有效的方法呢?

主要是,我想知道是否有可能通過文本文件,而不需要將整個文本文件寫入到陣列,發現有問題的信息只是塊編寫爲編輯數組進行搜索。 編輯剛剛在考慮的模塊後,您將重新插入的數據在它以前 OR 如果我能在最後插入並從文本文件中刪除舊版本的數據。

任何幫助將是偉大的! 我確實希望您記住,至今我們不使用前綴std ::。我們在開始時使用「using namespace std」。但是,我的確瞭解std ::的大部分用法。

感謝您的幫助!

+4

到目前爲止,你已經做了什麼來解決這個問題?這看起來像一個家庭作業。 – tmaric

回答

1

這是很好的,你在想這件事,但:

  • 在大多數操作系統和文件系統類型

    ,你可以在文件內容覆蓋特定字節,但也沒有辦法插入或刪除數據部分方式通過文件,以便後來的數據被移動來創建或填補一個空白:這意味着如果你想用「蘇珊」替換「索尼娜」,它可以在原地完成,但如果你將「索尼婭」改爲「 Sue「,那麼文件中的所有其他部分必須被讀取和寫入文件中的2個字節(除非您決定使用說空格填充2個不需要的字符,但是如果例如」Tom「更改爲「Thomas」)。

  • ,如果你決定去追求這一點,首先需要知道,如果該文件是在關鍵的排序則需要通過搜索:

    • 如果沒有,那麼你就必須通讀該文件至少在您找到要更改的數據之前,並且如果新數據的長度與舊數據的長度不完全匹配,則無論如何您都需要讀取並寫出更新後的內容

    • 如果是這樣,那麼你可以通過文件進行二分搜索來找到要更新的記錄,但由於行的變量是len你需要一種啓發式方法來識別哪一行是名字,哪個地址,哪個銀行賬戶。如果這些賬戶都是由大寫字母和數字組成的單個「單詞」,那麼這可能是可能的。對於學習者而言,這是一項相當棘手的任務 - 更容易在內存映射文件上進行二進制搜索,因此您不必擔心數據會與您正在閱讀的固定大小緩衝區的邊緣重疊文件。

  • 許多小程序,它是完美的罰款和實用做「啞巴」的方式 - 數據加載到內存中,然後在其上運行那裏,只是寫出來,以避免失去工作,如果有一個崩潰和退出,如果有不成文的變化

  • 較大的程序之前,你可以移動到一個數據庫

0

通過文件搜索最快的方法就是閱讀整個文件進入記憶和搜索記憶。

如果文件中的記錄大小固定,可以使用文件定位來標記記錄的起始位置。這可以用在索引表中,如std::map<key, file_position>。您將使用該鍵搜索容器,獲取文件位置並從文件位置讀取記錄。

如果您的記錄數量很少,您可能需要將記錄讀入std::vector。使用std::map<key, vector_index>爲您要搜索的每個鍵創建索引表。這與數據庫如何創建搜索索引以加快搜索速度相似。

任何比這更復雜的東西,我建議使用數據庫。