gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:35:44 26 4
gpt4 key购买 nike

我想要一些 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com