繁体   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