2011-12-20 80 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