You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 20:36:00