C语言逐行查找文件中的单词

Search for a word in file line by line in C programming

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

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() 需要 FILE* 而不是文件描述符。

改变

 int fd ;
 fd = open(file , O_RDONLY );

 FILE* fp = fopen(file, "r");

并使用 fp 作为 fgets.

的参数

问题2

sizeof(line) 未计算为 1024,正如您可能期望的那样。它只是评估指针的大小,这很可能是 48.

改变

while (fgets(line , sizeof(line) ,fd )!= NULL)

while (fgets(line , 1024, fp )!= NULL)

更新

此外,由于您在对 malloc 的调用中对 1024 进行了硬编码,因此您不妨使用数组。然后,您可以使用 sizeof(line).

void FindWord(char *word , char *file){
   char line[1024] ;
   FILE* fp = fopen(file, "r") ;
   while (fgets(line , sizeof(line) , fp )!= NULL)
   {
      if (strstr(line , word )!= NULL)
      {
         printf("%s",line);
      }
   }
}

有几件事是错误的。

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

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

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

  • fgets(line , 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);
}