我是语言c的新手,所以我会感激你的每一个帮助:D
我需要将第一个文件(" Albert\n Martin\n Bob"
)中的给定单词与第二个文件(" Albert\n Randy\n Martin\n Ohio"
)中的单词进行比较。
每当他们是相同的,我需要在文件中加入“语言”;并打印第二个文件中没有表示的每个单词“
像这样的东西:
语言
语言
鲍勃
需要在我的第三个档案中;
我试图提出一些想法,但他们没有工作; p,
提前感谢每个人。
答案 0 :(得分:1)
首先,您需要open a stream来阅读文件。
如果您需要在C中执行此操作,则可以使用 strcmp 功能。它允许您比较两个字符串。
例如:
int strcmp(const char *s1, const char *s2);
答案 1 :(得分:0)
我打开所有三个文件(输入文件和输出文件)。如果你无法打开所有这些,那么你就无法做任何有用的事情(除了显示错误信息之外);没有必要浪费CPU时间才发现(例如)你以后无法打开输出文件。这也可以帮助减少竞争条件(例如,在处理第一个文件时更改第二个文件)。
接下来,开始处理第一个文件。在阅读时将其分解为单词/标记,并为每个单词/标记计算哈希值。然后使用散列值和单词/标记本身来检查新单词/标记是否与先前(已知)单词/标记重复。如果它不是重复的,则分配一些内存并为单词/标记创建一个新条目,并将该条目插入到与散列相对应的链接列表中。
最后,处理第二个文件。这类似于您处理第一个文件的方式(将其分解为单词/标记,计算哈希值,使用哈希来查明单词/标记是否已知),除非单词/标记未知您是否写入输出文件,如果已知,则将“language”写入输出文件。
如果您不熟悉哈希表,那么它们相当容易。对于计算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值会增加您使用的内存量(并减少不同单词具有相同哈希值的几率)。
完成后,请不要忘记关闭文件。释放你使用的内存是一个好主意,如果你在此之后做其他事情(但如果你在此之后没有做任何事情,那么“退出()”更快更容易,并让操作系统清理。)