Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c+;中编辑大型文件的第一行+; < C++ > 中有没有一种“快速”的方法来编辑大文件的第一行(~100mg)?_C++ - Fatal编程技术网

在c+;中编辑大型文件的第一行+; < C++ > 中有没有一种“快速”的方法来编辑大文件的第一行(~100mg)?

在c+;中编辑大型文件的第一行+; < C++ > 中有没有一种“快速”的方法来编辑大文件的第一行(~100mg)?,c++,C++,我知道我们可以逐行读取文件,进行更改,将其写入临时文件,然后重命名临时文件。但是,我想知道是否有一种更快的方法(比如就地修改) 根据文件指针的位置,您可能可以使用fwrite/fprintf文件操作方法来写入文件 您可以使用fopen打开文件进行附加,在开头使用fseek并写入所需内容。但是,您应该注意第一行的长度。如果你写的比原来的行少,你仍然会有多余的内容。如果你写得更多,你会覆盖你的其他内容。100MB在现代计算机上并没有那么大。如果这是一次性交易,而您的设备运行速度不是很慢,您可以简单地

我知道我们可以逐行读取文件,进行更改,将其写入临时文件,然后重命名临时文件。但是,我想知道是否有一种更快的方法(比如就地修改)

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


您可以使用
fopen
打开文件进行附加,在开头使用
fseek
并写入所需内容。但是,您应该注意第一行的长度。如果你写的比原来的行少,你仍然会有多余的内容。如果你写得更多,你会覆盖你的其他内容。

100MB在现代计算机上并没有那么大。如果这是一次性交易,而您的设备运行速度不是很慢,您可以简单地读取整个文件,将其拆分成行,进行编辑,然后在一瞬间将其全部写回

如果这是一种更经常发生的情况,那么只需在第一行添加一些空白填充(如果可能的话),就可以为下次可以放在那里的内容创建一个“缓冲区”,这会让您受益匪浅。然后,您可以使用fwrite只覆盖第一行,而不涉及文件的其余部分

可能存在操作系统和文件系统特定的方法来在现有文件中分配额外空间,而无需移动数据。例如,在使用XFS/ext4的Linux上,您可以使用
fallocate

int fallocate(int fd, int mode, off_t offset, off_t len);
fallocate()允许调用者直接为fd引用的文件操作分配的磁盘空间,该文件的字节范围从偏移量开始,持续到len字节


您考虑的是一个,在其中,整个文件被“映射”到内存中,但在您尝试访问或修改其中的一部分之前,不会实际加载或重写。在POSIX系统上,您可以对文件的一部分(例如,第一个KB)进行必要的修改,然后使用将该内存块写回磁盘。

我认为完成任务的最快方法是创建一个包含第一行值的新文件。每当您接受读取文件的请求时,您首先读取第一行值文件,然后读取较大的文件,跳过实际与较大文件一起存储的第一行。每当您想更改第一行时,只需更改第一行文件。

如果新行和旧行的大小相同,您可以这样做。如果不是,那是不可能的。Btw.,这个问题不是C++特定的。Java或任何其他语言在这方面都帮不上忙。如果新行比旧行短,可以用空格填充。如果我能在第一行的大小上找到一个上限呢?如果你能绑定第一行的大小,你需要一次操作将第一行填充到该上限。然后,所有未来的更新都可以按照他们的意愿覆盖第一行。如果行长度发生变化,您可以在同一文件中向前或向后移动文件中的其他内容,在读取和写入之间执行一系列反弹
fseek()
调用。这样可以避免临时占用两倍于大文件存储的空间。但是,如果班次被中断(例如,进程死亡),文件可能处于中间损坏状态。我用这种方法在生成一个新文件后添加了一个头,如果写入被中断,这个头可能会被丢弃。@MiltoxBeyond,你认为只在文件的第一行执行
mmap
,然后写入指针怎么样?