Shaps36 2022-09-18 19:30 采纳率: 100%
浏览 20
已结题

关于二进制文件格式遇到的一些问题

//测试在一个整数的中间字节插入另一个整数会怎么样
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
FILE * file;
int a = 1;
int b = 2;
int c;

if ( ( file = fopen ( "bionary_test.txt","wb+") ) == NULL )
{
    fprintf(stderr,"Open file failed.");
    exit(1);
} 

fwrite(&a,sizeof(int),1,file);
rewind(file);  //指针一定要重置,不然是接着继续的
fread(&c,sizeof(int),1,file);  //只能用二进制读取,不能用fscanf(),不知为何,会输出43
printf("%d\n%d\n",c,sizeof (int));

fseek(file,2L,SEEK_SET);
fwrite(&a,sizeof(int),1,file);
rewind(file);
fread(&c,sizeof(int),1,file);
printf("%d\n",c);
fread(&c,sizeof(int),1,file);
printf("%d\n",c);
fseek(file,0L,SEEK_END);
c =ftell(file);
printf("%d\n",c);

return 0;

}

输出结果:
1
4
65537
65536
6

原本里面的数字是1,占用4个字节,应该前31位都为0,最后一位是1,我在第二个字节后面插入了数字2,结果现在里面有6个字节而不是8个字节,说明是从第二个字节开始覆盖住了后面的4个字节而不是添加了4个字节,但是即使这样,前4个字节也应该都是0,结果却输出了65537。

除此之外我又读了4个字节,但是里面只剩下2个字节了,但是却读取成功了,输出结果65536。请问是为什么

另外我如果用fscanf从文件中读取数字的话会读出43,也不知道是为什么

希望大家能为我解决疑惑

  • 写回答

1条回答 默认 最新

  • _GX_ 2022-09-18 20:53
    关注

    x86/x64架构都是采用小端的,即低地址端存的是低有效位字节,高地址端存的是高有效位字节。
    整型值1,占4个字节,二进制是0x000001,但按小端存储的话, 字节顺序是0x01, 0x00, 0x00, 0x00
    第一次fwrite写入1后,文件内容是0x01 0x00 0x00 0x00
    第二次fwrite从偏移2的位置写入1后,文件内容变成0x01 0x00 0x01 0x00 0x00 0x00
    fread从文件开始读入整型,得到整型值是0x00010001,即65537
    然后再用freed继续读一个整型,由于当前文件指针位置距离文件结尾只有2个字节,读入整型(4个字节)时遇到文件结尾,因此整体没有读取成功。你应该判断一下freed的返回值,此处应该返回0,因为没有成功读入整型。
    https://en.wikipedia.org/wiki/Endianness

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月26日
  • 已采纳回答 9月18日
  • 创建了问题 9月18日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改