我有一个我想写的文本文件。我想始终保留文件内容。我想写一个“FIFO”(最后一次写在文件的顶行)。
我尝试使用fout.open("filename");
和ate模式来保存文件内容,之后使用seekg(0)
尝试将光标写回到文件的开头。没用。
我发现这样做的独特方式我觉得它耗费时间,将所有文件内容复制到临时文件中。写入想要我想写,然后在目标文件的末尾写入临时文件的内容。
这项操作必须有一个简单的方法吗?
答案 0 :(得分:5)
Jorge,无论你需要在内存中重写整个文件。你不能简单地将文件保存在原来的位置并预先记忆,特别是因为它是一个简单的文本文件(也许你可以使用某种形式的元数据......)
无论如何,您最好的机会是将旧内容刷新到临时位置,写下您需要的内容并附上旧内容。
答案 1 :(得分:1)
我不确定你要求的是什么。如果你想添加 a 行到文件的开头,唯一的办法是打开一个 新的,临时文件,写入行,将旧文件复制到 在新行之后,然后删除旧文件并重命名 临时。
如果原始行具有固定长度,并且您想要替换
它,那么你所要做的就是用两者打开文件
ios_base::in
和ios_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)
按顺序写入字符串,然后刷新到文件