2015-06-25 30 views
2

用C++编辑一个大文件(〜100Mg)的第一行有没有“快速”的方法?用C++编辑一个巨大文件的第一行

我知道我们可以逐行读取文件,进行更改,将其写入临时文件并重命名临时文件。但是,我想知道是否有更快的方式来做到这一点(比如就地修改)?

+1

如果新线和旧线尺寸相同,您可能可以做到。如果没有,这是不可能的。 –

+1

顺便说一句,这个问题不是C++特有的。 Java或任何其他语言不会帮助你。 – deviantfan

+1

如果新行比旧行更短,可以用空格填充。 –

回答

2

您可以使用fwrite/fprintf文件操作方法根据文件指针的位置写入文件。

fopen打开文件进行追加,使用fseek开始并写出所需内容。但是,您应该小心第一行的长度。如果你写的比原来的行少,你仍然会留下剩余的额外内容。如果你写更多,你会覆盖你的其他内容。

+1

如果行长度发生变化,您可以在文件中将文件中的其他内容向前或向后移动,同时在读写之间调用一系列反弹“fseek()”调用。这可以避免临时占用大文件存储的两倍。但是,如果您的班次中断(例如,进程死亡),则文件可能会处于中间状态。我使用这种方法在生成一个新文件后添加一个头文件,如果写入被中断,可以抛弃它。 –

+0

@MiltoxBeyond,你会怎么想只在文件的第一行做一个'mmap',然后写入指针? – Alejandro

2

100MB在现代电脑上并不那么大。如果这是一次性交易,而且您不是在一台非常慢的设备上工作,那么您可以简单地阅读整个文件,将其分成几行,进行编辑并立即写回。

如果这种情况会更频繁地发生,您可以从第一行添加一些空格填充(如果可能),为下次可以放入的东西创建一个“缓冲区”,从中受益。然后你可以使用fwrite来覆盖第一行,而不用触及文件的其余部分。

可能有操作系统和文件系统特定的方式来分配现有文件中的额外空间而不移动数据。例如在Linux与XFS/EXT4可以使用fallocate

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

fallocate()允许调用者直接操作用于通过FD的字节范围称为文件分配的磁盘空间开始偏移量和继续len字节。

0

你在想一个memory-mapped file,其中整个文件“映射”到内存但不实际加载或重写,直到您试图访问或修改它的一部分的。在POSIX系统上,你可以将mmap()作为文件的一部分(比如第一个千字节),根据需要进行修改,然后使用msync()将该块内存写回磁盘。

1

我相信完成任务的最快方法是创建一个包含第一行值的新文件。每当读取文件请求时,首先读取第一行值文件,然后读取较大的文件,跳过实际存储在较大文件中的第一行。无论何时您想更改第一行,只需更改第一行文件即可。