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

C语言读取文件解析二进制值:fscanf使用问题求助

如何提取txt文件中的二进制值并存储到不同变量?

我明白你折腾了两天的痛苦——处理这种带固定格式的文本读取,fscanf的格式字符串确实容易踩坑。先直接给你解决问题的方案,再慢慢解释细节。

核心解决方案:用fscanf直接匹配固定格式

你的文件每行格式是固定的in = 二进制串, out = 二进制串,完全可以让fscanf直接跳过那些固定的无关字符,精准提取需要的二进制字符串。

完整可运行代码

#include <stdio.h>

int main() {
    FILE *f = fopen("hamming_demo.txt", "r");
    // 务必检查文件是否成功打开,避免后续崩溃
    if (!f) {
        perror("无法打开文件");
        return 1;
    }

    // 根据你的示例,in是11位二进制,out是16位,数组要留一位给字符串结束符'\0'
    char in_binary[12], out_binary[17];
    
    // 关键:用格式字符串直接匹配固定部分,提取目标值
    // fscanf会自动跳过空白字符(换行、空格都不用管)
    while (fscanf(f, "in = %[^,], out = %s", in_binary, out_binary) == 2) {
        // 这里可以把两个二进制字符串存入你需要的变量或缓冲区
        printf("读取到 in: %s | out: %s\n", in_binary, out_binary);
    }

    fclose(f);
    return 0;
}

为什么这个格式字符串有效?

拆解一下"in = %[^,], out = %s"的每个部分:

  • "in = ":直接匹配这几个固定字符,fscanf会自动跳过前面的空白(包括上一行的换行),相当于直接跳过每行开头的无关内容。
  • %[^,]:这是扫描集合语法,表示匹配所有不是逗号的字符。正好对应in后面的二进制串(因为后面跟着逗号),完美提取出我们要的第一列值。
  • ", out = ":再次匹配固定的分隔符(逗号、空格、out、空格、=、空格),把中间的无关字符全部跳过。
  • %s:读取out后面的二进制串,因为每行的out值后面没有其他分隔符(到行尾),所以%s可以直接完整读取。

你之前代码的问题出在哪?

你之前尝试用%s加%[^a-z]的组合,完全没利用fscanf可以直接匹配固定字符的特性:

  • %s会把in当成一个完整字符串读入,后续的操作自然无法正确过滤;
  • 手动组合fgetc和fscanf反而增加了复杂度,其实fscanf本身就可以处理这些固定格式的分隔。

更健壮的备选方案:先读整行再解析

如果担心文件里有格式错误的行(比如某行少了逗号),可以先用fgets读取整行,再用sscanf解析,这样某行出错不会影响后续行的读取:

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

int main() {
    FILE *f = fopen("hamming_demo.txt", "r");
    if (!f) {
        perror("无法打开文件");
        return 1;
    }

    char line_buffer[100];
    char in_binary[12], out_binary[17];
    
    while (fgets(line_buffer, sizeof(line_buffer), f)) {
        // 先去掉行尾的换行符,避免干扰解析
        line_buffer[strcspn(line_buffer, "\n")] = '\0';
        
        // 用sscanf解析单行内容
        if (sscanf(line_buffer, "in = %[^,], out = %s", in_binary, out_binary) == 2) {
            printf("读取到 in: %s | out: %s\n", in_binary, out_binary);
        } else {
            printf("该行格式错误,跳过:%s\n", line_buffer);
        }
    }

    fclose(f);
    return 0;
}

内容的提问来源于stack exchange,提问作者Allan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 12:32:35