Diff算法C++; 我试图在C++中创建一个程序,可以区分两个.txt文件。 struct line { string text; size_t num; int status; }; void compareFiles(vector<line> &buffer_1, vector<line> &buffer_2, size_t index_1, size_t index_2) { while(index_1 < buffer_1.size()) { while(index_2 < buffer_2.size()) { X = buffer_1[index_1].text; Y = buffer_2[index_2].text; if(X == Y) { ++index_1; ++index_2; } else { LCS(); string lcs = printLCS(X.length(), Y.length()); /* * Here's my problem */ } } } } struct行 { 字符串文本; 大小/数量; 智力状态; }; 无效比较文件(向量和缓冲区1、向量和缓冲区2、大小索引1、大小索引2) { 而(索引_1

Diff算法C++; 我试图在C++中创建一个程序,可以区分两个.txt文件。 struct line { string text; size_t num; int status; }; void compareFiles(vector<line> &buffer_1, vector<line> &buffer_2, size_t index_1, size_t index_2) { while(index_1 < buffer_1.size()) { while(index_2 < buffer_2.size()) { X = buffer_1[index_1].text; Y = buffer_2[index_2].text; if(X == Y) { ++index_1; ++index_2; } else { LCS(); string lcs = printLCS(X.length(), Y.length()); /* * Here's my problem */ } } } } struct行 { 字符串文本; 大小/数量; 智力状态; }; 无效比较文件(向量和缓冲区1、向量和缓冲区2、大小索引1、大小索引2) { 而(索引_1,c++,algorithm,diff,lcs,C++,Algorithm,Diff,Lcs,如您所见,我有两个缓冲区(行向量),以前加载了文件内容。我也有LCS算法的完整功能(测试)。LCS在全局定义的字符串X和Y上工作 所以,我真正需要做的是逐行比较缓冲区和LCS,但我没有找到一种方法 你能帮我吗?首先,我会重写LCS()以两行作为参数并返回最长的公共序列——我想象一个函数签名,如std::string LCS(const line&lhs,const line&rhs)。然后我将修改您的while循环,如下所示 for(int i = 0; i < buffer_1.size

如您所见,我有两个缓冲区(行向量),以前加载了文件内容。我也有LCS算法的完整功能(测试)。LCS在全局定义的字符串X和Y上工作

所以,我真正需要做的是逐行比较缓冲区和LCS,但我没有找到一种方法


你能帮我吗?

首先,我会重写
LCS()
以两行作为参数并返回最长的公共序列——我想象一个函数签名,如
std::string LCS(const line&lhs,const line&rhs)
。然后我将修改您的
while
循环,如下所示

for(int i = 0; i < buffer_1.size(); ++i)
{
    for(int j = 0; j < buffer_2.size(); ++j)
    {  
        std::string lcs = LCS(buffer_1[i].text, buffer_2[j].text);
        std::cout << "LCS[" << i << "][" << j << "]: " << lcs << std::endl;
    }
}
for(int i=0;istd::cout当我有疑问时,我通常会听从以前做过的人。古老的diff程序已经存在了很久,它可以做你想做的事情。此外,它是开源的,所以去看看吧

解压归档文件后,打开src/analyze.c.
diff_2_files
函数从第472行开始。执行实际比较的代码从第512-537行开始。它们在下面复制:

for (;; cmp->file[0].buffered = cmp->file[1].buffered = 0)
{
    /* Read a buffer's worth from both files.  */
    for (f = 0; f < 2; f++)
        if (0 <= cmp->file[f].desc)
            file_block_read (&cmp->file[f],
                buffer_size - cmp->file[f].buffered);

    /* If the buffers differ, the files differ.  */
    if (cmp->file[0].buffered != cmp->file[1].buffered
            || memcmp (cmp->file[0].buffer,
                    cmp->file[1].buffer,
                    cmp->file[0].buffered))
    {
        changes = 1;
        break;
    }

    /* If we reach end of file, the files are the same.  */
    if (cmp->file[0].buffered != buffer_size)
    {
        changes = 0;
        break;
    }
}
用于(;;cmp->文件[0]。缓冲=cmp->文件[1]。缓冲=0)
{
/*从两个文件中读取缓冲区的值*/
对于(f=0;f<2;f++)
如果(0文件[f].desc)
文件块读取(&cmp->文件[f],
缓冲区大小-cmp->文件[f]。已缓冲);
/*如果缓冲区不同,则文件也不同*/
如果(cmp->文件[0]。已缓冲!=cmp->文件[1]。已缓冲
||memcmp(cmp->文件[0]。缓冲区,
cmp->文件[1]。缓冲区,
cmp->文件[0]。已缓冲)
{
变化=1;
打破
}
/*如果我们到达文件的末尾,文件是相同的*/
如果(cmp->文件[0]。已缓冲!=缓冲区大小)
{
变化=0;
打破
}
}

这里的想法是加载两个大小相同的缓冲区,然后将每个文件加载到一个缓冲区。使用
memcmp
一次比较两个文件的一个缓冲区,看看是否有任何缓冲区与另一个缓冲区不同。如果任何缓冲区比较结果都不相等,那么这两个文件是不同的。还需要注意的是,永远不必读取一次超过两个缓冲区的数据量,因此这种方法也适用于大型文件。

我建议取消两个
while()
循环的嵌套--当
buffer\u 2
中的行数用完时会发生什么情况?
index\u 1
将永远不会增加,而最外层的
while
循环将永远不会终止。
while(index_1
将允许您完全运行两个输入。(可能一个输入与另一个输入不同,只是在末尾附加了一个新行…)源代码就在这里,gnu diff源代码非常糟糕,泄漏得很厉害,这并不重要,因为它是一个命令行工具,但不能仅仅移动到库中。