读写bin

来源:互联网 发布:四川大学王牌专业知乎 编辑:程序博客网 时间:2024/06/05 00:42

前言

工程中经常将参数文件存储为bin格式, 但是实际中为了分析其参数, 也不好用C++去读取调试它, 所以可以用matlab或者python去读取它, 但是还是蛮坑的

Matlab中的读取和写入

写入文件

比较坑的是, 一定要注意自己的文件存储的类型, 比如数值是float还是double之类的, 不然很容易在读取的时候出问题.

关于数字的写入方法如下:

fileID=fopen('MatrixTest.bin','w');%w+是不擦除,直接附加内容a=[1,2,3;4,5,6;7,8,9];fwrite(fileID,a,'double');%存储为double类型fclose(fileID);

文本的写入方法同样:

fileID=fopen('TxtTest.bin','w');%w+是不擦除,直接附加内容a='哈哈哈哈嗝';fwrite(fileID,a,'char');%写入格式charfclose(fileID);

读文件

一定要与写入的数据类型相同

读取bin中存储的矩阵

fileID=fopen('MatrixTest.bin');A=fread(fileID,[17,17],'double')fclose(fileID);%% 输出A'ans =     1     4     7     2     5     8     3     6     9

可以发现matlab是列读取的, 如果我们知道矩阵的大小,那么就可以指定好

fileID=fopen('MatrixTest.bin');A=fread(fileID,[3,3],'double')fclose(fileID);%输出A =     1     2     3     4     5     6     7     8     9

如果我们将double类型替换成float,得到的结果就是

A =         0    2.2500         0    1.8750         0    2.0000         0    2.4375         0

可以发现是完全错误的,当然我们不指定类型, 即去掉double, 最终的结果也是错误的, 因而这个格式需要非常严格.

读取文本就需要用另一个函数native2unicode,而且不需要指定数据类型

fileID=fopen('TxtTest.bin');A=fread(fileID);native2unicode(A')fclose(fileID);%输出ans =哈哈哈哈嗝

Python中的读取和写入

主要涉及到tofilefromfile两个函数, 同时也必须注意存储的矩阵数值的类型

写入文件

import numpy as npimport sysa=np.arange(1,10,1).reshape(3,-1)a=np.asarray(a,dtype='float')a.tofile('matrix_a.bin')

这样我们就在bin文件中存储了一个矩阵, 类型为float

[[ 1.  2.  3.] [ 4.  5.  6.] [ 7.  8.  9.]]

读取文件

读取就很简单了,就一个函数,只不过要提前知道数据类型

b=np.fromfile('matrix_a.bin','float')#输出#[ 1.  2.  3.  4.  5.  6.  7.  8.  9.]

总结

从这里可以发现, 无论是matlab还是python, 我们存储和读取的时候的数据类型一定要一致,不然读到的结果就是错误的. 还可以发现matlab是按列存储, python是按行存储的

原创粉丝点击