使用UNIX的read()系统调用来查找给定模式的用户

时间:2011-08-14 17:18:13

标签: grep

我正在尝试使用C程序模拟UNIX的grep 模式(仅用于学习)。我写的代码给了我一个运行时错误..

#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 :(得分:0)

说字符串是“fooPATTERN”。你第一次通过循环,检查“fooPATTERN”中的模式并找到它。然后你第二次循环,你检查“ooPATTERN”中的模式,然后再找到它。然后你第三次检查“oPATTERN”中的模式并再次找到它。

既然你要这样学习,我不会告诉你更多。您可以决定如何最好地解决它。至少有两种根本不同的方法可以解决它。一个是在循环的每次传递中做的更少,以确保您只找到一次。另一种方法是确保循环的下一次传递超过了找到的任何模式。

要考虑的一件事:如果模式是'oo'而字符串是'ooo',那么应该找到多少个模式? 1还是2?

答案 1 :(得分:0)

  1. 'read'不会使用空字符分隔数据。
  2. while循环应该包含for循环 - 它不是

答案 2 :(得分:0)

首先,如果您刚刚学习C,则不应该将原始Unix i / o与openread一起使用。从标准C i / o开始使用fopenfread / fscanf / fgets等等。

其次,你将文件的连续部分读入同一缓冲区,每次都覆盖缓冲区,并且只处理缓冲区的最后内容。

第三,当您使用read()读取缓冲区时,没有任何保证您的缓冲区将被终止。事实上,它通常不会。

第四,你没有在循环体中使用i变量。我无法确切地说出你在这里拍摄的是什么,但在同样的数据上做同样的事情肯定不是一千次。

第五,始终使用您可以遵守的最完整警告设置进行编译 - 至少-Wall使用GCC。它应该抱怨您在不包含read()的情况下致电<unistd.h>