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个回答

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

你的文件里是存放了文本吧: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 傻啥啥的莫名问题, 可以读取一行 或者写入一行(会自动识别回车)


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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问