写入文件开头,保留文件内容

Writing at the beginning of a file, keeping file contents

本文关键字:文件 保留 开头      更新时间:2023-10-16

我有一个文本文件,我想在那里写。我想始终保留文件内容。我想按照"FIFO"(最后一次写入总是在文件的第一行)编写。

我尝试使用带有 ate 模式的 fout.open("filename"); 来保留文件内容,之后使用seekg(0)尝试将光标写回文件开头。没用。

我发现这样做的独特方法我认为这非常耗时,将所有文件内容复制到临时文件中。写我想写,然后在目标文件的末尾写临时文件的内容。

一定有一个简单的方法可以完成此操作吗?

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

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

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

如果原始行具有固定长度,并且您想要替换它,那么你所要做的就是用两者打开文件 ios_base::inios_base::out.

首先,您应该意识到文件在历史上是流,即它们只能在一个方向上读取和写入。这来自文件存储在磁带上的时代,磁带可以向一个方向移动(当时)。

但是,如果您只想在前面加上前缀,那么您可以向后存储文件。听起来很傻?也许吧,但这只需要一点开销。

除此之外,对于当前的操作系统,您需要制作一个副本来预置。虽然文件不再是流,并且可以在硬盘上随机访问,但它们仍然朝着一个方向增长。当然,你可以创建一个文件系统,其中文件双向增长,但我还没有听说过。

使用 您可以使用 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();

所需顺序写入字符串,然后刷新到文件