【发布时间】:2015-09-27 15:37:37
【问题描述】:
我想要一些 C++11 输出流,只有当新写入的内容与前一个不同时才会写入文件(如果内容与磁盘上现有的内容相同,我不想要更改原始文件的元数据)。
FWIW,该程序在 GNU/Linux/Debian/Sid x86-64 上,由最近的 GCC 5(或更高版本)编译。它是一个类似服务器的程序,最多只有一个进程在运行它。系统上不应有其他进程写入该文件。
我想避免覆盖现有的相同文件内容的原因是因为实际输出是一些*.h C++ 头文件....(如果这很重要,它是未来MELT 监视器的新化身,我正在用 C++11 重新设计和重写this),如果生成的头文件没有改变,我不希望未来的make 构建根据它重新编译东西。
我很想继承std::ofstream(那么,初始文件路径将是一些临时路径名)或std::ostringstream(然后,整个文件内容都保存在内存中,对我来说没什么大不了的),并重新定义其close 方法以将新内容与磁盘上的旧内容进行比较,并且仅当该内容发生更改时才重写磁盘文件。
但我觉得它闻起来不好(甚至是错误的),特别是因为 std::ofstream::close 没有记录为 virtual。我应该改用std::filebuf 吗?
我有很多现有的operator <<,左边的操作数是std::ostream&,右边是我自己的一些类,我想在我的特殊流中使用它们。
我已经有很多函数可以输出到任何std::ostream,我想在这样的“差异”文件流上使用其中的一些......
或者我应该从std::ostream继承(因此我稍微改变了最初提到std::ofstream,而不是std::ostream的问题的标题)?
我会在关闭的时候比较新旧内容(只需关闭临时文件,并读取它和旧文件,然后逐字节比较)。
【问题讨论】:
-
听起来这不是文件流的工作。流是数据流(在这种情况下,用于文件存储),但它不是文件。
-
为什么?那有什么不同,例如来自
popen的 C 语言? -
你有什么建议?我有很多使用
std::ostream的功能,我希望它们能够输出到这样的东西。