有没有一种方法可以在C中将一个文本文件中的每一行与另一文本文件中的一行进行比较?

时间:2018-10-20 19:44:22

标签: c file-comparison

例如,我有一个包含400多个英语单词的索引文本文件,然后又有另一个文本文件,每行都有解密的文本。

我想用解密的文本文件的每一行检查索引文件中的每个英语单词(因此,检查每行解密的文本是否匹配400+个英语单词)

我之所以考虑使用strncmp(decryptedString, indexString, 10),是因为我知道如果下一个字符为NULL,strncmp就会终止。

我的解密文本文件的每一行长352个字符,并且其中存储了约4000万行文本(每一行来自不同的输出)。

这是为了解密游戏公平密码;我知道我的解密算法行之有效,因为我的教授给了我们一个例子来测试我们的程序,并且效果很好。

我已经连续六天致力于这个项目,这是我唯一坚持的部分。我根本无法正常工作。我尝试使用

while(getline(&line, &len, decryptedFile) != -1){
    while(getline(&line2, &len2, indexFile) != -1){
        if(strncmp(decryptedString, indexString, 10) == 0){
            fprintf(potentialKey, "%s", key); 
        }
    }
}

但是我从没有任何比赛。我尝试将每个字符串存储到数组中,并一次测试一个字符,这对我也不起作用,因为它将所有英文单词都放在一行上。我简直迷失了方向,因此向正确方向提供的任何帮助或指导都将非常感谢。预先谢谢你。

编辑:根据克利福德在评论中的建议,这是我要尝试做的一个例子

比方说indexFile包含:

HELLO
WORLD
PROGRAMMING
ENGLISH

并且解密文件包含

HEVWIABAKABWHWHVWC
HELLOHEGWVAHSBAKAP
DHVSHSBAJANAVSJSBF
WORLDHEEHHESBVWJWU
PROGRAMMINGENGLISH

我正在尝试一次将indexFile的每个单词与解密文件进行比较。因此,将indexFile中的所有四个单词分别与第1行,第2行,第3行,第4行和第5行进行比较。

2 个答案:

答案 0 :(得分:1)

如果您要检查输入行是否以单词开头,则应使用:

strncmp(line, word, strlen(word));

如果您知道line长于word,则可以使用

memcmp(line, word, strlen(word));

如果重复使用相同的单词,最好将word的长度保存在与word本身相同的数据结构中,以避免重新计算每次。

这是strncmp的常见用例。请注意,您对strncmp的描述有点不准确。当它在两个自变量中都击中NUL时,它将停止,但是只有当两个自变量在同一位置都具有NUL或计数用完而没有遇到差异时,它才会返回等于。

strncmplineword长的事实更安全,因为memcmpstrncmp之间的速度差很小

但是,由于要检查的数据量和字数太多,因此您应该尝试一些减少比较次数的操作。例如,您可以将单词放入Trie。或者,如果这看起来工作量太大,则可以至少按其首字母对它们进行分类,并且仅使用首字母与该行的首字母匹配的字母(如果有)。

如果您要在行中的任何位置查找单词的实例,则需要更复杂的搜索策略。有很多算法可以解决这个问题。 Aho-Corasick是有效且简单的方法,尽管速度更快。

答案 1 :(得分:0)

如果解密的文本行长352个字符,而索引中的每个单词都不长352个字符,则解密的文本行将永远不会匹配索引中的任何单词。

据此,我认为您误解了要求,并根据误解提出了一个问题。

特别是,我怀疑您想将解密行中的每个单词(而不是整个行)与索引中的每个单词进行比较,以确定解密行中的所有单词是否都可以接受。为此,第一步是将解密的字符行分解为单个单词-例如也许会找到在已解密文本中分隔单词(空格,制表符,逗号?)的字符,然后将它们替换为零终止符(以便您可以使用strcmp(),而不必担心“ foobar”不正确匹配) “ foo”只是因为前几个字母匹配)。

请注意,可能存在潜在的优化。例如。如果您知道解密文本中的一个单词是8个字符(您必须知道将零终止符放在正确的位置),并且您的索引是否分为“每个单词长度的一个列表”(例如包含3个字符的索引词列表,包含4个字符的索引词列表等),则可以跳过很多字符串比较(仅将解密行中的单词与长度相同的单词进行比较)。索引)。在这种情况下(您知道两个单词的长度已经相同),还可以避免修改原始的352个字符(无需在每个单词后面插入零终止符)。