老师给了3种格式的2进制文件,数据是按照如下的方式保存的。现在要求写个程序把这个文件的内容读取出来。不是计算机专业,对这个不怎么懂,请各位老大帮忙一下,拜谢!!!
一、ald文件格式 Open DataFileName1 For Binary As #1
Put #1, , savePara
Put #1, , chaPara
Put #1, , Strip1
Put #1, , DatasOfDrawing
Put #1, , ValidChannels
Put #1, , CurrentPassNo
Put #1, , DateOfSaveFile
Put #1, , TimeOfSaveFile
For i = 0 To ValidChannels - 1
For j = 0 To DatasOfDrawing - 1
Put #1, , MyBuffer(i, j )
Next j
Next i
Close #1二、cnd,cnp文件格式Sub Save_Parameter() '保存cnp文件
Open FullParaFile For Binary As #2
Put #2, , savePara
Put #2, , chaPara
Put #2, , ValidChannels
Put #2, , TotalTimes
Close #2
End Sub
Sub Save_data() '保存cnd文件
For j = 0 To DatasOfDrawing - 1
For i = 0 To ValidChannels - 1
Put #4, , MyBuffer(i, j)
Next i
Next j
End Sub三、数据类型定义Public chaPara(0 To 31) As CHANNEL_PARAMETER '通道参数
Public savePara As PARATOSAVE '采集参数
Public Strip1 As Strip_Parameter '轧件参数
Public DatasOfDrawing As Integer '数据点数(用于ald文件)
Public ValidChannels As Byte '实际使用通道数
Public CurrentPassNo As Long '本数据对应的轧制道次
Public DateOfSaveFile As String * 10 '文件保存时的日期
Public TimeOfSaveFile As String * 8 '文件保存时的时间
Public TotalTimes As Long '数据点数(由于cnd,cnp文件)
Public MyBuffer() As Single '采集的数据Type CHANNEL_PARAMETER
ChannelNo As Byte '通道号
SignalName As String * 25 '信号名称
SignalUnit As String * 10 ' 信号单位
CalibrateRatio As Single '校正系数
ScaleOfSignal As Single '信号纵坐标
BaseData As Single '校正电压
End Type
Type PARATOSAVE
FirstChannel As Byte ' 首通道号
LastChannel As Byte ' 末通道号
Frequence As Long ' 采样频率
Gains As Byte ' 硬件增益
End Type
Type Strip_Parameter
LengthOfStrip As Integer '板坯长度
WidthOfStrip As Integer '板坯宽度
HeightOfStrip As Integer '板坯厚度
Material As String * 15 '材质
Batch As String * 20 '批号
No As String * 8 '序号
End Type
一、ald文件格式 Open DataFileName1 For Binary As #1
Put #1, , savePara
Put #1, , chaPara
Put #1, , Strip1
Put #1, , DatasOfDrawing
Put #1, , ValidChannels
Put #1, , CurrentPassNo
Put #1, , DateOfSaveFile
Put #1, , TimeOfSaveFile
For i = 0 To ValidChannels - 1
For j = 0 To DatasOfDrawing - 1
Put #1, , MyBuffer(i, j )
Next j
Next i
Close #1二、cnd,cnp文件格式Sub Save_Parameter() '保存cnp文件
Open FullParaFile For Binary As #2
Put #2, , savePara
Put #2, , chaPara
Put #2, , ValidChannels
Put #2, , TotalTimes
Close #2
End Sub
Sub Save_data() '保存cnd文件
For j = 0 To DatasOfDrawing - 1
For i = 0 To ValidChannels - 1
Put #4, , MyBuffer(i, j)
Next i
Next j
End Sub三、数据类型定义Public chaPara(0 To 31) As CHANNEL_PARAMETER '通道参数
Public savePara As PARATOSAVE '采集参数
Public Strip1 As Strip_Parameter '轧件参数
Public DatasOfDrawing As Integer '数据点数(用于ald文件)
Public ValidChannels As Byte '实际使用通道数
Public CurrentPassNo As Long '本数据对应的轧制道次
Public DateOfSaveFile As String * 10 '文件保存时的日期
Public TimeOfSaveFile As String * 8 '文件保存时的时间
Public TotalTimes As Long '数据点数(由于cnd,cnp文件)
Public MyBuffer() As Single '采集的数据Type CHANNEL_PARAMETER
ChannelNo As Byte '通道号
SignalName As String * 25 '信号名称
SignalUnit As String * 10 ' 信号单位
CalibrateRatio As Single '校正系数
ScaleOfSignal As Single '信号纵坐标
BaseData As Single '校正电压
End Type
Type PARATOSAVE
FirstChannel As Byte ' 首通道号
LastChannel As Byte ' 末通道号
Frequence As Long ' 采样频率
Gains As Byte ' 硬件增益
End Type
Type Strip_Parameter
LengthOfStrip As Integer '板坯长度
WidthOfStrip As Integer '板坯宽度
HeightOfStrip As Integer '板坯厚度
Material As String * 15 '材质
Batch As String * 20 '批号
No As String * 8 '序号
End Type
……
Material As String * 15 '材质
Batch As String * 20 '批号
No As String * 8 '序号
End Type另外,上面的程序我看了一下,漏洞太多了,希望回去能修改一下。由于我不清楚文件是别的规定还是你们自己定义的,所以实在不好改写。如果是已经存在的格式,只好想办法从Byte角度解决。我下面给你简单说一说如何存取这种文件:三种文件分别可以用Type定义成一个类型。以ALd文件为例子:
·前八个变量可以定义为AldFileHead类型
·MyBuffer(i, j)可以换算成一维数组MySaveBuffer(N)。N=I*W+J。W是j的范围。存的时候你只要
Put #1,1,AldFileHead
Put #1,1+Len(AldFileHead),MySaveBuffer()读的时候是
Get #1,1,AldFileHead。
ReDim MySaveBuffer(i*j-1)
Get #1,1+Len(AldFileHead),MySaveBuffer()其他类型也是同样道理。具体如何解决VB这个Bug,你可以专门发个帖子询问。
……
Material As String * 15 '材质
Batch As String * 20 '批号
No As String * 8 '序号
End Type========================================================
会减半吗?不会啊,如下:写入:
Open "PathFileName" For Binary Access Write Lock Read Write As #1
Put #1, 1, Strip_Parameter
Close #1读出:
Open "PathFileName" For Binary Access Read Shared As #1
Get #1, 1, Strip_Parameter
Close #1
你存文件的时候也可以用类似的办法写一个AldFilePutToFile函数,道理都一样的。如果原来的程序不想修改,你读出来之后只要把AldFile里的值赋值给那些零碎的变量,拆包就可以了。另外,你用Put或者Get语句的时候尽量别Put #1,,Data,最好是Put #1,Address,Data,给它一个确定的地址。Type CHANNEL_PARAMETER
ChannelNo As Byte '通道号
SignalName As String * 25 '信号名称
SignalUnit As String * 10 '信号单位
CalibrateRatio As Single '校正系数
ScaleOfSignal As Single '信号纵坐标
BaseData As Single '校正电压
End TypeType PARATOSAVE
FirstChannel As Byte '首通道号
LastChannel As Byte '末通道号
Frequence As Long '采样频率
Gains As Byte '硬件增益
End TypeType Strip_Parameter
LengthOfStrip As Integer '板坯长度
WidthOfStrip As Integer '板坯宽度
HeightOfStrip As Integer '板坯厚度
Material As String * 15 '材质
Batch As String * 20 '批号
No As String * 8 '序号
End TypeType tpAldFile_InfoHead
savePara As PARATOSAVE '采集参数
chaPara(0 To 31) As CHANNEL_PARAMETER '通道参数
Strip1 As Strip_Parameter '轧件参数
DatasOfDrawing As Integer '数据点数(用于ald文件)
ValidChannels As Byte '实际使用通道数
CurrentPassNo As Long '本数据对应的轧制道次
DateOfSaveFile As String * 10 '文件保存时的日期
TimeOfSaveFile As String * 8 '文件保存时的时间
End TypeType tpAldFile
afInfoHead As tpAldFile_InfoHead
afBuffers() As Single
End TypeFunction AldFileGetByFile(ByVal pFileName As String) As tpAldFile
Dim tOutFile As tpAldFile
Dim tFileNumber As Integer
tFileNumber = FreeFile
Open pFileName For Binary As #tFileNumber
With tOutFile
Get #tFileNumber, 1, .afInfoHead
Dim tBufferStart As Long
tBufferStart = Len(.afInfoHead)
ReDim .afBuffers(.afInfoHead.ValidChannels - 1, .afInfoHead.DatasOfDrawing - 1)
Get #tFileNumber, tBufferStart, .afBuffers()
End With
Close #tFileNumber
AldFileGetByFile = tOutFile
End Function
两位姐姐加我QQ或者MSN好吗,,,,,
QQ:24594937
msn:[email protected]