1.使用fopen(filename, "r+")以读取/更新方式打开文件。请参见:https://cplusplus.com/reference/cstdio/fopen/。使用fgetc()(参见my file_load() function for how to use fgetc())将字符逐个读入您创建的第一个大型字符缓冲区buffer_file_in。继续操作,直到将整个文件读入该缓冲区。 1.找到要插入的位置。注意:在第一次将文件读入buffer_file_in时,可以通过计算换行符来实时执行此操作('\n')来查看您所在的行。将字符从buffer_file_in复制到buffer_file_out,直到该点。现在,将新内容写入buffer_file_out中的该点。然后,在插入字符后完成将buffer_file_in的其余部分复制到buffer_file_out中。 1.使用fseek(file_pointer, 0, SEEK_SET);查找文件的开头 1.使用fwrite()将buffer_file_out缓冲区内容写入文件。 1.使用fclose()关闭文件。 您可以在这里进行一些优化,例如将索引存储在您希望开始插入的位置,并且不将到该位置为止的字符复制到buffer_file_in中,而是将该位置之后的文件的剩余部分复制到buffer_file_in中。然后稍后查找到该点,只写入新内容和文件的其余部分。这避免了在插入点为all之前不必要地重写fie的开头。 (可能更好)你也可以直接复制文件和你插入的修改到buffer_file_out中,然后从文件的开头开始写回文件。这和@pm100的方法非常相似,除了使用1个文件+ 1个缓冲区而不是2个文件。 寻找其他适用的优化和冗余减少方法。 我上面的方法在RAM中使用1个文件和1个或2个缓冲区,具体取决于实现。@pm100的方法在RAM中使用2个文件和0个缓冲区(非常类似于我的1个文件和1个缓冲区的方法),具体取决于实现。
2条答案
按热度按时间iezvtpos1#
打开一个新的输出文件
逐行读取输入文件(fgets),在读取时将每一行写入一个新文件。
当你找到你想插入的地方时,写上新的一行
接着将旧行复制到新文件中
闭合输入输出
将输出文件重命名为输入
7ivaypg92#
继续我上面的评论,我会这么做:
1.创建两个大小相同的
static char[]
大缓冲区--每个缓冲区都足以存储您可能需要读入的最大文件(例如:10 MiB)。例如:1.使用
fopen(filename, "r+")
以读取/更新方式打开文件。请参见:https://cplusplus.com/reference/cstdio/fopen/。使用fgetc()
(参见myfile_load()
function for how to usefgetc()
)将字符逐个读入您创建的第一个大型字符缓冲区buffer_file_in
。继续操作,直到将整个文件读入该缓冲区。1.找到要插入的位置。注意:在第一次将文件读入
buffer_file_in
时,可以通过计算换行符来实时执行此操作('\n'
)来查看您所在的行。将字符从buffer_file_in
复制到buffer_file_out
,直到该点。现在,将新内容写入buffer_file_out
中的该点。然后,在插入字符后完成将buffer_file_in
的其余部分复制到buffer_file_out
中。1.使用
fseek(file_pointer, 0, SEEK_SET);
查找文件的开头1.使用
fwrite()
将buffer_file_out
缓冲区内容写入文件。1.使用
fclose()
关闭文件。您可以在这里进行一些优化,例如将索引存储在您希望开始插入的位置,并且不将到该位置为止的字符复制到
buffer_file_in
中,而是将该位置之后的文件的剩余部分复制到buffer_file_in
中。然后稍后查找到该点,只写入新内容和文件的其余部分。这避免了在插入点为all之前不必要地重写fie的开头。(可能更好)你也可以直接复制文件和你插入的修改到
buffer_file_out
中,然后从文件的开头开始写回文件。这和@pm100的方法非常相似,除了使用1个文件+ 1个缓冲区而不是2个文件。寻找其他适用的优化和冗余减少方法。
我上面的方法在RAM中使用1个文件和1个或2个缓冲区,具体取决于实现。@pm100的方法在RAM中使用2个文件和0个缓冲区(非常类似于我的1个文件和1个缓冲区的方法),具体取决于实现。