我想有一些C ++ 11输出流,只有当新写入的内容与前一个内容不同时才写入文件(如果内容与磁盘上的内容相同,我不会&#39 ; t想要改变原始文件的元数据。)
FWIW,该程序在GNU / Linux / Debian / Sid x86-64上,由最近的GCC 5(或更高版本)编译。它是一个类似服务器的程序,最多只有一个进程运行它。没有其他进程可以写入系统上的该文件。
我想避免覆盖现有相同文件内容的原因是因为实际输出是一些*.h
C ++头文件....(如果这很重要,它是未来的新版本{{3监视器,我在C ++ 11中重新设计和重写MELT并且我不希望将来的make
版本根据它重新编译,如果生成的头文件没有改变的话
我很想继承std::ofstream
(然后,初始文件路径将是一些临时路径名)或std::ostringstream
(然后,整个文件内容保存在内存中,而不是对我来说很重要),并重新定义其close
方法,将新内容与磁盘上的旧内容进行比较,并仅在内容发生变化时重写磁盘文件。
但我觉得它闻起来不好(甚至是错误的),特别是因为this没有记录为virtual
。我应该使用std::ofstream::close吗?
我有许多现有的std::filebuf,左操作数为std::ostream&
,右边的操作数是我自己的一些类,我想在我的特殊流中使用它们。
我已经有很多功能可以输出到任何std::ostream
,我想在这样一个"差异"中使用它们中的一些。文件流......
或者我应该继承std::ostream
(因此我略微更改了最初提到std::ofstream
的问题的标题,而不是std::ostream
)?
我会在关闭时比较旧内容和新内容(只需关闭临时文件,然后读取它和旧文件,并逐字节地比较它们)。
答案 0 :(得分:2)
别。流是数据流,而不是文件。让这个功能在流附近的任何地方都是不合适的。如果没有其他的,尽管你可能很早就确定了源和目的地是否完全相同,这将打破流的FIFO模型。他们不是这项工作的合适工具。
将文件生成到临时位置,然后执行md5sum
比较并将其(通过覆盖)移动到目标路径 iff 内容不同;否则只需删除临时文件。当然,它不必比那更复杂。
答案 1 :(得分:1)
我的心理模型是streambuf
是内部实现者的界面,而stream
只是使其便于使用的包装器。因此,要更改功能,您通常会在streambuf
级别定义一些内容,其中有许多要覆盖的虚拟函数。但我远非专家。
您可以小心翼翼地将修改后的filebuf
与香草ofstream
一起使用。
答案 2 :(得分:1)
虽然编写新的streambuf可能是要走的路,但有一种方法是你的新类是一个 ostream,内部有一个 fstream。也就是说,它继承自抽象基类,并具有表示基础文件的私有数据成员。