在C编程中逐行搜索文件中的单词

在C编程中逐行搜索文件中的单词,c,file,search,fgets,strstr,C,File,Search,Fgets,Strstr,我正在尝试编写代码,逐行搜索文件中的单词,并打印包含该单词的行。 函数fgets和getline似乎不起作用 void FindWord(char *word , char *file){ char *line ; line = (char*)malloc(1024) ; int fd ; fd = open(file , O_RDONLY ); while (fgets(line , sizeof(line) ,fd )!= NULL) { if

我正在尝试编写代码,逐行搜索文件中的单词,并打印包含该单词的行。 函数
fgets
getline
似乎不起作用

void FindWord(char *word , char *file){
   char *line ;
   line = (char*)malloc(1024) ;
   int fd ;
   fd = open(file , O_RDONLY );
   while (fgets(line , sizeof(line) ,fd )!= NULL)
   {
      if (strstr(line , word )!= NULL)
      {
         printf("%s",line);
      }
   }
}

问题1

fgets()
需要的是
文件*
而不是文件描述符

改变

 int fd ;
 fd = open(file , O_RDONLY );
while (fgets(line , sizeof(line) ,fd )!= NULL)

并使用
fp
作为
fgets
的参数

问题2

sizeof(line)
的计算结果不会达到您可能期望的
1024
。它只计算指针的大小,很可能是
4
8

改变

 int fd ;
 fd = open(file , O_RDONLY );
while (fgets(line , sizeof(line) ,fd )!= NULL)

更新

另外,由于您在调用
malloc
时硬编码1024,因此您还可以使用数组。然后,您可以使用
sizeof(line)


问题1

fgets()
需要的是
文件*
而不是文件描述符

改变

 int fd ;
 fd = open(file , O_RDONLY );
while (fgets(line , sizeof(line) ,fd )!= NULL)

并使用
fp
作为
fgets
的参数

问题2

sizeof(line)
的计算结果不会达到您可能期望的
1024
。它只计算指针的大小,很可能是
4
8

改变

 int fd ;
 fd = open(file , O_RDONLY );
while (fgets(line , sizeof(line) ,fd )!= NULL)

更新

另外,由于您在调用
malloc
时硬编码1024,因此您还可以使用数组。然后,您可以使用
sizeof(line)


有两件事是错的

  • 如果不需要,您不应该使用
    open
    和文件描述符。 另外,
    fgets
    需要
    文件
    作为3。参数,而不是文件描述符。使用
    文件
    宏:

    FILE *f = fopen("myfile.txt", "r");
    // Use f here
    fclose(f);
    
  • 其次,您分配了内存,但从未释放它

    char *line = malloc(1024 /* *sizeof(char)*/);
    //Some code here
    free(line);
    
  • sizeof(line)
    返回指针的大小,而不是缓冲区大小

  • fgets(行,n,f)
    读取的是
    n
    字节,而不是行。它最多读取
    n
    字节,在'\n'或EOF上停止。改用
    getline

    char *line_buffer = NULL;
    size_t n = 0;
    FILE *f = fopen(...);
    
    getline(&line_buffer, &n, f);
    //use here
    
    fclose(f);
    free(line_buffer);
    
全部合并:

void FindWord(char *word , char *file){
    char *line = NULL;
    size_t n = 0;
    FILE *f = fopen(file, "r") ;
    while (getline(&line_buffer, &n, f) != -1)
    {
        if (strstr(line , word )!= NULL)
        {
             printf("%s",line);
        }
    }
    fclose(f);
    free(line);
}

有两件事是错的

  • 如果不需要,您不应该使用
    open
    和文件描述符。 另外,
    fgets
    需要
    文件
    作为3。参数,而不是文件描述符。使用
    文件
    宏:

    FILE *f = fopen("myfile.txt", "r");
    // Use f here
    fclose(f);
    
  • 其次,您分配了内存,但从未释放它

    char *line = malloc(1024 /* *sizeof(char)*/);
    //Some code here
    free(line);
    
  • sizeof(line)
    返回指针的大小,而不是缓冲区大小

  • fgets(行,n,f)
    读取的是
    n
    字节,而不是行。它最多读取
    n
    字节,在'\n'或EOF上停止。改用
    getline

    char *line_buffer = NULL;
    size_t n = 0;
    FILE *f = fopen(...);
    
    getline(&line_buffer, &n, f);
    //use here
    
    fclose(f);
    free(line_buffer);
    
全部合并:

void FindWord(char *word , char *file){
    char *line = NULL;
    size_t n = 0;
    FILE *f = fopen(file, "r") ;
    while (getline(&line_buffer, &n, f) != -1)
    {
        if (strstr(line , word )!= NULL)
        {
             printf("%s",line);
        }
    }
    fclose(f);
    free(line);
}

我可以使用哪些函数来处理作为fgets()的open()?1)使用fopen()2)关于malloc(),在C中,不要强制转换返回值3)关于malloc(),始终检查(!=NULL)返回值以确保操作成功。4) 始终检查任何open/fopen函数调用的返回值(!=NULL)。5) 使用fopen(文件名为“r”),那么fgets和getline就可以工作了。请阅读您在代码中使用的那些函数的手册。例如,open()返回一个小整数,但fgets和getline需要一个指向文件描述符的指针。“sizeof(line)”,其中line由以下语句声明:“char*line;”将在第一条注释中返回4,而不是malloc()@user3629249分配的字节数,第(1)点:
open
使用起来不错
fopen
也在其内部使用
open
fopen
只是一个库调用,
open
是一个系统调用。两者都做同样的工作。只是fopen的
fopen
更容易使用。但是你不能说
fopen
open
好。所以你的观点是错误的。我可以用什么函数来处理作为fgets()的open()?1)使用fopen()2)关于malloc(),在C中,不要强制转换返回值3)关于malloc(),始终检查(!=NULL)返回值以确保操作成功。4) 始终检查任何open/fopen函数调用的返回值(!=NULL)。5) 使用fopen(文件名为“r”),那么fgets和getline就可以工作了。请阅读您在代码中使用的那些函数的手册。例如,open()返回一个小整数,但fgets和getline需要一个指向文件描述符的指针。“sizeof(line)”,其中line由以下语句声明:“char*line;”将在第一条注释中返回4,而不是malloc()@user3629249分配的字节数,第(1)点:
open
使用起来不错
fopen
也在其内部使用
open
fopen
只是一个库调用,
open
是一个系统调用。两者都做同样的工作。只是fopen的
fopen
更容易使用。但是你不能说
fopen
open
好。所以你的观点是错误的。在文件的顶部添加
#include
。还有哪些函数可以作为fgets与open()一起使用?你可以使用
fread
,但该函数不会在行尾停止读取。它也不会添加终止的空字符
fgets
是您最好的选择。@Hadeel阅读了文档。如果函数读取整数参数(文件描述符),则可以将打开返回的整数传递给它。如果需要文件*,则不能。但您可以使用
fdopen
从文件描述符创建文件*。换句话说,如果您有一个文件描述符
fd
,并且希望使用
fgets
,只需执行以下操作:
file*fp=fdopen(fd,“r”);如果(*fp!=NULL){fgets(…,…,fp);…}
如果每行只包含一个我应该保存在数组中的数字,该怎么办?我也可以使用FGET吗?大小的值是多少?在文件的顶部添加
#include
。还有哪些函数可以作为fgets与open()一起使用?您可以使用
fread
,但是