Использование системного вызова read () UNIX для поиска заданного пользователем шаблона - PullRequest
0 голосов
/ 14 августа 2011

Я пытаюсь эмулировать grep pattern UNIX, используя программу на C (только для обучения).Код, который я написал, выдает ошибку времени выполнения ..

#include <fcntl.h>
#include <stdio.h>
#include <string.h>

#define MAXLENGTH 1000
char userBuf[MAXLENGTH];

int main ( int argc, char *argv[])
{
        int numOfBytes,fd,i;


        if (argc != 2)
                printf("Supply correct number of arguments.\n");
                //exit(1);

        fd =open("pattern.txt",O_RDWR);

        if ( fd == -1 )
                printf("File does not exist.\n");
                //exit(1);

        while ( (numOfBytes = read(fd,userBuf,MAXLENGTH)) > 0 )
                ;

        printf("NumOfBytes = %d\n",numOfBytes);

        for(i=0;userBuf[i] != '\0'; ++i)
        {
                if ( strstr(userBuf,argv[1]) )
                        printf("%s\n",userBuf);
        }

}

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

Спасибо

Ответы [ 3 ]

0 голосов
/ 14 августа 2011
  1. «read» не разделяет данные нулевым символом.
  2. Цикл while должен охватывать цикл for - он не
0 голосов
/ 14 августа 2011

Во-первых, вы не должны использовать необработанный ввод / вывод Unix с open и read, если вы только изучаете C. Начните со стандартного ввода-вывода C с fopen и fread / fscanf / fgets и пр.

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

В-третьих, ничто не гарантирует, что ваш буфер будет нулевым, если вы прочитаете его с помощью read(). На самом деле, обычно это не так.

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

В-пятых, всегда компилируйте с наиболее полными настройками предупреждений, которые вы можете соблюдать - по крайней мере -Wall с GCC. Он должен был жаловаться, что вы звоните read() без включения <unistd.h>.

0 голосов
/ 14 августа 2011

Скажите, что строка "fooPATTERN". При первом прохождении цикла вы проверяете шаблон в "fooPATTERN" и находите его. Затем, во второй раз в цикле, вы проверяете паттерн в "ooPATTERN" и находите его снова. Затем в третий раз вы проверяете шаблон в «oPATTERN» и находите его снова.

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

Стоит подумать: если шаблон «oo», а строка «ooo», сколько шаблонов нужно найти? 1 или 2?

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