继承自std :: ostream(以避免重写相同的旧内容)......?

时间:2015-09-27 15:37:38

标签: c++ linux c++11 gcc

我想有一些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)?

我会在关闭时比较旧内容和新内容(只需关闭临时文件,然后读取它和旧文件,并逐字节地比较它们)。

3 个答案:

答案 0 :(得分:2)

别。流是数据流,而不是文件。让这个功能在流附近的任何地方都是不合适的。如果没有其他的,尽管你可能很早就确定了源和目的地是否完全相同,这将打破流的FIFO模型。他们不是这项工作的合适工具。

将文件生成到临时位置,然后执行md5sum比较并将其(通过覆盖)移动到目标路径 iff 内容不同;否则只需删除临时文件。当然,它不必比那更复杂。

答案 1 :(得分:1)

我的心理模型是streambuf是内部实现者的界面,而stream只是使其便于使用的包装器。因此,要更改功能,您通常会在streambuf级别定义一些内容,其中有许多要覆盖的虚拟函数。但我远非专家。

您可以小心翼翼地将修改后的filebuf与香草ofstream一起使用。

答案 2 :(得分:1)

虽然编写新的streambuf可能是要走的路,但有一种方法是你的新类是一个 ostream,内部有一个 fstream。也就是说,它继承自抽象基类,并具有表示基础文件的私有数据成员。