2011-01-10 58 views
3

有沒有一種簡單的方法來追加文件的文件開頭的東西使用文件流?因爲我能想到的唯一方法是將文件加載到緩衝區中,寫入文本到附加文件然後寫入緩衝區。我想知道如果沒有我的緩衝區可以做到這一點。C文件流,附加在開頭

+5

「在開始處追加」通常稱爲「預先考慮」:) – dreamlax 2011-01-10 23:27:29

回答

6

不,不可能。您必須重寫該文件才能在開頭插入文本。

編輯:您能避免讀取整個文件到內存中,如果你使用的臨時文件,即:

  1. 寫你想插入文件的開始從舊
  2. 讀取X字節的值文件
  3. 寫那些X字節到新的文件
  4. 重複2,3直到你讀完舊文件
  5. 複製新文件到舊文件。
3

有沒有簡單的方法,因爲實際操作並不簡單。當文件存儲在磁盤上時,在文件開始之前沒有空的可用字節,所以你不能只把數據放在那裏。對此沒有一個理想的通用解決方案 - 通常,這意味着要複製其餘所有數據,以便騰出空間。

因此,C讓你決定你想如何解決這個問題。

+1

+1表示「在文件開始之前沒有空的可用字節」。 – Mir 2011-01-11 00:43:53

0

沒有辦法將數據追加到文件的開頭。
提問者還表示,他們認爲解決問題的唯一方法是將整個文件讀入內存並再次寫出。

以下是其他方法。
1)寫一個已知長度爲零的佔位符。只要不超過佔位符大小,您就可以倒回文件處理程序並覆蓋這些數據。一個簡單的例子是在開始時寫入一個unsigned int的大小,它代表將要跟隨的行數,但是直到到達末尾並且可以倒回文件處理程序並重寫正確的值才能填充。
*注意:在不同平臺上的某些版本的'C'會堅持在關閉文件處理程序之前最終將文件處理程序放在文件的末尾,以使其正常工作。
2)將新數據寫入新文件,然後使用文件流將舊數據附加到新文件。刪除舊文件,然後將新文件重命名爲舊文件名。不要使用複製,這是浪費時間。

所有方法都有磁盤大小與內存和CPU使用率的權衡。這完全取決於您的應用需求。

0

只是想對付一些比較絕對的權利要求在這裏:

有沒有辦法將數據附加到文件的開頭。

不正確的,也有,給予一定的限制。

當文件存儲在磁盤上時,在文件開始之前沒有空的可用字節,因此您不能只將數據放在那裏。

當處理字節流的文件抽象級別時,可能會出現這種情況。但是,文件系統通常將文件存儲爲一系列塊,並且某些文件系統允許在該級別更自由地訪問。

的Linux 4.1+(XFS)和4.2+(XFS,EXT4)允許給予一定你插入孔成使用fallocate文件,偏移/長度約束:

通常,偏移量和len必須是多的文件系統邏輯塊大小,這取決於文件系統的類型和配置。

StackExchange網站上的示例可以通過網絡搜索'fallocate prepend to file'找到。