读取多种数据类型的二进制文件及其数据的访问

haven_t 2009-02-04 10:10:59
要读取某种二进制文件,该文件文件头包含有该文件数据类型等信息(int,float),数据读取后需要对数据进行均值、绘制直方图等操作,现在的问题是读取后的数据应该以何种方式保存,数据的访问怎样才能更有效率(数据量有可能非常大)?

现在我使用的方法是使用类进行封装,数据读到类中一个union{i int;f float}数组中,每次访问都要确定数据类型才决定调用union中的哪个类型,这样写起来代码非常冗长烦复,请问大家有什么方案能改进?
...全文
220 13 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
“非常”两个字用得严重了。
每个文件调用一次不算麻烦。

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧