有没有办法从 C++ 中区分文件?

Posted

技术标签:

【中文标题】有没有办法从 C++ 中区分文件?【英文标题】:Is there a way to diff files from C++? 【发布时间】:2010-11-29 22:00:47 【问题描述】:

我正在寻找 C 或 C++ 差异库。我知道我可以将 Unix diff 工具与 systemexec 结合使用,但我真的想要一个库。如果该库也可以执行补丁,那将很方便,例如 Unix patch 工具。

【问题讨论】:

在我看来差异库会很常见,但谷歌还没有找到一个好的答案。 An excellent approach was provided for C/C++ on a similar post. 【参考方案1】:

我想我终于找到了一个很好的解决方案:

DTL - Diff Template Library --- Tutorial

它支持补丁。我必须在 Google 中输入“diff.cpp”才能找到它。希望它有效!

【讨论】:

【参考方案2】:

在 Google 中也几乎找不到,事实证明 Gnulib 有一个 diff module。这似乎足以满足我想要一个差异库的目的。不过,它似乎没有补丁模块。

【讨论】:

【参考方案3】:

有一个是Mercurial 的一部分。它作为一些设计为 Python 扩展的 C 代码存在,但它可能很容易被提取。我相信它也可以做二进制差异。

相关的 .c 文件是 mercurial/bdiff.c、mercurial/mpatch.c 和可能的 mercurial/diffhelpers.c。

【讨论】:

【参考方案4】:

Subversion 包含一个库 libsvn_diff

【讨论】:

【参考方案5】:

This 是“使用 Hirschberg 线性空间细化的 SES/LCS 解决方案,如以下出版物中所述”的实现:

E.迈尔斯,“一个 O(ND) 差异 算法及其变体,'' 算法 1, 2 (1986), 251-266。 http://www.cs.arizona.edu/people/gene/PAPERS/diff.ps

在Wikipedia page on diff 上找到它。

不过,这仅用于查找差异,而不是将其作为补丁应用。我认为补丁的应用实际上是一个更难的问题;因为有冲突的风险。它需要某种形式的用户控制反馈机制来解决冲突。

【讨论】:

这是迄今为止我回答的最好的,但我也非常想要一个补丁库。我会稍等一下,看看其他人是否有答案。 开头链接的文件diff.c 似乎已经消失了。 (虽然它仍然在 Google 索引中......) @unwind 天哪,对不起。只是 https 传输会产生 404 错误。禁用 HTTPS Everywhere 会导致文件被加载。【参考方案6】:

看来Google Diff, Match and Patch libraries 是您所需要的。

【讨论】:

嗯,但是该库的 C++ 版本依赖于 Qt。我需要一个用于非 GUI 应用程序的 diff/patch 库。 Qt 有非 GUI 部分,可以在控制台应用程序中使用。 Qt 是我不想拥有的大型库依赖项。为什么作者不使用 STL? 一个STL端口is available on GitHub。 这绝对比 DTL 好(显然不提供每行差异算法)

以上是关于有没有办法从 C++ 中区分文件?的主要内容,如果未能解决你的问题,请参考以下文章

C++核心准则T.23:通过增加新的使用模式,从更加普遍的场景中区分更精炼的概念

如何在代币合约中区分在 uniswap 上买卖 erc-20 代币

Spark 中区分大小写的连接

Visual C++ 中区分大小写的短语搜索

在 Java 中区分 ESTALE 和 ENOENT 的最佳方法

通过单击图标、在控制台中键入其名称或从批处理文件中区分程序是不是运行