以下是我正在处理的一些代码的摘录。只是想知道如何重置嵌套循环?当第一个循环再次运行时,它仍然在文件的末尾。
while(fscanf(fp2,"%s", wordcheck)!=EOF)//Reads word from text file into array//
{
for (i=0; wordcheck[i]; i++)
{
wordcheck[i] = tolower(wordcheck[i]);//makes all characters lower case//
}
printf("%s", wordcheck);
while(fscanf(fp1,"%s", worddict))
{
if(strcmp(wordcheck, worddict)==0)//compare strings//
{
printf("This word: %s is in the dictionary\n", wordcheck);
dictcount++;
break;
}
else
{
dictcount++;
}
if(worddict == NULL)
{
printf("Your word: %s is not in the dictionary\n", wordcheck);
}
}
}
答案 0 :(得分:4)
答案 1 :(得分:3)
最简单的方法是使用简单的
rewind()
流
rewind(fp2);
这就是你需要的,因为它不是需要重置的“循环”。循环只是迭代输入文件的行,并且循环本身不能“重新启动”而不会以某种方式改变文件的状态。幸运的是,这正是rewind()
所做的,因为它将文件重置为刚刚打开后的文件。
正如其他人所指出的,这是一种非常低效的对字典验证文本的方法,因为对要检查的每个输入字重复基于文件的迭代。文件不是特别快,特别是与内存中的数据相比。因此,如果您根据文件输入为大型输入集合构建某种内存字典,那么这可能是一个巨大的胜利。
这可能非常简单,我建议首先使用您首先排序的单词数组(使用qsort()
),然后使用binary search进行搜索(bsearch()
标准中提供库函数)。在构建初始数组时,您需要使用realloc()
动态增长它,因为您无法知道何时打开字典文件它包含多少个单词。
答案 2 :(得分:1)
您需要重置文件指针。 然而,这是非常低效的。在某种索引中寻找单词会更好。如果字典可以适合内存,您可以使用哈希表或trie(甚至是简单的二叉搜索树)来使循环更快。 如果字典太大而无法容纳在内存中,您仍然可以在基于二进制搜索的文件中使用更高效的搜索。