C语言中如何使用fread或fgets读取文件内容直至匹配指定字符串
实现思路
这里提供两种对应需求的可行实现方案:
方案1:用fgets逐行读取(逻辑最简单,推荐优先使用)
核心利用fgets以换行符为读取边界的特性,刚好匹配终止符.\r\n是完整行的特征:
- 以二进制
rb模式打开文件,避免标准库自动转换换行符导致匹配失效 - 每次调用
fgets读取单行内容到临时缓冲区 - 读取完成后对比当前行内容是否等于
.\r\n,匹配则直接终止读取 - 未匹配则将当前行内容追加到总存储缓冲区,注意记录已写入长度避免缓冲区溢出
示例代码
#include <stdio.h> #include <string.h> #include <stdlib.h> #define SINGLE_LINE_BUF 1024 // 单行最大长度,按需调整 #define TOTAL_BUF 10240 // 总存储缓冲区大小,按需调整 #define STOP_MARK ".\r\n" // 终止匹配串 int main(void) { FILE* fp = fopen("your_file.txt", "rb"); if (!fp) { perror("文件打开失败"); return 1; } char line_buf[SINGLE_LINE_BUF] = {0}; char* res_buf = malloc(TOTAL_BUF); if (!res_buf) { perror("缓冲区分配失败"); fclose(fp); return 1; } memset(res_buf, 0, TOTAL_BUF); size_t written_len = 0; while (fgets(line_buf, SINGLE_LINE_BUF, fp)) { // 匹配到终止行直接退出循环 if (strcmp(line_buf, STOP_MARK) == 0) { break; } size_t curr_len = strlen(line_buf); // 防止总缓冲区溢出,可替换为动态扩容逻辑 if (written_len + curr_len >= TOTAL_BUF) { fprintf(stderr, "总缓冲区容量不足\n"); break; } strcpy(res_buf + written_len, line_buf); written_len += curr_len; } // 打印结果 printf("读取结果:\n%s", res_buf); free(res_buf); fclose(fp); return 0; }
方案2:用fread块读取(适合大文件/超长行场景)
如果存在单行长度超过预设缓冲区、或者需要更高读取效率的场景,可以用块读取方案:
- 同样以二进制模式打开文件,每次读取固定大小(比如4KB)的字节块
- 每次读取完成后,在已读取的所有内容中搜索子串
.\r\n - 如果找到匹配位置,直接将匹配位置之前的内容截断作为最终结果
- 如果没找到,暂存已读取内容的最后2个字节(因为终止串占3字节,避免跨块的终止串被漏匹配),下次读取时先拼接暂存内容再搜索
注意事项:
- 必须用二进制模式打开文件,否则Windows系统下
\r\n会被自动转为\n,无法匹配到终止串- 如果是Linux/macOS环境下生成的文本文件,换行符为
\n,将终止匹配串改成.\n即可- 固定大小缓冲区可以优化为动态扩容逻辑,适配任意大小的输入文件
内容的提问来源于stack exchange,提问作者HelloMonster
相关产品推荐
相关产品推荐

