C读取python结构数组

背景:

将python—numpy的结构数组保存到本地,然后用c将数据读取出来。

可能用到的知识:

  1. 在C语言中通过struct关键字定义结构类型,结构中的字段占据连续的内存空间,每个结构体占用的内存大小都相同,因此可以很容易地在此基础上定义结构数组。和C语言一样,在NumPy中也很容易对这种结构数组进行操作。只要NumPy中的结构定义和C语言中的定义相同,两者就可以很容易的读取对方结构数组的二进制数组。
  2. numpy创建结构数组:先创建一个dtype对象,通过其字典参数描述结构类型的各个字段。字典有两个关键字:names,formats。每个关键字对应的值都是一个列表。names定义结构中的每个字段名,而formats则定义每个字段的类型,类型描述前面我们可以添加 `|', `<' ,'>'字符,用这些字符可以控制字段值的字节顺序:(1) | : 忽视字节顺序 (2)< : 低位字节在前 (3)> : 高位字节在前。相当于大小尾个概念,一般字符串默认“|”,数值默认“<”。
  3. 内存对齐:C语言的结构体为了内存寻址方便,会自动的添加一些填充用的字节,这叫做内存对齐。例如:如果把下面的name[32]改为name[30]的话,由于内存对齐问题,在name和age中间会填补两个字节,最终的结构体大小不会改变。因此如果numpy中的所配置的内存大小不符合C语言的对齐规范的话,将会出现数据错位。为了解决这个问题,在创建dtype对象时,可以传递参数align=True,这样numpy的结构数组的内存对齐和C语言的结构体就一致了。

代码:

python:导出结构数组二进制形式

persontype = np.dtype({
    'names':['name','age','weight'],
    'formats':['S30','i','f']
        }
    ,align = True)
an = np.array([('xm',32,75.5),('xq',23,65),("xn",4,65.6)],dtype = persontype)
an.tofile("C:\\Users\\tinysoft\\Desktop\\test.bin")

C++:读取结构数组

#include <iostream>
#include <cstdio> 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct numpy{
	char name[30];
	int age;
	float weight;
};
int main(int argc, char** argv) {
	FILE *fp;
	fp = fopen("C:\\Users\\tinysoft\\Desktop\\test.bin","r");
	
	numpy buf[3];
	
	fread(buf,sizeof(numpy),3,fp);
	fclose(fp);
	
	for(int i = 0;i<3 ;i++){
		printf("%d : %s %d %f\n",i,buf[i].name,buf[i].age,buf[i].weight);
	}
	
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值