打印从包含特定单词的文件中读取的一行

Printing a line read from a file containing a particular word

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

int main()

{
  int i, p=0;;
    int c;
    char file_name[100];
    char  search[10];

    printf("Enter the file name:");
    scanf("%s", file_name);
    printf("Search word:");
    scanf("%s", search);

    FILE *f = fopen((strcat(file_name, ".txt")), "rb");
    fseek(f, 0, SEEK_END);
    long pos = ftell(f); 
    fseek(f, 0, SEEK_SET);

    char *bytes = malloc(pos + 1);
    fread(bytes, pos, 1, f);
    bytes[ pos ] = '[=10=]'; 

/*search*/

    if (strstr(bytes, search) != NULL){
        printf("found\n");
        p = 1;}
    else{
        printf("Not found\n");

        p=0;}

    free(bytes);

   char *found = strstr( bytes, search );
   if ( found != NULL )
   {
    char *lineStart;
    for(lineStart = strchr(bytes, '\n');  !strcmp(lineStart,"\n"); 
        lineStart = strchr(lineStart+1, '\n')){
      printf("%s\n", lineStart);  
   }
  }
}

上面的代码应该在文件 (.txt) 中搜索一个词,如果找到它应该打印 "found" 并打印它所在的行。例如,如果搜索文件中的单词 "Brick",如果在像 "The house is made of red bricks" 这样的句子中找到,那么它会打印整个句子作为输出,即 "The house is made of the red bricks"

我无法打印包含搜索词的行。我正在尝试使用指针移动到当前行的开头,然后逐步导航,但我有点卡在如何让指针停在行尾并打印到那一点。

您的代码存在问题,您在代码中调用了 free(bytes);,之后继续使用 bytes。这会调用 undefined behavior.

此外,我会建议

  1. 更改您的 scanf() 说明

    scanf("%s", file_name);
    

    scanf("%s", search);
    

    scanf("99%s", file_name);
    

    scanf("9%s", search);
    

    避免缓冲区溢出的风险。

  2. 在使用 returned 指针之前始终检查 fopen() 是否成功。

不过,从逻辑上来说,我还是建议你

  1. 使用fgets()
  2. 从文件中逐行读取整个
  3. 使用 strstr() 搜索特定词。
  4. 如果找到,则打印整行,否则,继续执行步骤 1,直到 fgets() return NULL。

备注:

  1. main()推荐的签名是int main(void).
  2. 始终初始化所有个局部变量。