首页/文章/ 详情

灵活使用matlab实现文件数据的读写

3年前浏览2420

image.png

 过冷水诚挚邀请你加入Matlab仿真秀官方交流群进行Matlab学习、问题咨询、 Matlab相关资料下载,群号:927550334 

QQ图片20210424105303.png

    在Matlab的使用过程中,各种类型的文件的导入,对于Matlab是非常基础的知识。本期过冷水就给大家讲讲常用的导入文本文件的函数fopen、fread函数使用方法。

fileID = fopen(filename,permission,machinefmt,encodingIn)

该函数的作用是打开一个文件,我们重点需要看的是参数设置,对我们后续操作的影响。Permission:文件访问类型,这个很简答,就是描述你想对这个文件进行什么操作。它的类型有:

image.png

参数要和其它函数命令结合才能看出效果,暂时先不不进行演示。Machinefmt:表示

图片

    过冷水之前的工作中就有判断文件数据储存数据顺序类型。所以该参数具有较强的实用性。

    存储顺序 :存储顺序是指存储在计算机内存中的地址顺序。例如,一个四字节整形数据0x0A0B0C0D,高字节数据(0x0A)存储在高地址,低字节数据(0x0D)存储在低地址。 高地址、低地址的概念不能在拓展了,入局太深出不来。阅读顺序 阅读顺序就是人们习惯的看文字的顺序。还用“存储顺序”中的4字节整形数据来说明,0x0A0B0C0D为16进制表示形式,阅读顺序为从左到右(高字节到低字节)。在调试程序或编写程序经常看到或用到这样的常量,其实就是一个数据的表示形式,这个形式遵从人们的阅读习惯。 

     Little Endian 与 Big Endian 从字面讲,Little Endian就是说小数据(此处的小为阅读顺序中的低字节数据:0x0D)存储在前端(内存中的低地址)。Big Endian就是说大数据(此处的大为阅读顺序中的高字节数据:0x0A)存储在前端(内存中的低地址)。little endian :地址:高 -> 低, 0D 0C 0B 0A big endian 地址:高 -> 低, 0A 0B 0C 0D 

其余的几个参数含义实用较少,过冷水就不进行讲解了。这里要主要是储存数据的先后顺序和打开数据的先后顺序要匹配,不然就会报错。

image.png

encodingIn:具体编码形式。咱不太懂,咱也不能乱讲。告诉大家有哪些编码形式就行了。

image.png

    这些参数都很关键,其实主要涉及到跨平台操作的问题,python或者其它编译软件处理的文件现在matlab需要处理,那么就必须字节顺序、编译方式要一致,不然自然得不到我们想要的结果。

Fopen函数讲完了,现在讲讲fwrite函数

fwrite(fileID,A,precision,skip,machinefmt) 
%该命令还指定将字节或位写入文件的顺序
fileID:要写入内容的文件
A:待写入文件中内容
Skip:在写入每个值之前跳过skip指定的字节或位数
precision :写入文本到文件中的具体方式

precision:

image.png

一个简单的实例:

fileID=fopen('test.dat','w','b')

str=['matlab爱好者与你一起成长'];

fwrite(fileID,str,'char');

fclose(fileID);

图片

     图片上给出了不同precision设置值的代码,写入到文本中的值不同,使用int8写入数据,后面的字符“爱好者与你一起成长”因为不符合格式要求不能写入文本。不同参数值使得写人的文本类型是不同的,precision参数设置是实用价值较大的一个参数,过冷水在这里只起到一个抛砖引玉的作用,这方面知识了解的比较深,有能力给大家讲清楚的读者可以可以和大家分享心得,“你的快乐我一半”。

    过冷水想给家讲的是自己在实际应用中遇到的一个问题。

图片

    把这两个文件路径以文本的形式写入文本中,方便python依据路径读取文件。看似就是一个简单写入数据过程,之前已经演示过了,为何还要提这个问题呢?“细节处见功夫”。该文件写入涉及到换行命令?看所谓的百度知道如何解决这个问题。

图片

图片

图片

图片

    显然网上相关资料很多,过冷水只需要照猫画虎去做就行了,这个问题so easy!照着他们的方法尝试即可。

图片

图片

    两个函数函数一个是不能正确换行,一个是不能正确写入字符串,看来网上的专家分享心得的时候讲的不够详细,等到具体做参考时,总是不能正确使用,幸亏你们点开matlab爱好者公众号,遇到了过冷水给你们曝露问题,走过你们没有走过的坑,让你们没的坑走。回过头来自己自己说matlab编程很精通吗?一个半罐水去否定另一个半罐水,这是不对的。假设他们说的是对的呢?万一我的电脑有故障呢?过冷水又尝试了一下。

图片

    看来网上专家说的是对的。but我的问题为何不能用fprintf()写入文本呢?最后过冷水才搞懂是“C:\...”识别过程出了错。所以编程是一门玄而又玄的科学,各种莫名其妙的bug能让人怀疑人生。最后过冷水想了一个混合方法:

outName='C:\Users\wayne\Desktop\PVOX1\PVOX\SAMPLE_TEST\parsec_grid0_4.out'

datName='C:\Users\wayne\Desktop\PVOX1\PVOX\SAMPLE_TEST\parsec_grid0_4.dat'

fName = fopen('test.dat','wt');

fwrite(fName,outName);

fprintf(fName,'\n');

fwrite(fName,datName);

fclose(fName);

    该段代码成功解决了我的疑惑。关于fwrite函数的实际应用过冷水就讲这么多。后期遇到新的用法会继续补充。二进制文本读写数据中fprintf、fread这两个函数也是经常使用的函数,读者若是感兴趣且听我下次分解。

图片

        过冷水发表于 仿真秀 平台原创文章,未经授权禁止私自转载,如需转载请需要和作者沟通表明授权声明,未授权文章皆视为侵权行为,必将追责。如果您希望加入Matlab仿真秀官方交流群进行Matlab学习、问题咨询、 Matlab相关资料下载均可加群:927550334。

精品回顾

 matlab绘制农夫过河动态图

分子动力学的原子空间运动轨迹演示编程

过冷水带你用matlab制作演示动画

python批量移动文件&重命名代码分享

过冷水和你分享 matlab读取存储各种文件的方法 文末有独家金曲分享

image.png


科普理论代码&命令MATLAB
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2021-04-29
最近编辑:3年前
过冷水
博士 | 讲师 讨论号:927550334
获赞 361粉丝 184文章 107课程 11
点赞
收藏
作者推荐

¥5 5.0
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈