我有一个要写的文本文件。我想始终保留文件内容。我想在“FIFO”之后写(最后一次写总是在文件的第一行)。
我尝试使用fout.open("filename");
with ate 模式来保留文件内容,然后seekg(0)
尝试将光标收回到文件的开头。没用。
我发现这样做的独特方式我认为它非常耗时,将所有文件内容复制到临时文件中。写我想写,然后在目标文件末尾写临时文件的内容。
必须有一种简单的方法来执行此操作吗?
Jorge,无论如何你都必须重写内存中的整个文件。您不能简单地将文件保留在原处并预先添加内存,特别是因为它是一个简单的文本文件(也许如果有某种形式的元数据,您可以......)
无论如何,您最好的机会是将旧内容刷新到一个临时位置,写下您需要的内容并附加旧内容。
我不确定你在问什么。如果要在文件开头添加一行,唯一的方法是打开一个新的临时文件,写入该行,将旧文件复制到新行之后,然后删除旧文件并重命名临时文件。
如果原始行的长度是固定的,并且您想替换它,那么您所要做的就是使用
ios_base::in
和来打开文件ios_base::out
。
首先,您应该意识到文件在历史上是流,即它们只能在一个方向上读取和写入。这来自文件存储在磁带上的时代,磁带可以朝一个方向移动(当时)。
但是,如果您只想前置,那么您可以将文件向后存储。听起来很傻?也许吧,但这只需一点点开销。
除此之外,对于当前的操作系统,您将需要制作一个副本以进行前置。虽然文件不再是流,并且可以在硬盘上随机访问,但它们仍然会朝着一个方向增长。当然,您可以创建一个文件系统,文件在其中双向增长,但我还没有听说过。
使用 <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();
按您想要的顺序写入字符串,然后刷新到文件