zhanghouxing的个人博客分享 http://blog.sciencenet.cn/u/zhanghouxing

博文

C语言与MATLAB对二进制文件与ASCII文件转换

已有 8767 次阅读 2016-7-29 08:51 |个人分类:C 语言|系统分类:科研笔记

(1)DHSVM模型官方网站上提供了一个二进制文件与ASCII文件的转换代码,是用C写的,昨天我仔细看了一下的这个代码,对二进制文件读写有了更深的认识。这个代码是对矩阵数据做处理,因此需要提供行列号。同时,我发现这个代码还可以转换数据格式,比如float to int等等。


这个代码的是写了main函数完整代码,main函数的参数包括:from format, to format, infile, outfile, nrows 和 nclos。在CodeBlocks中,运行代码配置这些参数如下:

需要说明的是,如果是from format 和 to format如果均不包含asii格式,那么这个代码执行的是数据格式转换,而且输入输出都是二进制文件。在进行转换时,需要注意的是,如果from format 和 to format包含char格式时,一定要确保数据取值范围为(-128 - 127)之间,否则会出错。原因可参考:https://docs.mql4.com/cn/basis/types/integer/integertypes

对于多个需要转换的文件,可以写个批处理命令如下:


当然,也可以将这个带有main函数的文件转换为一个函数文件,这样在代码内部对其进行调用。


(2)Matlab对二进制文件与ASCII文件转换(矩阵数据),我昨天也写了一个转换的函数。如下:


函数的调用如下:

当然这个函数,写得也比较粗糙。其实后面我觉得用MATLAB完全没有必要写个函数来转换,直接调用matlab的fread()和fwrite()函数来读写即可。

这里强调一点,在matlab读二进制文件时,与C语言(一行读完,读下一行)不同,是按照先读完一列再读下一列的顺序。比如:一个不换行的文件里含有:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15想要输入matlab时,令其这样排:

1   2   3   4   5

6   7   8   9   10

11  12  13  14  15

fread应该写成:A=fread(fid,[5,3]),得到:

1  6   11

2  7   12

3  8   13

4  9   14

5  10  15

然后再转置,就能得到正确结果了。

如果错误地写成A=fread(fid,[3,5]),则得到

1 4 7 10 13

2 5 8 11 14

3 6 9 12 15

显然即使转置也得不到正确结果。


Convert.rar




https://blog.sciencenet.cn/blog-922140-993328.html

上一篇:C读写二进制文件与文本文件
下一篇:显式与隐式差分
收藏 IP: 210.72.80.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-5 16:05

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部