2011-12-20 81 views
0

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

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

呃,'while'语句末尾的';'是pastebin的拼写错误,对不对? – fge 2011-12-20 14:16:37

+0

关闭并重新打开文件? – user973572 2011-12-20 14:17:02

+0

哎呀哈哈是的;是一个错字:D – adohertyd 2011-12-20 14:18:51

回答

4

使用fseek

fseek(fp2, 0, SEEK_SET); 

..或者更简单地说,rewind

rewind(fp2); 
1

你需要重新设置文件指针。 但是,这是非常低效的。在某种索引中查找单词会更好。如果字典可以放入内存中,则可以使用散列表或树(甚至是简单的二叉搜索树)使循环快得多。 如果字典太大而无法放入内存中,则仍然可以在基于二进制搜索的文件中使用更高效的搜索。

3

最简单的方法是rewind()流,用一个简单的

rewind(fp2); 

这是你所需要的,因为它不是“循环”,需要重新设置。循环只是迭代输入文件的行,并且循环本身不能在不改变文件状态的情况下“重新启动”。幸运的是,这正是rewind()所做的,因为它将文件重置为刚刚打开它之后。

正如其他人指出的那样,这是一种针对字典验证文本的非常低效的方式,因为基于文件的迭代对每个要检查的输入字都会重复。文件并不是特别快,尤其是没有与内存中的数据进行比较。所以,如果你这样做了大量的输入来建立基于文件输入的内存字典,这可能是一个巨大的胜利。

这可能是很简单的,我会建议用语言,你第一个排序(与qsort()),然后搜索使用binary search(在bsearch()标准库函数可用)的数组开始了。在构建初始数组时,您将希望使用realloc()来动态增长它,因为无法知道何时打开字典文件包含多少个字。

+0

我知道这是伟大的建议,但我是C的新手,并没有真正与二进制工作。我将与fseek函数一起工作。我一定会看看你所说的,尽管谢谢 – adohertyd 2011-12-20 14:51:53