Соответствие текста без зацикливания каждый раз в C - PullRequest
0 голосов
/ 27 октября 2019

Я создаю код, который постоянно читает ввод с клавиатуры и сравнивает его с текстовым файлом, содержащим имена пользователей. каждая строка в текстовом файле содержит только одно имя. Программа определяет, совпадает ли введенный текст с именами пользователей в строке.

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

например, если вводится впервые Ben, а текстовый файл -

Ben
Tom 
Albert 
Alex

Я хочу, чтобы программа в первый раз зациклилась и обнаружила соответствующий текст. но во второй раз, если вход отличается, например. Alex тогда программа только начинает цикл со второй строки и исключает первую строку из цикла.

Вот мой код в основной функции

FILE * fp;
char Line[150];
char user[150];
printf("enter name: ");
fgets(user,150, stdin);
fp = fopen ("users.txt", "r");

if(fp == NULL)
    {
        perror("Error.. ");
        exit(EXIT_FAILURE);
    }

int line_start;
    while(!feof(fp))
    {
        fgets(Line, 150, fp);

        if (feof(fp))
            break;

        int store_start[150];
        long store_end[150];
        int i=0;


        if (strcmp(user, Line) == 0)
        {
            //printf("%s\n", "match found");
            fseek(fp, 0, SEEK_CUR); 
            long line_end = ftell(fp);
            line_start = line_end - strlen(Line);
            store_start[i]=line_start;
            store_end[i]=line_end;         
                printf("%s\n", "match found")           

                for (int i = 0; i < 150; ++i)
                {
                    if (line_start==store_start[i] && line_end==store_end[i])
                    {
                        //skipp reading
                        fseek(fp, 1, SEEK_CUR);
                        printf("%ld\n",ftell(fp) ); 

                    }

                }

            printf("start is %d end is %ld \n", store_start[i],store_end[i]);

        }

        i++;



    }   

Мой подход заключается вобнаружить первое вхождение слова и если совпадение произойдет. хранит индекс начала строки в массиве store_start[150] и окончание строки в другом массиве store_end[150], для которого произошло совпадение, и в следующий раз прочитает каждую вещь передначальный индекс и после последнего предложения строки.

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

if (line_start==store_start[i] && line_end==store_end[i])
                    {
                        //skipp reading
                        fseek(fp, 1, SEEK_CUR);
                        printf("%ld\n",ftell(fp) ); 
                    }

Я хочу, чтобы код пропускал чтение этой строки и переходил к следующей строке.

1 Ответ

0 голосов
/ 27 октября 2019

Вам нужна структура данных, которая может помочь вам в решении этой задачи.

Для этой цели идеально подходит Trie, подробнее об этом можно прочитать здесь https://en.wikipedia.org/wiki/Trie.

Кроме того, вот пара его реализаций c: https://www.techiedelight.com/trie-implementation-insert-search-delete/ и https://gist.github.com/cijogeorge/20b41a0dc7385fbc58c93d2e7837c5ee

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