qq_15504529
qq_15504529
2020-05-19 16:29
采纳率: 66.7%
浏览 324

C语言二进制文件读写异常

#include <stdio.h>


int main()
{
    FILE* fp = fopen("D:\\计算机\\VSdemo\\CPUdemo\\dict.dic2", "rb");
    unsigned int x;
    fread(&x, sizeof(x), 1, fp);
    printf("%u", x);
}

想写一个读取二进制数的程序,文件中的二进制数是00001011000100000000000000000000,输出是808464432,实在不明白

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • hanleideshizi
    hanleideshizi 2020-05-19 17:08
    1. 你的文件里面的二进制数存的应该是字符串“00001011000100000000000000000000”吧,如果是还需要进行转换保存到变量x中
    2. printf("%u", x);只能输出整数,要输出16进制数可以用%x,没有直接输出二进制的
    点赞 评论
  • zhenmu
    zhenmu 2020-05-19 17:16

    你的文件里是存放了文本吧:00001011000100000000000000000000,

    即 代码里来说就是 "00001011000100000000000000000000" 这么一块内存数据, 占了32个字节 32*8位

    第一个0 存在文件里, 其实占一个字节的磁盘空间, 对应ascii编码是 48 即0x30, 你用支持十六进制编辑器打开来看看就知道了(比如UltraEdit 打开 ctrl+H一下)

    同理后面3个0分别占用1个字节。

    '1' 则在文件的第5个字节位置, 编码是 49 0x31


    x是一个无符号int,即占4个字节。

    fread(&x, sizeof(x), 1, fp); 你这样读, 会读取前4个字节的数据进来, 即 0x30303030 即 808464432


    况且 windows 上一般是低位优先的:
    比如文件里 是 "0123456"
    则x读出来其实 0x33 32 31 30


    所以,你真的要写入二进制文件, 需要程序写入,而不是文本编辑器写入, 文本编辑器写的默认是文本格式的, 除非像UltraEdit支持直接十六进制修改。



    对了 注意 一般手动改编码值,一般是十六进制方式的, vs里断点调试内存 一般也是十六进制显示(或10进制), 一般不会直接编辑二进制,那多烦啊, 只是学程序入门阶段要了解二进制, 概念上要清楚,位操作需要理解二进制。



    b 说了是二进制方式, 其实是相对于文本方式, 并不是读出来或者显示出来是二进制, 而是读写都是严格的程序层面的读写,
    文本方式 说白了应该是在读取二进制方式的基础上, 对文本方面做了特殊处理: 比如一些编码可能会自己转的问题, 读写时linux回车0x0D变成windows回车\x0A\x0D 傻啥啥的莫名问题, 可以读取一行 或者写入一行(会自动识别回车)


    所有文件,不管是不是文本文件,都可以用二进制方式来读取的。

    点赞 评论

相关推荐