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
相关产品推荐
相关产品推荐

