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

标签 c++ linux c++11 gcc

我想要一些 C++11 输出流,只有当新写入的内容与以前的内容不同时才写入文件(如果内容与磁盘上现有的内容相同,我不想要更改原始文件的元数据)。

FWIW,该程序在 GNU/Linux/Debian/Sid x86-64 上,由最近的 GCC 5 编译(或以后)。它是一个类似服务器的程序,最多只有一个进程运行它。没有其他进程应该写入系统上的该文件。

我想避免覆盖现有相同文件内容的原因是因为实际输出是一些 *.h C++ 头文件....(如果这很重要,它是 future MELT 监视器的新化身,我正在用 C++11 重新设计和重写 this),我不想要 future make如果生成的头文件未更改,则构建以根据它重新编译内容。

我很想继承 std::ofstream (然后,初始文件路径将是一些临时路径名)或 std::ostringstream (然后,整个文件内容都保存在内存中,对我来说没什么大不了的),并重新定义它的 close方法将磁盘上的新内容与旧内容进行比较,只有当内容发生变化时才重写磁盘文件。

但我觉得它闻起来不好(甚至不对),特别是因为 std::ofstream::close未记录为 virtual .我应该使用 std::filebuf 吗?相反?

我有很多现有的 operator << 左操作数为 std::ostream&正确的是我自己的一些类(class),我想在我的特殊流中使用它们。 我已经有很多功能可以输出到任何 std::ostream我想在这样的“差异”文件流上使用其中的一些...

或者我应该继承自 std::ostream (因此我稍微更改了最初提到的问题的标题 std::ofstream ,而不是 std::ostream )?

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

最佳答案

不要。流是数据流,而不是文件。让这个功能在流附近的任何地方都是不合适的。如果不出意外,尽管您可能会破解一种方法来尽早确定源和目标是否相同,但这会破坏流的 FIFO 模型。它们只是不适合这项工作的工具。

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

关于c++ - 从 std::ostream 继承(以避免重写相同的旧内容)...?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32809675/

相关文章:

c++ - 与输入范围相关的排序算法的效率

linux - 使用 Navicat 通过 SSH 登录 Postgresql - 正确的设置是什么?

linux - 如何使 Poky (Yokto) Dizzy 发行版中的 udhcpc 更改永久化

php - 从 PHP 调用的 Shell 脚本不起作用,但它在命令行中起作用

c++ - 使用 dfs 和 bfs 进行路径查找

c++ - 数组大小 'exceeded' ,但数组很小

c++ - 反向 For 循环崩溃

抽象类中的c++克隆函数

c++ - 构建 wxWidgets 应用程序失败 - 未定义对 `wxCRT_StrdupA(char const*)' 的引用

c++ - 关于锁定 boost 互斥体的方法的疑问