有没有办法从 C++ 中区分文件?
Posted
技术标签:
【中文标题】有没有办法从 C++ 中区分文件?【英文标题】:Is there a way to diff files from C++? 【发布时间】:2010-11-29 22:00:47 【问题描述】:我正在寻找 C 或 C++ 差异库。我知道我可以将 Unix diff
工具与 system
或 exec
结合使用,但我真的想要一个库。如果该库也可以执行补丁,那将很方便,例如 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 代币