繁体   English   中英

比较C中两个文件中的字符串;

[英]Comparing strings in two files in C;

我是c语言的新手,所以我将不胜感激:DI需要将第一个文件( " Albert\\n Martin\\n Bob" )中给定的单词与第二个文件( " Albert\\n Randy\\n Martin\\n Ohio"中的单词进行比较) " Albert\\n Randy\\n Martin\\n Ohio" )。 每当它们相同时,我需要在文件中加上“语言”字样; 并在第二个文件中打印没有表示的每个单词“像这样的东西:语言语言Bob

需要保存在我的第三个文件中;

我试图提出一些想法,但是它们没有用。

预先感谢每个答案。

首先,您需要打开一个流以读取文件。

如果需要在C中执行此操作,则可以使用strcmp函数。 它允许您比较两个字符串。

例如:

int strcmp(const char *s1, const char *s2);

我首先打开所有三个文件(输入文件和输出文件)。 如果您无法全部打开它们,那么您将无法做任何有用的事情(除了显示错误消息或其他内容); 并且浪费CPU时间只是为了找出(例如)您以后无法打开输出文件也没有意义。 这也可以帮助减少竞争条件(例如,在处理第一个文件时更改第二个文件)。

接下来,开始处理第一个文件。 阅读时将其分解为单词/令牌,然后为每个单词/令牌计算一个哈希值。 然后使用哈希值和单词/令牌本身来检查新单词/令牌是否与先前(已知)的单词/令牌重复。 如果不是重复项,请分配一些内存,并为单词/令牌创建一个新条目,然后将该条目插入与哈希相对应的链接列表中。

最后,处理第二个文件。 这类似于您处理第一个文件的方式(将其分解为单词/令牌,计算哈希,使用哈希查找单词/令牌是否已知),但如果您不知道单词/令牌,则将其写入到输出文件,如果知道,则改为在输出文件中写入“语言”。

如果您不熟悉哈希表,则它们非常简单。 对于计算ASCII /文本哈希值的简单方法(不一定是最好的方法),您可以执行以下操作:

hash = 0;
while(*src != 0) {
    hash = hash ^ (hash << 5) ^ *src;
    src++;
}
hash = hash % HASH_SIZE;

然后,您将拥有一个链接列表数组,例如“ INDEX_ENTRY * index [HASH_SIZE]”,其中包含指向每个链接列表的第一个条目的指针(如果哈希的链接列表为空,则为NULL)。

要进行搜索,请使用哈希查找正确链表的第一个条目,然后对链表中的每个条目执行“ strcmp()”。 一个例子可能看起来像这样:

INDEX_ENTRY *find_entry(uint32_t hash, char *new_word) {
    INDEX_ENTRY *entry;

    entry = index[hash];
    while(entry != NULL) {
        if(strcmp(new_word, entry->word) == 0) return entry;
        entry = entry->next;
    }
    return NULL;
}

所有这些想法是为了提高性能。 例如,如果两个文件都具有1024个单词,那么(没有哈希表)您将需要执行“ strcmp()” 1024 * 1024次; 但是,如果您使用带有“ #define HASH_SIZE 1024”的哈希表,则可能会将其减少到大约2000倍(并最终获得更快的代码)。 较大的HASH_SIZE值会增加您使用的内存量(并减少不同单词具有相同哈希值的机会)。

完成文件操作后,不要忘记关闭文件。 如果您在此之后执行其他操作,那么释放您使用的内存是个好主意(但是,如果此后您不执行任何操作,则“ exit()”并进行操作系统清理会更快更轻松)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM