如何重置while循环?

时间:2011-12-20 14:14:39

标签: c while-loop

以下是我正在处理的一些代码的摘录。只是想知道如何重置嵌套循环?当第一个循环再次运行时,它仍然在文件的末尾。

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);
            }
        }
    }

3 个答案:

答案 0 :(得分:4)

使用fseek

fseek(fp2, 0, SEEK_SET);

..或更简单地说,rewind

rewind(fp2);

答案 1 :(得分:3)

最简单的方法是使用简单的

rewind()
rewind(fp2);

这就是你需要的,因为它不是需要重置的“循环”。循环只是迭代输入文件的行,并且循环本身不能“重新启动”而不会以某种方式改变文件的状态。幸运的是,这正是rewind()所做的,因为它将文件重置为刚刚打开后的文件。

正如其他人所指出的,这是一种非常低效的对字典验证文本的方法,因为对要检查的每个输入字重复基于文件的迭代。文件不是特别快,特别是与内存中的数据相比。因此,如果您根据文件输入为大型输入集合构建某种内存字典,那么这可能是一个巨大的胜利。

这可能非常简单,我建议首先使用您首先排序的单词数组(使用qsort()),然后使用binary search进行搜索(bsearch()标准中提供库函数)。在构建初始数组时,您需要使用realloc()动态增长它,因为您无法知道何时打开字典文件它包含多少个单词。

答案 2 :(得分:1)

您需要重置文件指针。 然而,这是非常低效的。在某种索引中寻找单词会更好。如果字典可以适合内存,您可以使用哈希表或trie(甚至是简单的二叉搜索树)来使循环更快。 如果字典太大而无法容纳在内存中,您仍然可以在基于二进制搜索的文件中使用更高效的搜索。