学习笔记(31):C语言 从小白到大神: 入门篇-将结构体写入二进制文件再读出

立即学习:https://edu.csdn.net/course/play/8088/178762?utm_source=blogtoedu

1. 将结构体写入二进制文件

fwrite的一般形式:

fwrite(buffer,size,count,fp);

buffer:指针或者说是个地址,要写到文件中去的数据就在这个地址里保存着;

size:要写入文件的字节数

count:要进行写入多少个size字节的数据项

fp:文件指针

返回值:如果fwrite失败,则返回0,否则返回count值;

注意事项:

(1)结构体中不要出现指针,因为指针指向一个地址,程序再次执行的时候,这个指针指向的地址很可能和你写入文件时该指针指向的地址不同了,所以保存上次指针指向的地址值是没意义的,如果引用了还可能导致程序报错崩溃

(2)结构体内存对齐问题,和编译器有关,有时定义的结构体总长度应该是42字节,但实际是48字节,为什么?因为vs编译器为了提高程序运行效率,有的时候可能一个变量不够8字节整数倍的,他给凑成8字节整数倍,这样内存地址访问起来快;但是当文件跨平台读取时,编译器不同,可能出错

解决方法:

(1)在相同的平台上用;都windows或者都linux;

(2)用#pragma pack (1)  设置结构体对齐方式。告诉编译器,按1字节对齐,也就是不用对齐,结构成员是多少个字节,就多少给字节。然后不想对齐时再用#pragma pack()取消结构对齐;

 

2. 从二进制文件中读出结构体数据

fread (buffer,size,count,fp);

buffer:指针或者说是个地址,从文件中读出来的数据写到哪个地址去呢,就是这个地址;

size:要读入的字节数

count:要进行读多少个size字节的数据项

fp:文件指针

返回值:如果fread失败,则返回0,否则返回count值;

 

你可能感兴趣的:(研发管理,c语言,c++,编程,程序设计,C/C++)