2010-08-31 62 views
3

我正在使用文本文件來存儲我的數據記錄。數據以以下格式存儲。從文件中刪除記錄?

Antony|
Azar|9753186420 
Branda|1234567890 
David|1357924680 
John|6767676767

成千上萬的記錄存儲在該文件中。我想刪除一個特定的記錄,說「大衛| 1357924680」。我正在使用C,如何有效地刪除特定的記錄?目前我正在使用臨時文件通過省略要刪除的記錄將記錄複製到該臨時文件。並在複製到臨時文件後,我通過截斷原始文件的所有內容將臨時文件的內容複製到原始文件。我不認爲我正在有效地做到這一點。幫我。

回答

7

添加一列到您的數據表明它是一個有效的(1)或刪除(0)行:

Antony||1 
Azar|9753186420|1 
Branda|1234567890|1 
David|1357924680|1 
John|6767676767|1 

當你想刪除一條記錄,覆蓋單個字節:

Antony||1 
Azar|9753186420|1 
Branda|1234567890|0 
David|1357924680|1 
John|6767676767|1 

Branda現已被刪除。

然後添加一個數據文件壓縮函數,它可以用來重寫文件,不包括已刪除的行。這可以在低使用率或不使用時進行,因此不會影響正常操作。

編輯

有效性列大概應該是第一列,因此您可以更輕鬆地跳過已刪除的行。

+0

+1:如果文件被排序並且記錄大小固定,那麼遍歷該文件的效率會更高,因爲您可以執行二進制文件搜索。但好戲。 – 2010-08-31 19:07:09

5

我認爲你的方法有點不對。如果你真的想高效地使用數據庫,例如sqlite。在簡單文件中使用數據庫很簡單。但它提供了很多SQL的強大功能,非常高效。所以添加新的條目和刪除不會是一個問題(也容易搜索)。所以檢查一下:http://www.sqlite.org/。 這裏是一個3分鐘的教程,將通過示例來解釋如何做你想要完成的一切:http://www.sqlite.org/quickstart.html

1

三條建議:
1.按照您描述的方式進行,而不是將臨時文件複製回原來的位置,只需刪除原始文件並重命名臨時文件。這應該快兩倍。
2.用'XXXXXXX'或其他來覆蓋記錄。這非常快,但它可能不適合您的項目。
3.使用平衡二叉樹。這是'專業'的解決方案。如果可能的話,避免從頭編程!

2

一些簡單的想法,以提高效率,一點點:

  • 你無法複製臨時文件放回原來的,但刪除原始重命名新作爲原始(假定後,他們都在同DIR)
  • 使用一個內存中的數據結構要複製的文件,而不是支持臨時文件(但這樣做你也許應限制其大小,並使用它僅作爲一個緩衝)
  • 馬克一些記錄的刪除,但不要將它們從文件中刪除,然後在您可以提供的一定數量的刪除操作之後刪除物理文件他以這種方式標記記錄(但是您應該重寫文件上的其他操作以忽略標記的記錄)
2

我會告訴類似的解決方案,「羅伯特S.巴恩斯」給了。

我會修改David|1357924680|---------------(等於字節數)。

  • 無需額外字節(沒有多少好處)

  • 的數據被真正刪除。在安全概念需要時它非常有用。

以後某個時間(每日,每週,...)與您現在做的相同/相似。

0

由於無法直接編輯文件,因此必須使用類似於您現在的東西的方法。如其他幾個人所提到的,維護一個適當的數據結構並且每隔一段時間只寫一次會提高效率。