有没有"快速"在C ++中编辑大文件(~100Mg)的第一行的方法吗?
我知道我们可以逐行读取文件,进行更改,将其写入临时文件,然后重命名临时文件。但是,我想知道是否有更快的方法(类似就地修改)?
答案 0 :(得分:2)
您可以使用fwrite
/ fprintf
文件操作方法根据文件指针的位置写入文件。
使用fopen
打开文件进行追加,在开头使用fseek
并写下您需要的内容。但是,您应该小心第一行的长度。如果您写的比原始行少,您仍会留下额外的内容。如果你写得更多,你将覆盖你的其他内容。
答案 1 :(得分:2)
在现代计算机上,100MB并不是那么大。如果这是一次性交易并且您没有处理非常慢的设备,您可以简单地读取整个文件,将其拆分成行,进行编辑并稍后将其全部写回来。
如果这种情况会更频繁地发生,那么只需在第一行添加一些空格填充(如果可能的话)就可以为下一次可以放在那里的东西创建一个“缓冲区”。然后你可以使用fwrite覆盖第一行,而不会触及文件的其余部分。
可能存在操作系统和文件系统特定方式在现有文件内分配额外空间而不移动数据。例如,在使用XFS / ext4的Linux上,您可以使用fallocate
:
int fallocate(int fd, int mode, off_t offset, off_t len);
fallocate()允许调用者直接操作fd引用的文件的已分配磁盘空间,该字节范围从offset开始并继续为len个字节。
答案 2 :(得分:1)
我相信完成任务的最快方法是创建一个包含第一行值的新文件。每当您接收读取文件的请求时,首先读取第一行值文件,然后读取较大的文件,跳过实际与较大文件一起存储的第一行。无论何时想要更改第一行,只需更改第一行文件。
答案 3 :(得分:0)
您正在考虑memory-mapped file,其中整个文件被“映射”到内存中,但在您尝试访问或修改其中的一部分之前,实际上并未加载或重写。在POSIX系统上,您可以mmap()
文件的一部分(例如,第一个千字节),根据需要进行修改,然后使用msync()
将该块内存写回磁盘。