C语言读取文件中short类型二进制数转十进制错误问题求解
问题原因与解决方法
核心错误
- 你混淆了两种完全不同的存储形式:
- 你写的转换函数仅适用于处理由0/1组成的十进制输入值/字符串,比如控制台输入十进制数
101,把每一位数字当成二进制位计算得到结果5。 - 你从文件读取的是原生以
short类型存储的二进制数值,这类数值本身在C语言的short变量中就会被自动解析为对应的十进制值,完全不需要手动做进制转换。
- 你写的转换函数仅适用于处理由0/1组成的十进制输入值/字符串,比如控制台输入十进制数
- 你得到错误结果17的原因是把读取到的内容错误传入了上述不适配的转换函数,额外做了无意义的计算导致结果偏差。
正确实现方法
场景1:文件为二进制格式,数值以short类型原生存储
直接用二进制模式打开文件,调用fread读取对应大小的内容到short变量中即可直接使用,示例代码如下:
#include <stdio.h> #include <stdlib.h> // 如果需要处理字节序问题,额外引入下面的头文件 // #include <arpa/inet.h> int main() { // 注意打开二进制文件必须加b标识,避免系统对换行符等做自动转换 FILE *fp = fopen("你的目标文件路径", "rb"); if (fp == NULL) { perror("文件打开失败"); return 1; } short arr_size; // 直接读取short长度的二进制数据到变量 if (fread(&arr_size, sizeof(short), 1, fp) != 1) { perror("读取数值失败"); fclose(fp); return 1; } fclose(fp); // 可选:如果文件存储的是大端序(网络字节序),和当前主机字节序不一致,加下面这行转换 // arr_size = ntohs(arr_size); // 此时arr_size已经是可用的十进制值,你描述的场景下此处打印结果为5 printf("读取到的数组大小为:%hd\n", arr_size); return 0; }
场景2:文件为文本格式,存储的是0/1组成的字符串
如果直接用文本编辑器打开文件能看到0000000000000101这类文字内容,说明是文本格式存储的二进制序列,需要先读取字符串再调用库函数转换:
#include <stdio.h> #include <stdlib.h> int main() { FILE *fp = fopen("你的目标文件路径", "r"); if (fp == NULL) { perror("文件打开失败"); return 1; } char bin_buf[17] = {0}; // 读取16位二进制字符串 if (fgets(bin_buf, 17, fp) == NULL) { perror("读取字符串失败"); fclose(fp); return 1; } fclose(fp); // 第三个参数2表示按二进制解析字符串 long arr_size = strtol(bin_buf, NULL, 2); printf("读取到的数组大小为:%ld\n", arr_size); return 0; }
内容的提问来源于stack exchange,提问作者Niv Neuvirth
相关产品推荐
相关产品推荐

