2011-12-20 4 views
-1

Можно создать дубликат:
Compare two text files - spellchecking program in Cреализует алгоритм проверки орфографии

Я пишу программу проверки орфографии, которая будет сравнивать текстовый файл пользователя со словарем, чтобы увидеть, если слова, которые они Введенные в словаре.

Словарь проходит один раз, а затем зацикливается на последнем слове. Как я могу снова прокрутить словарь?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 

int main (void) 
{ 
    FILE * fp1, *fp2;    /* file handle */ 
    char userword[100]; 
    char dictword[100]; 
    char fname[40]; 
    int i, j, ca, cb; 

    // printf("Enter filename to compare to dictionary:"); 
    // fgets(fname,40,stdin); 
    // fp1 = fopen(fname,"r"); 
    fp1 = fopen("userdoc.txt", "r"); /* open file for reading, use for 
             * time being until name input resolved*/ 
    fp2 =fopen("dictionary.txt", "r"); 

    if (fp1 == NULL) 
    { 
      printf("Could not open file for output.\n"); 
      return 0; 
    } 
    if (fp2 == NULL) 
    { 
     printf("Cannot open %s for reading \n", fname); 
     exit(1);  // terminate program 
    } 

    for (i=0; userword[i]; i++) 
    {    
     fscanf(fp1, "%s", &userword); 
     printf("The word being checked is %s\n", userword); 

     j=getc(fp2); 
     while (dictword[j] != EOF) 
     { 
      fscanf(fp2, "%s", &dictword); 
      /*printf("The first entry in the dictionary is %s\n", dictword); //check if dictionary is looping*/ 

      if(strcmp(dictword, userword) == 0) 
       { 
       printf("you spelt \"%s\" correctly \n", dictword); 
       break; 
      } 
      else  
      { 
       /*printf("sorry \" %s \" is not in the dictionary\n", userword);*/ 
      } 
     } 
    } 
    fclose(fp1); 
    fclose(fp2); 
    return 0; 
} 
+3

Почему «диктофон» такой большой? вы всегда читаете в начале? И вы скомпилировали все предупреждения? Вы скомпилировали для отладки? Вы использовали ваш отладчик для выполнения вашей программы шаг за шагом? Вы можете протестировать его небольшим файлом dictionnary (из нескольких слов) –

+0

, вам, возможно, придется обратиться к [this] (http://stackoverflow.com/questions/8576785/how-do-i-reset-a-while-loop) .. Это может не решить вашу проблему, но даст вам хорошие подсказки! –

+0

Он сравнивает первые несколько слов в userdoc по мере необходимости. если я печатаю слово, которое читает словарь, он показывает, что он застрял в последней записи и бесконечно печатает его на экране. При компиляции кода никаких предупреждений нет. – greta

ответ

0

Непосредственная причина, почему это не в состоянии сделать что-либо в следующей строке:

for (i=0; userword[i]; i++) 

Петля условный здесь значение, а именно значение char по индексу i. Обратите внимание, что, поскольку это означает, ваша программа никогда не инициализирует значения в этом массиве (следовательно, Basile Starynkevitch предлагает вам скомпилировать с предупреждениями, например -Wall -Wextra).

Если вы вообще получаете какой-либо результат, это просто случайность. Значения в массиве userword [] могут быть заполнены ненулевыми значениями, но во многих ситуациях они также могут быть равны нулю. Интересно, что некоторые среды отладки (например, gdb или MSVC) намеренно заполняют неинициализированные области памяти специальными значениями, чтобы вам было легче видеть, когда это происходит. См. Например, this.

Sangeeth Saravanaraj пытается направить вас в нужное русло. В ответ там, обратите внимание, что внешний контур выглядит следующим образом:

while(fscanf(fp2,"%s", wordcheck)!=EOF)//Reads word from text file into array// 

Этот цикл имеет две вещи в одном - он копирует строку из fp2 в wordcheck и также проверяет, чтобы увидеть, если эта операция вернула EOF - в основном указание на то, что мы находимся в конце файла. Когда мы закончим, он выходит из цикла while.

Просто исправление петли for не полностью исправить вашу программу. Подумайте о том, как вы перебираете каждое слово в словаре. Ваш код будет работать только с одним словом userdoc, потому что после одного прохода через ваш словарь вы будете в конце этого файла. Вам придется сбросить так называемый указатель файла в начало вашего файла словаря, если вы хотите, чтобы этот метод работы:

while(fscanf(fp1,"%s", &userword)!=EOF){    

    printf("The word being checked is %s\n", userword); 
    fseek(fp2,0,0); 
    while (fscanf(fp2, "%s", &dictword) != EOF) 
    { ... } 
+0

Большое спасибо, это действительно полезно – greta

+0

Вот для чего предназначена кнопка upvote! ;) – Rooke

0

Во-первых, я хотел бы также рекомендовать пошаговую свой код шаг за шагом используя инструмент, например ddd (соответственно отладчик GNU). На мой взгляд, это один из лучших способов найти ошибки, поскольку вы можете наблюдать за изменением всех переменных во время выполнения.

Следующая проблема, я вижу, что вы используете dictword неинициализированный. Каково содержание слова dict [j], прежде чем в первый раз войти в цикл while?

fseek(char *stream, long offset, int whence) Используется для установки индикатора положения файла для потока. Существует также функция, называемая rewind(char *stream), для сброса индикатора положения назад в начало файла (оба включены в stdio.h).

Для получения дополнительной информации, попробуйте прочитать приведенный ниже man pages.

В принципе, вы можете просто использовать rewind(fp1); в конце последнего цикла цикла (не забудьте соответствующим образом переустановить переменную цикла).

Надеюсь, у меня есть вопрос правильно;).