如何使用fgets读取文本文件不同行,实现全文特定内容检索?
读取文本文件全内容的实现方案
fgets仅读取单行内容是该函数的正常设计:它的工作逻辑就是遇到换行符\n、缓冲区满、或者读到文件末尾时就停止读取,单次调用最多返回一行内容。要读取全文件内容匹配特定单词,可以用以下两种常用方案:
方案1:循环调用fgets逐行读取(适配大文件,推荐优先使用)
该方案不需要一次性加载整个文件到内存,哪怕是GB级别的大文件也可以正常处理,内存占用极低:
#include <stdio.h> #include <string.h> #define LINE_BUF_SIZE 1024 // 可根据实际最大行长度调整缓冲区大小 int main() { FILE *file = fopen("test.txt", "r"); if (file == NULL) { perror("文件打开失败"); return 1; } char line_buf[LINE_BUF_SIZE]; int line_num = 0; const char *target_word = "目标单词"; // 替换为你要查找的单词 // 循环读取每一行直到文件末尾 while (fgets(line_buf, sizeof(line_buf), file) != NULL) { line_num++; // 对当前行做单词匹配 if (strstr(line_buf, target_word) != NULL) { printf("第%d行匹配到目标单词:%s\n", line_num, line_buf); } } fclose(file); return 0; }
方案2:一次性读取整个文件到内存(适合小文件,匹配效率更高)
如果文件体积不大,且需要处理跨换行的单词匹配场景,可以一次性把整个文件内容加载到内存中处理:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { FILE *file = fopen("test.txt", "r"); if (file == NULL) { perror("文件打开失败"); return 1; } // 获取文件总字节数 fseek(file, 0, SEEK_END); long file_size = ftell(file); fseek(file, 0, SEEK_SET); // 申请内存,多留1字节存储字符串结束符'\0' char *file_content = (char*)malloc(file_size + 1); if (file_content == NULL) { perror("内存申请失败"); fclose(file); return 1; } // 读取整个文件内容到内存 fread(file_content, 1, file_size, file); file_content[file_size] = '\0'; // 补全字符串结束符 const char *target_word = "目标单词"; // 替换为你要查找的单词 if (strstr(file_content, target_word) != NULL) { printf("文件中匹配到目标单词\n"); // 可添加更多匹配结果处理逻辑 } // 释放资源 free(file_content); fclose(file); return 0; }
注意事项
- 如果待查找的单词存在跨两行的场景(比如前一行末尾是单词前半部分,换行后是后半部分),逐行读取方案需要额外做行尾和下一行开头的拼接处理,这种场景更适合一次性全量读取的方案。
- 如果文本文件使用GBK、UTF-8等多字节编码,需要对应使用适配多字节编码的字符串匹配函数,避免乱码导致匹配失败。
内容的提问来源于stack exchange,提问作者Jonas
相关产品推荐
相关产品推荐

