NI LabVIEW,CVI,数据采集等产品讨论区

取消
显示结果 
搜索替代 
您的意思是: 

请教关于程序结构设计的问题

已解决!
转到解答

大家好,我尝试用事件结构来实现如下的思路,但是遇到了很大的困难,麻烦各位高手指点小弟一下:

 

针对一类文件来处理,每个文件包含4个字节数相同的部分(为了表述方便,定义为A,B,C,D);每个部分里还包含字节数相同的3个小部分(定义为1,2,3),即文件的数据内容可能是A11111 22222 33333   B11111 22222 33333   C11111 22222 33333   D11111 22222 33333。

 

首先通过按钮一来打开对话框选择文件,然后在通过按钮二来选择读取的是ABCD中的哪部分,然后在通过按钮三来选择读取1,2,3中的哪部分。

 

抽象后大致就是上面的过程,感觉实现起来实在是有些复杂,不知道大家怎么看这个问题,如果有其他的方式能实现上述过程也行,谢谢各位啦。

 

祝大家新的一年里工作学习都有更大的成绩!

0 项奖励
1 条消息(共 7 条)
5,096 次查看

又想了一下,要是把原始文件拆分成12个小文件,命名为A1,A2,A3,B1……D3,再存储,然后在通过对话框选择文件读取呢?如何通过循环实现上述的文件拆分呢?

 

不知道这两种方法哪种更好些?谢谢

0 项奖励
2 条消息(共 7 条)
5,091 次查看

基本上,在我看来,你遇到的问题就是一个如何读取文件的问题。而与所“程序结构设计”关联不是太大,你说呢?

 

按照我的理解,你现在遇到如下的文件格式,试图很灵活的读取用户指定的某部分数据段。

#                  A             #                  B             #                  C             #                  D             #

#   A1   |   A2    |A3      #   B1   |   B2    |B3      #   C1   |   C2    |C3      #   D1   |   D2    |D3      #

即,你希望用户首先选择A/B/C/D中的某个分段,然后再选择所对应的1/2/3子分段。

 

其实,就是一个如何读取文件的问题。只不过,你要用户一遍一遍不厌其烦的点击按钮而选择。其实,有两个下拉菜单控件是不是就够了呢?一个罗列A/B/C/D,一个罗列1/2/3,两个下拉的结果一汇总,便是12个小分段的某个。

 

其实ABCD以及123给定的就是一个文件读取索引,我们将ABCD123换成实际的文件读取offset就可以了。然后,读取长度是已知的,读取所需长度就可以了。具体操作如下:

 

1)如果每个子分段的长度是固定的,那么依靠就知道任意子分段的offset位置,使用用户给定的ABCD123换算成OFFSET。

2)打开文件,使用“设置文件指针位置”的函数(在文件\高级里边),然后,用Offset设置当前文件指针位置,再然后,使用文件数据读取函数(字符串或二进制),读取想要的长度就可以了。

3)你要理解的是,文件读取的原型函数为readfile(HFILE hmyfile, int offset, int length, int mode),不用管第一、四个参数,只要给定offset和length,就可以读到任意自己想要的数据,而所谓文件的结构,也不过就是给你一个计算offset和length的方法罢了,此例中,文件由12等大小子片组成,而ABCD123的两级结构也只是这些数据之间的一个逻辑关系罢了。子段长度固定,相当于length是已知的,而ABCD123一大堆的描述,也无非就是告诉你,如何通过他们算出offset。

 

=================================================

PS:两种方法都不是太好

第一个,操作太麻烦,两个下拉就好了。

第二个,“脱裤子放屁,多此一举”

Message Edited by hunt978 on 01-02-2010 10:03 PM
3 条消息(共 7 条)
5,078 次查看
谢谢hunt978的热心指点,我想要解决的问题的确如您说的那样。

但是我还有一些困惑,我提到的4*3=12个小部分只是举例,实际上一个文件中至少有50*7=350个小部分,需要在程序运行时可以任意访问读取。用下拉来解决的确是最直接简洁的做法,但是这样是不是就需要用350个Case分支结构了?这就太繁琐了。所以我才咨询有没有比较好的程序结构设计可以解决问题。

也可能我还是没有领会hunt978您的指导,望大家继续不吝赐教。谢谢

祝各位新的一年里万事顺意!
0 项奖励
4 条消息(共 7 条)
5,071 次查看
解答
已被主题作者 zhangyu1900 接受

这里是一个例子,任意n*m读取。完全自动化处理:

文件版本8.6

5 条消息(共 7 条)
5,059 次查看

如果你是在读取一个*.txt文件,而里面有至少是一个50×7容量的矩阵的话,这里有更简单的方法。可以直接读取文件,而在LabVIEW中获得一个double或者int32或者任意你想要的数据类型的二维数组。

 

试一试:

File IO\Read From Spreadsheet File.vi。很简单,一头连接路径,另一头二维数组就出来了。

6 条消息(共 7 条)
5,055 次查看

速度真快啊,我去学习消化下,非常感谢您的热心指导!

0 项奖励
7 条消息(共 7 条)
5,039 次查看