Как мне сбросить цикл while? - PullRequest
0 голосов
/ 20 декабря 2011

Вот выдержка из некоторого кода, над которым я работаю.Просто интересно, как бы я мог обнулить вложенный цикл?Он остается в конце файла при повторном запуске первого цикла.

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 ]

4 голосов
/ 20 декабря 2011

Использование fseek:

fseek(fp2, 0, SEEK_SET);

.. или, проще говоря, rewind:

rewind(fp2);
3 голосов
/ 20 декабря 2011

Самый простой способ - <a href="http://linux.die.net/man/3/rewind" rel="nofollow">rewind()</a> поток, с простым

rewind(fp2);

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

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

Это может быть очень просто, я бы рекомендовал начать с массива слов, которые вы сначала сортируете (с помощью <a href="http://linux.die.net/man/3/qsort" rel="nofollow">qsort()</a>), а затем выполняете поиск с использованием двоичного поиска (доступно в стандартной библиотеке <a href="http://linux.die.net/man/3/bsearch" rel="nofollow">bsearch()</a>) функция). При построении исходного массива вы можете использовать <a href="http://linux.die.net/man/3/realloc" rel="nofollow">realloc()</a> для его динамического увеличения, поскольку при открытии файла словаря вы не можете знать, сколько слов в нем содержится.

1 голос
/ 20 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...