2011-05-17 115 views
1

我有以下情況。我有一個大文件,說1 KB。我想讀取前100個字節,然後從文件中刪除100個字節的讀取數據,然後讀取下100個字節。要讀取100個字節是可以的,但是如何從文件中刪除100個字節?如何在Visual C++中截斷文件?

+3

1kb不是一個大文件。它實際上是一個非常小的文件。除非您處於內存非常有限的嵌入式場景中,否則您爲何不讀取整個文件? – 2011-05-17 11:35:03

回答

4

這通常做一個多步驟的過程:

  1. 重命名原始文件。
  2. 將你想要的數據寫入一個帶有原始文件名的新文件。
  3. 使用包含不再需要的數據的臨時名稱刪除舊文件。

這樣,如果出現問題,您可以簡單地恢復您重命名的原始文件。將文件從一個地方移動到另一個地方也是這樣實施的。


但是,如果您不想這樣做,則SetEndOfFile function是另一個可行的選項,可以在原地截斷文件的內容。從文檔:

爲指定的文件到文件指針的當前位置的物理文件的大小。

物理文件大小也被稱爲文件的結尾。 SetEndOfFile函數可用於截斷或擴展文件。

+0

我的理解是OP想要刪除文件開頭的數據。 「SetEndOfFile」函數可能會刪除尚未讀取的數據。 – 2011-05-17 16:52:40

+0

@Thomas:這是可能的。我認爲自從我上次查找它之後,「truncate」這個詞的定義仍然是一樣的。無論哪種情況,我的答案的第一部分都適用。第二種方法對於那些可能想要重新設計其邏輯以在文件末尾執行更正常的截斷數據的人很有用。 – 2011-05-17 23:22:02

+0

只有當沒有其他線程正在寫入文件或使用它時,您纔可以完成這3個步驟。 – 2011-07-14 09:06:00

3

那不會被稱爲截斷;該術語是指從最終而不是開始移除數據。我不知道任何可能的操作系統,除了從第100個字節開始將文件內容複製到新文件之外。

+2

另請參閱http://blogs.msdn.com/b/oldnewthing/archive/2010/12/01/10097859.aspx,其中詳細解釋了爲什麼沒有實施。 – MSalters 2011-05-17 15:18:10

1

刪除已在文件中處理的數據非常耗時,並且在大多數情況下不是必需的。

刪除文件頂部或中間附近的數據需要編寫一個新文件,這需要時間和磁盤空間。大多數應用程序將讀取並處理整個文件,然後重命名文件(使用備份擴展名)。這對調試有用。刪除整個文件通常是一個更快的操作,即在不處理數據的情況下編寫新文件。

刪除只能在必要時進行。對於文件,可以存儲有效數據開始位置的偏移量,從而減少了從文件中刪除數據的需求。出於安全目的,覆蓋文件中的數據通常會更快,然後創建一個沒有處理數據的新文件。

首先嚐試編寫程序以不刪除文件中的數據。只有在程序健全並正常工作後,才能根據需要刪除。許多人建議只在沒有更多空間的情況下刪除文件。