嘿,我正在用C ++处理文件... 我是文件处理的新手..我想在每次写入文件时在文件前面附加内容........
我已使用.....打开文件 fstream fi(“ user.txt”,ios :: app);
但这总是将内容附加在文件末尾...
我已经使用.....
编写了c ++代码Fstream fi(“ user.txt”,ios :: app); fi <<“约翰是个好男孩” <
Fstream fi("user.txt",ios::app);
fi<<"john is a great boy"<<endl;
实际结果:它总是在文件末尾附加我的内容...
预期的:它应该始终在文件前面附加内容。...
答案 0 :(得分:2)
第一个问题是:为什么要这么做?
然后通过文件处理,这将变得很棘手,因为这不是文件在OS级别上的工作方式-尽管通常以本地方式支持附加,但不支持前置(因此C ++ STL不支持该功能)要么)。因此,您需要将新行写出到某个临时文件中,然后始终附加之前的内容。在Windows,Linux,BSD及其衍生版本上无法实现。
如果您真的坚持,则可以基于标准文件流编写自己的流类,从而将所有这些工作隐藏起来。另一个变体可能只读取输出文件一次,将所有行保留在内存中,适当地处理新行,并在关闭流对象时仅将行打印回文件一次。缺点:如果应用程序崩溃,可能会丢失很多行。您可以使用std::deque
并添加新行,也可以以相反的顺序将这些行读入std::vector
,添加新行,然后使用反向迭代器打印到文件。
不过,最好还是附加到文件上。然后,您可以编写一个单独的应用程序来反转行顺序–优点:您只需要执行一次反转工作,就可以非常有效地从背面进行读取并在写入新的输出文件时,您只需再次追加。或者,您可以编写自己的文件查看器应用程序,以相反的顺序显示行(如果大小过大,则从后读取,或者一次将所有行都保留在内存中)。
答案 1 :(得分:0)
我认为唯一的方法是将内容写入另一个文件,然后在其中附加旧行。
答案 2 :(得分:0)
如果文件不是很大,则可以考虑先将文件内容转储到stringstream ss
,将新内容添加到ss
的前面,然后将其写回到文件中。