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

标签 c pointers file-io printf free

#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 ] = '\0'; 

/*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. 在使用返回的指针之前始终检查 fopen() 是否成功。

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

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

注意事项:

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

关于c - 打印从包含特定单词的文件中读取的一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30149136/

相关文章:

c++ - 这两个字符串有什么区别?

c - 如何预测井字游戏中玩家 X 或 O 的获胜位置并告诉用户该位置?

c - C语言实现双向链表

c++ - 跳转到 C++ 第 13 章实践问题 No4 - 指针

c# - 使用 C# 将多个文件写入一个文件时行尾问题

c - 将一维固定数组传递给二维指针函数

c - 为什么输出应该是垃圾却一直是 0 2 ?

c - C 中函数返回局部变量地址时的 NULL 行为

javascript - 如何使用 JavaScript 从服务器读取文本文件?

c++ - 我正在尝试在某些条件下清除我的数据文件中的特殊字符,但不满足这些条件?