老师给了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

解决方案 »

  1.   

    老兄!回去告诉你的老师:下面的这种定义在VB6里面会有错误(是VB的Bug)。当你这样储存20个字符的时候,读出来会少一半的。比如:如果序号是“小仙妹是个好孩子”则返回“小仙妹是”;如果存储的是“ABCDEFGH”则返回“ABCD”。实际上用UltraEdit检查文件,你会发现后面的字节根本就没有写。如果简单一点解决,实际存储的字符要增加一倍才可以。Type Strip_Parameter
        ……
        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,你可以专门发个帖子询问。
      

  2.   

    老兄!回去告诉你的老师:下面的这种定义在VB6里面会有错误(是VB的Bug)。当你这样储存20个字符的时候,读出来会少一半的。比如:如果序号是“小仙妹是个好孩子”则返回“小仙妹是”;如果存储的是“ABCDEFGH”则返回“ABCD”。实际上用UltraEdit检查文件,你会发现后面的字节根本就没有写。如果简单一点解决,实际存储的字符要增加一倍才可以。Type Strip_Parameter
        ……
        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
      

  3.   

    这个是ALD文件的读取函数,存在于一个模块里。不妨叫做modAldFile.bas将ALD文件以tpAldFile类型表示。tpAldFile类型里的afInfoHead里是各种参数;afBuffers()就是那个MyBuffer()。不过下面的程序没经过实际测试,尤其是afBuffers()的尺寸是afInfoHead里的通道和点参数决定的,除非有真实的数据测试,否则无法确定是否有效。
    你存文件的时候也可以用类似的办法写一个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
      

  4.   

    看不太懂啊..5555,,,,,
    两位姐姐加我QQ或者MSN好吗,,,,,  
    QQ:24594937
    msn:[email protected]
      

  5.   

    错了,msn是:[email protected]看见仙女姐姐半夜2点多还没有睡觉.....^_^