python将数据存为二进制,并用C读取

python将数据存为二进制,并用c读取

python保存二进制文件

python将float32类型的numpy数组以二进制形式保存到txt文本
代码

with open("D:\\10GraduationProject\\vedioData\\data_process\\ucf5\\conv1.txt",'wb') as f:
    f.write(checkpoint['state_dict']['conv1.weight'].flatten().numpy().astype('float32'))

上述有三个值得注意的地方:
1.必须是numpy数组,不能是list。numpy能达到目的就用numpy吧,list为什么不能保存也不管了。
如果是保存list数组,将会出现如下错误
在这里插入图片描述
2.二进制体现在参数 “wb”
3.保存为二进制文件,文件后缀名用 .txt 就行,不要用 .bin ,不要画蛇添足,我开始以为要用.bin 折腾了好半天。

证明是真的二进制文件:
(懒得下nodepad++读取二进制的插件了)
在这里插入图片描述

c语言读取二进制文件到数组

python中保存的数组是float32类型的,c端当然也要用float去装这些数据。
代码:

#include <stdio.h>
int main()
{
    
    
	FILE *fp = fopen("D:\\10GraduationProject\\vedioData\\data_process\\ucf5\\fc6.txt", "rb");
	fseek(fp, 0, SEEK_END);
	int fileSize = ftell(fp);
	int arraySize = fileSize / sizeof(float);
	printf("arraySize:%d\n",arraySize);
	fseek(fp, 0, SEEK_SET);
	float* fc6_weight=new float[arraySize];
	printf("len of float: %d\n", sizeof(float));
	fread(fc6_weight, sizeof(float), arraySize, fp);
	printf("%.18f ", fc6_weight[arraySize-1]);
	delete[] fc6_weight;
	fclose(fp);
	return 0;
}

别忘记fclose(fp)了。上面的fclose是后面补加的。
读取结果:
在这里插入图片描述
和python中的numpy的最后一个元素对比:
在这里插入图片描述
python保存二进制文件,以及c语言读取二进制文件到数组,几百兆的数据瞬间完成(目测不到1秒)
完美,收工!!!

后续疑问

但存在一个问题
在Debug x86模式下,出现如下错误:
在这里插入图片描述
我在预处理器中添加了
_CRT_SECURE_NO_WARNINGS,问题依然在,不知为何
在这里插入图片描述

我用fopen_s呢,又出现这样的错误
在这里插入图片描述
不知道啥原因,有知道的朋友麻烦在评论区回复一下。
改成 x64(并且在预处理器中添加_CRT_SECURE_NO_WARNINGS) 就没啥问题了。

值得学习的文章

C语言二进制方式读写文件数据
python 保存二进制文件参考文档

猜你喜欢

转载自blog.csdn.net/weixin_40162095/article/details/114108431