在文件开头写入内容,同时保留原有文件内容

5
我有一个文本文件需要写入。我希望文件内容一直存在。我想遵循“FIFO”(最后一次写入始终在文件的顶部)进行写入。
我尝试使用fout.open("filename")并使用ate模式来保留文件内容,之后使用seekg(0)尝试将写入光标返回到文件开头。但是没有成功。
我找到的唯一方法是非常耗时的,即将整个文件内容复制到临时文件中。然后写入我想要写入的内容,之后将临时文件的内容写入目标文件的末尾。
难道没有更简单的方法来执行此操作吗?

2
创建一个临时文件。将新内容写入其中。然后将旧内容复制到新的临时文件中。最后,删除旧文件并将临时文件重命名为原始名称。 - uselpa
1
@uselpa,这不是OP现在正在做的吗? - Blorgbeard
6
你无法在物理上添加到末尾,但可以在逻辑上将其视为添加到顶部(基本上是将其附加到末尾,但“倒序阅读”)。 - leo
2
@Blorgbeard - 我的理解是他写了两次文件,我建议只写一次。 - uselpa
2
抱歉,戴夫,我害怕我不能这样做。 - pbhd
显示剩余6条评论
5个回答

5

Jorge,无论如何您都必须在内存中重写整个文件。 您不能简单地将文件保留在原地并在内存中添加前缀,特别是因为它是一个简单的文本文件(也许如果有某种元数据您可以...)

无论如何,您最好的机会是将旧内容刷新到临时位置,编写所需内容,然后追加旧内容。


1

我不确定你想要什么。如果你想在文件开头添加一行,唯一的方法是打开一个新的临时文件,写入这一行,将旧文件复制到新行之后,然后删除旧文件并重命名临时文件。

如果原始行具有固定长度,并且您想要替换它,则只需使用ios_base::inios_base::out同时打开文件即可。


0
首先,您应该意识到文件在历史上是流式的,即它们只能单向读写。这源于文件存储在磁带上的时代,当时磁带只能单向移动。
然而,如果您只想要在文件开头添加内容,那么您可以将文件以反向方式存储。听起来很傻?也许是,但这只需要一点额外的开销就可以实现。
此外,在当前操作系统中,您需要复制文件才能在开头添加内容。虽然文件不再是流,可以在硬盘上随机访问,但它们仍然被设计为单向增长。当然,您可以创建一个文件系统,使文件在两个方向上增长,但我没有听说过这样的文件系统。

0

使用 <fstream>,您可以使用 filebuf 类。

    filebuf myfile;
    myfile.open ("test.txt", ios::in | ios::out);
    if (!myfile.is_open()) cout << "cannot open" << endl;
    myfile.sputn("AAAA", 4);
    myfile.close();

    filebuf myfile2;
    myfile2.open ("test.txt", ios::in | ios::out);
    if (!myfile2.is_open()) cout << "cannot open 2" << endl;
    myfile2.sputn("BB", 2);
    myfile2.close();

-4
将要写入的字符串按照顺序写入,然后刷新到文件中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接