社区
模式及实现
帖子详情
读取多种数据类型的二进制文件及其数据的访问
haven_t
2009-02-04 10:10:59
要读取某种二进制文件,该文件文件头包含有该文件数据类型等信息(int,float),数据读取后需要对数据进行均值、绘制直方图等操作,现在的问题是读取后的数据应该以何种方式保存,数据的访问怎样才能更有效率(数据量有可能非常大)?
现在我使用的方法是使用类进行封装,数据读到类中一个union{i int;f float}数组中,每次访问都要确定数据类型才决定调用union中的哪个类型,这样写起来代码非常冗长烦复,请问大家有什么方案能改进?
...全文
220
13
打赏
收藏
读取多种数据类型的二进制文件及其数据的访问
要读取某种二进制文件,该文件文件头包含有该文件数据类型等信息(int,float),数据读取后需要对数据进行均值、绘制直方图等操作,现在的问题是读取后的数据应该以何种方式保存,数据的访问怎样才能更有效率(数据量有可能非常大)? 现在我使用的方法是使用类进行封装,数据读到类中一个union{i int;f float}数组中,每次访问都要确定数据类型才决定调用union中的哪个类型,这样写起来代码非常冗长烦复,请问大家有什么方案能改进?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
armads12
2009-02-07
打赏
举报
回复
不懂,up
noenoughmemory
2009-02-07
打赏
举报
回复
不懂,up
haven_t
2009-02-05
打赏
举报
回复
问题是读取文件前并不确定数据是int或者float甚至是double,那么数据应该以怎样的方式储存?即便使用void*储存,那么在数据访问的函数中就需要进行类型转换,写出的代码就变得非常丑陋!
haven_t
2009-02-05
打赏
举报
回复
谢谢yutaooo的提点,确实也有一部分操作是使用混合运算的,但是在数值方法上如均数标准差等函数都是单一类型的运算,我也知道需要作出某些取舍,因思及与数据库的运作有些许相似,故想籍此拓展一下思路而已。
armads12
2009-02-05
打赏
举报
回复
不懂,up
noenoughmemory
2009-02-05
打赏
举报
回复
不懂,up
yutaooo
2009-02-05
打赏
举报
回复
数据库也是需要一个叫元数据的部分。类似于你的文件头。
如果,你始终是要进行混合数据的计算,那么显然转成 double 是没有时间上的性能损失的。并且,相比较每次及时转类型,无论从代码的复杂度上,还是时间效率上都有优势,空间上,略有损失。但我想,绝大多数情况下,可以忽略。
那么,既然你还在犹豫,我想很可能是你直觉上觉得不使用这样的方案更合适。再想想,到底什么什么因素呢?
C/C++中, float + int 首先要转换成 float + float 的。
haven_t
2009-02-05
打赏
举报
回复
需要执行的操作有很多,例如把数据绘制直方图、点图,根据某些条件筛选数据并求该条件下符合条件数据的均数,标准差标准误等,由于数据量可能会比较大,而且涉及绘图,所以数据访问比较频繁,对效率的考虑不得不慎重。
转到高精度的数据也考虑过,确实这个方案是最简单的,可能我对效率和资源占用太执着了。但我想一些数据库文件的读取应该也是类似吧,字段的类型在读取文件后才能确定,效率对数据库也是非常重要的,数据库是怎样做的呢?
yutaooo
2009-02-05
打赏
举报
回复
关键还是看你有些什么操作。比如,读出数据,放入了缓冲,然后是些什么操作呢?
有求平均,这个求平均是混合了不同数据类型的吗?
那你简单点,读入的时候全转 double 不好吗?
haven_t
2009-02-05
打赏
举报
回复
[Quote=引用 5 楼 naturemickey 的回复:]
如果不知道类型怎么读出来呢?int与double的位数都不一样。
除非文件中的数据是以特定的格式排列的(例如:每两个数字之间是由空格分开的),这样的话,用double储存不就行了?
如果数据是连续的二进制代码,那就要知道数据类型才知道一次读取多少个0/1。
你不是说“该文件文件头包含有该文件数据类型等信息”么?怎么又说不确定数据类型了呢?
[/Quote]
文件头有数据类型的信息以及数据段的起始地址(象bmp类型的文件,这应该是很多文件类型的储存格式吧),读取了文件头通过数据偏移读取数据,因为数据是二进制保存,故不需要考虑间隔符。就例如文件某一数据二进制值为0011111,如果文件头定义为int,那该值便是31,若是float那便是其它值了。
虽然文件说明类型可能为int,float,double,但我先不想考虑64位的数据,现在我用
union VAL32{
i int;
f float}
保存32位数据,在访问数据时先确认数据类型,然后才用相应方法访问数据。如
VAL32 v;
v.i// 按照int数据访问
v.f// 按照float数据访问
求这些数据平均值的函数就非常丑陋了,当然另一种方法也可以使用cast进行类型转换,但结果也好不了多少。
yutaooo
2009-02-05
打赏
举报
回复
根据文件头,可以确定,要么剩余数据全是float,要么全是int是这样吗?
naturemickey
2009-02-05
打赏
举报
回复
如果不知道类型怎么读出来呢?int与double的位数都不一样。
除非文件中的数据是以特定的格式排列的(例如:每两个数字之间是由空格分开的),这样的话,用double储存不就行了?
如果数据是连续的二进制代码,那就要知道数据类型才知道一次读取多少个0/1。
你不是说“该文件文件头包含有该文件数据类型等信息”么?怎么又说不确定数据类型了呢?
naturemickey
2009-02-04
打赏
举报
回复
“非常”两个字用得严重了。
每个文件调用一次不算麻烦。
将
二进制
数据
嵌入 XML 文档的三种方法
将 XML 用于 B2B 应用程序之间的
数据
传输 XML 用于
数据
互操作性的主要优点是其可扩展性及其能够以文本格式表示所有形式的
数据
的能力。甚至当处理
二进制
数据
时,XML 也证明了它的价值。本文集中讨论了在XML中 表示
二进制
数据
的三种方法。第一种方法以最适当的方式使用 XML 和 DTD 表示
二进制
文件
或
数据
源。第二种方法使用一种简单格式,其中每个人都能定义自己的格式来表示
C语言基础14——
文件
操作。文本
文件
或
二进制
文件
读写。通讯录的改造。
文件
缓冲区讲解
目录 为什么使用
文件
? 什么是
文件
?
文件
的打开和关闭
文件
指针
文件
的打开和关闭
文件
的打开方式 流 重定义
文件
文件
流
文件
的顺序读写 以字符形式读写文本
文件
fputc()函数 fgetc()函数 以字符串形式读写文本
文件
fputs()函数 fgets()函数 格式化读写
文件
fprintf()函数 fscanf()函数 以
数据
块的形式读写
文件
fwrite()函数 fread()函数 三种输入/输出函数的比较 改造通讯录
文件
的随机读写 fsee
二进制
漏洞分析与挖掘
本公众号分享的所有技术仅用于学习交流,请勿用于其他非法活动,如果错漏,欢迎留言指正
二进制
漏洞分析与挖掘 《0day安全:软件漏洞分析技术第2版》王清电子工业出版社 入门用,但不全,过时了,linux部分没有包含进去 漏洞分析、挖掘和利用,安全领域重要和最具挑战性和对抗性的分支 应用在综合开发,算法,语法,系统底层,内核,逆向,汇编,调试等方方面面 漏洞是怎么回事? BUG:软件的功能性逻辑缺陷。影响软件的正常功能。 漏洞:能够导致软件做一些超出设计范围的事情的bug,则漏洞。这类BU..
C++读
二进制
文件
及 C++设置double精度
C++设置double精度#include cout setiosflags(ios::fixed) setprecision(2) m "%" endl;*******************************************************************************************************************
Matlab
文件
操作 txt
二进制
csv XML JSON HDF5 图像 音频 视频等
matlab支持对
多种
文件
格式进行导入 同时也支持低级IO api进行
访问
标准
文件
格式 文本、电子表格、图像、科学
数据
、音频和视频、XML 文档de 标准
文件
格式功能从常见
文件
格式中
读取
数据
,例如 Microsoft®Excel®电子表格、文本、图像、音频和视频,以及科学
数据
格式。有关详细信息,请参阅支持的导入和导出
文件
格式。 您可以通过在主页选项卡上选择导入
数据
来
读取
这些格式中的...
模式及实现
5,530
社区成员
4,169
社区内容
发帖
与我相关
我的任务
模式及实现
C/C++ 模式及实现
复制链接
扫一扫
分享
社区描述
C/C++ 模式及实现
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章