您最近的更新表明该文件实际上是一个数据库,您正在其中查找一个单词。这个非常重要。
如果你有足够的内存来保存整个数据库,你应该这样做(读取整个数据库并安排它以进行有效搜索),所以你可能不应该询问在文件中搜索的问题。
良好的数据库设计涉及诸如trie和哈希表之类的数据结构。但首先,您可以使用数据库最基本的改进——按字母顺序保存单词(使用有点棘手的qsort函数来实现)。
struct Database
{
size_t count;
struct Entry // not sure about C syntax here; I usually code in C++; sorry
{
char *word;
char *explanation;
} *entries;
};
char *find_explanation_of_word(struct Database* db, char *word)
{
for (size_t i = 0; i < db->count; i++)
{
int result = strcmp(db->entries[i].word, word);
if (result == 0)
return db->entries[i].explanation;
else if (result > 0)
break; // if the database is sorted, this means word is not found
}
return NULL; // not found
}
如果您的数据库太大而无法保存在内存中,您应该使用仅包含数据库中单词开头的 trie;对于每个单词的开头,都有一个文件偏移量,从该偏移量开始扫描文件。
char* find_explanation_in_file(FILE *f, long offset, char *word)
{
fseek(f, offset, SEEK_SET);
char line[100]; // 100 should be greater than max line in file
while (line, sizeof(line), f)
{
char *word_in_file = strtok(line, " ");
char *explanation = strtok(NULL, "");
int result = strcmp(word_in_file, word);
if (result == 0)
return explanation;
else if (result > 0)
break;
}
return NULL; // not found
}