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

时间:2012-11-26 20:54:14

标签: c++ ofstream

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

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

我发现这样做的独特方式我觉得它耗费时间,将所有文件内容复制到临时文件中。写入想要我想写,然后在目标文件的末尾写入临时文件的内容。

这项操作必须有一个简单的方法吗?

5 个答案:

答案 0 :(得分:5)

Jorge,无论你需要在内存中重写整个文件。你不能简单地将文件保存在原来的位置并预先记忆,特别是因为它是一个简单的文本文件(也许你可以使用某种形式的元数据......)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

除此之外,使用当前的操作系统,您需要复制前置。虽然文件不再是流,并且可以在硬盘上随机访问,但它们仍然可以在一个方向上增长。当然你可以创建一个文件系统,文件在两个方向上都会增长,但我没有听说过。

答案 3 :(得分: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 :(得分:-4)

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