假设某个文件的文件头描述如下:
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传入的是一个地址,不是内容。以前遇到这种情况,我只好用字节数组代替结构,程序的可读性太差,用结构体的话,怎么处理这个问题?
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传入的是一个地址,不是内容。以前遇到这种情况,我只好用字节数组代替结构,程序的可读性太差,用结构体的话,怎么处理这个问题?
读取到结构体是可以,但不能直接来,还是要通过一个字节数组进行中转
或者你在数据头定义个数据结构大小,然后读取的时候先读这个值
我打错了,是writefile不是readfile。我要把上面说的结构体写入到文件中,当name是可变长度的字符串时(字符串不定,只有具体写文件时才知道,以vbnullchar结束),实际上也就是结构体的大小未知。我们知道不可能把name声明成string或动态数组,那样name的长度始终是4。当name的值确定后,当然可以获得结构体的大小=4+2+len(name)(假定name中没有汉字),问题是这个name应该如何声明?不能声明成string或动态字节数组,又不能声明为固定大小的字节数组,该如何通过结构而不是字节数组把要写的文件头数据传到writefile中去呢?说得有些乱,不知道楼上明白我的意思没有。
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类型会被完全写入到文件中,因此在写入信息中便已经包括了字符串的长度信息