4

我有一个要写的文本文件。我想始终保留文件内容。我想在“FIFO”之后写(最后一次写总是在文件的第一行)。

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

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

必须有一种简单的方法来执行此操作吗?

4

5 回答 5

5

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

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

于 2012-11-26T21:02:01.167 回答
1

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

如果原始行的长度是固定的,并且您想替换它,那么您所要做的就是使用 ios_base::in和来打开文件ios_base::out

于 2012-11-26T21:38:22.380 回答
0

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

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

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

于 2012-11-26T21:54:52.720 回答
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();
于 2013-08-21T08:34:41.763 回答
-4

按您想要的顺序写入字符串,然后刷新到文件

于 2012-11-26T20:58:04.310 回答