簡體   English   中英

在C ++中編輯巨大文件的第一行

[英]Edit the first line of a huge file in c++

是否有任何“快速”方式在C ++中編輯大文件(〜100Mg)的第一行?

我知道我們可以逐行讀取文件,進行更改,將其寫入臨時文件並重命名該臨時文件。 但是,我想知道是否有一種更快的方法(類似於就地修改)?

您可能可以使用fwrite / fprintf文件操作方法來寫文件,具體取決於文件指針的位置。

您使用fopen打開文件進行追加,以fseek開頭並編寫所需內容。 但是,您應該注意第一行的長度。 如果您寫的內容少於原始行,您仍然會剩下多余的內容。 如果您編寫更多內容,則將覆蓋您的其他內容。

在現代計算機上,100MB並不大。 如果這是一次交易,並且您不是在運行速度非常慢的設備上工作,則可以簡單地讀取整個文件,將其拆分為幾行,然后進行編輯並將其全部寫回。

如果這是經常發生的事情,您可以從簡單地在第一行添加一些空白填充(如果可能)中受益,以為您下次可以放置的內容創建一個“緩沖區”,從而從中受益。 然后,您可以使用fwrite覆蓋第一行,而無需觸摸文件的其余部分。

可能存在特定於OS和文件系統的方式,可以在不移動數據的情況下在現有文件內分配更多空間。 例如,在具有XFS / ext4的Linux上,您可以使用fallocate

int fallocate(int fd, int mode, off_t offset, off_t len);

fallocate()允許調用方直接為fd引用的文件操作文件分配的磁盤空間,該文件空間的字節范圍從offset開始,直到len個字節。

我相信完成任務的最快方法是創建一個包含第一行值的新文件。 每當您請求讀取文件時,都會先讀取第一個行值文件,然后讀取較大的文件,而跳過實際與較大文件一起存儲的第一行。 每當您想更改第一行時,只需更改第一行文件即可。

您正在考慮一個內存映射文件 ,其中整個文件都被“映射”到內存中,但是直到您嘗試訪問或修改它的一部分時才真正加載或重寫。 在POSIX系統上,您可以mmap()文件的一部分(例如第一個千字節),根據需要對其進行修改,然后使用msync()將僅那部分內存寫回到磁盤上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM