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

时间:2015-04-16 21:37:22

标签: c file search fgets strstr

我正在尝试编写代码来逐行搜索文件中的单词并打印包含该单词的行。 功能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);
      }
   }
}

2 个答案:

答案 0 :(得分:4)

问题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);
      }
   }
}

答案 1 :(得分:0)

有些事情是错误的。

  • 如果您不需要,则不应使用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)返回指针的大小,而不是缓冲区大小。

  • 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);
}