假设某个文件的文件头描述如下:
DataSize:数据大小 DWORD
Name:数据名称,字符串 STRING
Flags:某种标志 WORD
相应的结构声明为:
type FileHeader
  DataSize as long
  Name(1 to 10) as byte   '假设Name的长度固定为10
  Flags as integer
end type
用ReadFile可以把上述结构写到文件中。问题是如果Name的长度可变(以null结束),那么Name应该如何声明?声明成string或者name() as byte都不行,因为这时无法获得结构体真实的大小,而且此时name传入的是一个地址,不是内容。以前遇到这种情况,我只好用字节数组代替结构,程序的可读性太差,用结构体的话,怎么处理这个问题?

解决方案 »

  1.   

    你的DataSize是什么?是整个结构的大小么?
    读取到结构体是可以,但不能直接来,还是要通过一个字节数组进行中转
    或者你在数据头定义个数据结构大小,然后读取的时候先读这个值
      

  2.   

    datasize是什么无关紧要
    我打错了,是writefile不是readfile。我要把上面说的结构体写入到文件中,当name是可变长度的字符串时(字符串不定,只有具体写文件时才知道,以vbnullchar结束),实际上也就是结构体的大小未知。我们知道不可能把name声明成string或动态数组,那样name的长度始终是4。当name的值确定后,当然可以获得结构体的大小=4+2+len(name)(假定name中没有汉字),问题是这个name应该如何声明?不能声明成string或动态字节数组,又不能声明为固定大小的字节数组,该如何通过结构而不是字节数组把要写的文件头数据传到writefile中去呢?说得有些乱,不知道楼上明白我的意思没有。
      

  3.   

    '-----------------------
    Public Type FileHeader
      DataSize As Long
      sName As String
      Flags As Integer
    End Type
    ...
    '-----------------------
        '写入
        Dim udt As FileHeader
        Dim iStrLen As Integer
        With udt
            .DataSize = 123
            .sName = "supsergreenbean(超级绿豆)"
            .Flags = 14
        End With
        Open "c:\file.dat" For Binary As #1
        Put #1, , udt
        Close #1
        
        '读取
        Dim abTmp() As Byte
        Open "c:\file.dat" For Binary As #1
        With udt
            Get #1, , udt.DataSize
            
            '读取字符型
            Get #1, , iStrLen
            ReDim abTmp(iStrLen - 1)
            Get #1, , abTmp
            .sName = StrConv(abTmp, vbUnicode)
            
            Get #1, , udt.Flags
        End With
        Close #1
    '-----------------------
    因为用binary模式写入的时候String类型会被完全写入到文件中,因此在写入信息中便已经包括了字符串的长度信息