怎样用VB读取用C语言生成的二进制文件(*.dat)?
       fwrite(&ddp.da_year,sizeof(int),1,fp); //年 2个字节
       fwrite(&ddp.da_mon,sizeof(int),1,fp);  //月 2个字节
       fwrite(&ddp.da_day,sizeof(int),1,fp);  //日 2个字节
       fwrite(&zzdate[6],4,1,fp); //龄期 4个字节
       fwrite(&zzdate[0],4,1,fp); //块数 4个字节
       fwrite(maxfloat,sizeof(maxfloat),1,fp);//6个浮点数 6x4个字节
       fwrite(&zzdate[3],4,1,fp);//4个字节
       fwrite(name,8,1,fp);//编号 8个字节
       fwrite(&tt.ti_hour,sizeof(int),1,fp);//时 2个字节
       fwrite(&tt.ti_min,sizeof(int),1,fp);//分 2个字节  共计54字节
这是某一dat文件,是用C写入的,现在要将其还原成文本文件,每54个字节还原成为一行,该dat文件:http://www.99fst.com/stone/dat.rar
小弟在这里先谢过了 !解答高分相赠……

解决方案 »

  1.   

    type rec
      da_year as integer
      da_mon as integer
      da_day as integer
      zzdate6 as long
      zzdate0 as long
      float1 as single
      float2 as single
      float3 as single
      float4 as single
      float5 as single
      float6 as single
      zzdate3 as long
      name as string *8
      ti_hour as integer
      ti_min as integer
    end typedim r as recopen dat.dat for binary as #1
    do until eof(1)
      open #1,,r
    loop
    close #1
    然后连成一行重新写到文本文件即可
      

  2.   

    type rec
    da_year as integer
    da_mon as integer
    da_day as integer
    zzdate6 as long
    zzdate0 as long
    float1 as single
    float2 as single
    float3 as single
    float4 as single
    float5 as single
    float6 as single
    zzdate3 as long
    name as string *8
    ti_hour as integer
    ti_min as integer
    end typedim r as recopen "dat" for binary as #1
    get #1,,r
    close #1
    然后联成一行即可
      

  3.   

    谢谢你的解答,可是REC的LenB为64呀?导出来不对应,而且在这个DAT里有N组这样的数据,这样恐怕不行吧?
      

  4.   

    我试过用OPEN  GET获得文件,这样得出来的数据不对,同样是?/之类的东西,如果用API中的CreatFile和ReadFile获取文件的话,如何实现?
      

  5.   

    '我记得给你发过短信(当时不能回复,怎么不好好看呢?)
    '将vc生成的文件 d:\ms\server\dat\0212.dat 还原成 "d:\mytext.txt"
    '注意用lenb函数获得的rec类型变量的返回值为56(你可能会奇怪为什么不是54,想弄明白的话可以给我发短信),但这并不妨碍我们
    Private Type rec
        da_year As Integer
        da_mon As Integer
        da_day As Integer
        zzdate6 As Long
        zzdate0 As Long
        float1 As Single
        float2 As Single
        float3 As Single
        float4 As Single
        float5 As Single
        float6 As Single
        zzdate3 As Long
        mmname(7) As Byte
        ti_hour As Integer
        ti_min As Integer
    End Type
    Private Sub Command1_Click()
        List1.Clear
        Dim mfilename As String
        mfilename = "d:\ms\server\dat\0212.dat"
        Dim mlen As Long
        mlen = FileLen(mfilename)
        Dim recarray() As rec
        mlen = mlen / 54 - 1
        ReDim recarray(mlen)
        Open mfilename For Binary As #1
        Get #1, , recarray
        Close #1
        Dim i As Long, s As String
        s = ""
        '下面的写的烦琐了,也可以For i = 0 To mlen ,然后去掉s最后面的回车换行
        For i = 0 To mlen - 1
            s = s + CStr(recarray(i).da_year)
            s = s + CStr(recarray(i).da_mon)
            s = s + CStr(recarray(i).da_day)
            s = s + CStr(recarray(i).zzdate6)
            s = s + CStr(recarray(i).zzdate0)
            s = s + CStr(recarray(i).float1)
            s = s + CStr(recarray(i).float2)
            s = s + CStr(recarray(i).float3)
            s = s + CStr(recarray(i).float4)
            s = s + CStr(recarray(i).float5)
            s = s + CStr(recarray(i).float6)
            s = s + CStr(recarray(i).zzdate3)
            s = s + StrConv(recarray(i).mmname, vbUnicode)
            s = s + CStr(recarray(i).ti_hour)
            s = s + CStr(recarray(i).ti_min) + vbCrLf
        Next
        
        s = s + CStr(recarray(mlen).da_year)
        s = s + CStr(recarray(mlen).da_mon)
        s = s + CStr(recarray(mlen).da_day)
        s = s + CStr(recarray(mlen).zzdate6)
        s = s + CStr(recarray(mlen).zzdate0)
        s = s + CStr(recarray(mlen).float1)
        s = s + CStr(recarray(mlen).float2)
        s = s + CStr(recarray(mlen).float3)
        s = s + CStr(recarray(mlen).float4)
        s = s + CStr(recarray(mlen).float5)
        s = s + CStr(recarray(mlen).float6)
        s = s + CStr(recarray(mlen).zzdate3)
        s = s + StrConv(recarray(mlen).mmname, vbUnicode)
        s = s + CStr(recarray(mlen).ti_hour)
        s = s + CStr(recarray(mlen).ti_min)
        '写入文件
        Dim txtfile As String
        txtfile = "d:\mytext.txt"
        Open txtfile For Binary As #1
        Put #1, , s
        Close #1
            
    End Sub
      

  6.   

    你的数据文件怎么全是数字,和vc字面意思的描述不太一致呀:)数值型的变量在转换成字串时,最好用format格式话成定长字串(方便你以后处理)
      

  7.   

    给你一个例子:Private Type tTest
         intV1 As Integer
         intV2 As Integer
    End TypeConst strFile = "C:\Test.dat"Private Sub SaveDate(ByVal intV1 As Integer, ByVal intV2 As Integer)
        Dim lFN As Long
        Dim lFL As Long
        Dim tT As tTest
        
        lFN = FreeFile
        If Dir(strFile)<>"" Then
           lFL = FileLen(strFile) + 1
        Else
           lFL=1
        End If
        tT.intV1 = intV1
        tT.intV2 = intV2
        Open strFile For Binary As #lFN
            Seek #lFN, lFL
            Put #lFN, , tT
        Close #lFN
    End SubPrivate Sub GetDate()
        Dim lFN As Long
        Dim lFL As Long
        Dim tT As tTest
        Dim lN As Integer
        
        lFN = FreeFile
        lN = 1
        Me.List1.Clear
        Open strFile For Random As #lFN Len = Len(tT)
            Do Until EOF(lFN)
                Get #lFN, lN, tT
                Me.Print "V1=" & tT.intV1 & "  V2=" & tT.intV2
                lN = lN + 1
            Loop
        Close #lFN
    End Sub
      

  8.   

    to Rick110AAA(海牛猪猪) :
    用http://www.99fst.com/stone/dat.rar测试过吗,回答问题要负责一点:)
      

  9.   

    to Rick110AAA(海牛猪猪): 
    //什么意思?
    难道说举例子还要和问题的自定义数据类型一样?他不会去举一反三吗?
    手把手 未必是好事!这是楼主的话:
    //谢谢你的解答,可是REC的LenB为64呀?导出来不对应,而且在这个DAT里有N组这样的数据,这样恐怕不行吧?很明显,楼主是不明白如何获得多组数据,你的程序没有这方面的语句吧:)如果言语间得罪了你,还请见谅
      

  10.   

    谢谢你们的解答,特别是rainstormmaster,谢谢您的细心解答,这两天出去了没有条件上网,今天才过来看看帖子,也看了短信,我先试试,“注意用lenb函数获得的rec类型变量的返回值为56”确实是我不明白的地方,我当时只是做到了这一步就没有继续向下了。希望以后多向您请教。