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

Uhm, ';' в конце инструкции 'while' является опечаткой от pastebin, правильно? – fge

+0

Закройте и снова откройте файл? – user973572

+0

К сожалению, ха-ха да; была опечатка: D – adohertyd

ответ

1

Вам нужно сбросить указатель файла. Однако это довольно неэффективно. Было бы лучше искать слова в каком-то индексе. Если словарь может поместиться в память, вы можете использовать хеш-таблицу или trie (или даже простое двоичное дерево поиска), чтобы сделать цикл намного быстрее. Если словарь слишком велик для размещения в памяти, вы все равно можете использовать более эффективный поиск в файле на основе двоичного поиска.

3

Самый простой способ заключается в rewind() поток, с помощью простого

rewind(fp2); 

Это то, что вам нужно, так как это не «цикл», который должен быть сброшен. Цикл просто повторяется по строкам входного файла, и сам цикл не может быть «перезапущен», так или иначе не изменяя состояние файла. К счастью, это именно то, что делает rewind(), так как он сбрасывает файл так, как он был сразу после его открытия.

Как указывали другие, это очень неэффективный способ проверки текста по словарю, поскольку повторение на основе файлов повторяется для каждого проверяемого слова ввода. Файлы не особенно быстры, особенно не сравниваются с данными в памяти. Таким образом, вероятно, это будет огромная победа, если вы сделаете это для больших наборов ввода для создания своего рода словаря в памяти на основе ввода файла.

Это может быть очень простой, я бы рекомендовал начать с массив слов, которые вы первый сорт (с qsort()), а затем выполнять поиск с помощью binary search (доступен в стандартной библиотечной функции bsearch()). При создании исходного массива вам нужно будет использовать , чтобы динамически его вырастить, поскольку вы не можете знать, когда вы открываете файл словаря, сколько слов оно содержит.

+0

Я знаю, что это отличный совет, но я новичок в C и еще не работал с бинарными. Я иду с функцией fseek, и она работает. Я обязательно посмотрю, что вы сказали, хотя спасибо – adohertyd

Смежные вопросы