【问】如何读写特定类型的文件?

VBAHZ 2006-01-03 08:33:18
'以下为文件格式,主要分三部分:文件头、数据类型说明,数据
'===========================================================
'数组大小(Int 2字节)
'记录总数(Int 2字节)

'记录1的数据类型 '(Int 2字节)
'记录2的数据类型 '其值与VarType函数返回的相同,比如:3 就说明记录2的类型是 vbLong 长整型
'。。。。

'记录1的数据 '长度=类型乘以数组大小
'记录2的数据 '比如:若记录2的数据类型为 3(长整型),其长度就为 4字节 X 数组大小
'。。。。
'============================================================

'如何将每条记录读入一个其对应类型的数组中?(一定要单独的连续数组)
'由于事先不可能知道有多少条记录,也不知道哪个记录是哪种类型,

'所以无法事先定义所属类型的数组!!!
'
'如果定义成Variant类型,比如:Dim A As Variant
'即使用 ReDim A(1 To 2) As Long
'还是和 Dim A(1 To 2) As Long 是有区别的,是无法正确写入数据的
'
'如果都载入Byte()数组,再转为相应的类型数组,那效率是极低的
'
'请问,还有其它什么办法吗?
...全文
164 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
of123 2006-05-08
  • 打赏
  • 举报
回复
我的建议,不采用格式转换。既然你最终还是要转入相应类型的数组,何不事先声明多种数组,选择使用。你转换时还是要选择。

Dim bytData() As Byte
Dim intData() As Integer
Dim lngData() As Long
Dim sngData() As Single
Dim dblData() As Double 'Same as double
Dim crrData() As Currency
Dim blnData() As Boolean

......
Select Case dataType
Case 0
...
Case 1
...
Case 2
...
Case 3
Redim lngData(recNumber - 1)
Get #FileNumber,recNumber, lngData
...
......
northwolves 2006-05-08
  • 打赏
  • 举报
回复
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Dim B() As Byte
Private Sub Command1_Click()
TRANS B, X, vbLong
End Sub
Sub TRANS(ByRef B() As Byte, ByRef X(), ByVal TYPES As Integer)
Dim UP As Long
TYPES = Array(0, 0, 2, 4, 4, 8, 8, 8, 0, 0, 0, 2)(TYPES)
If TYPES > 0 Then
ReDim X((UBound(B) + 1) / TYPES - 1)
CopyMemory ByVal VarPtr(X(0)), B(0), UBound(B) + 1
End Sub

Private Sub Form_Load()
Open "C:\XXX.TXT" For Binary As #1
ReDim B(LOF(1) - 1)
Get #1, , B
Close #1
End Sub
northwolves 2006-05-08
  • 打赏
  • 举报
回复
VarType 常数


可在代码中的任何地方用下列常数代替实际值:

常数 值 描述
vbEmpty 0 未初始化(缺省值)
vbNull 1 不含任何有效数据
vbInteger 2 Integer
vbLong 3 长整数
vbSingle 4 单精度浮点数
vbDouble 5 双精度浮点数
vbCurrency 6 Currency
vbDate 7 Date
vbString 8 String
vbObject 9 对象
vbError 10 错误
vbBoolean 11 Boolean
vbVariant 12 Variant(只用于变体的数组类型)
vbDataObject 13 数据访问对象
vbDecimal 14 Decimal
vbByte 17 Byte
vbUserDefinedType 36 包含用户定义类型的变量
vbArray 8192 数组
northwolves 2006-05-08
  • 打赏
  • 举报
回复
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Dim B() As Byte
Private Sub Command1_Click()
TRANS B, X, vbLong
End Sub
Sub TRANS(ByRef B() As Byte, ByRef X(), ByVal TYPES As Integer)
Dim UP As Long
TYPES = Array(0, 0, 2, 4, 4, 0, 8, 8, 8, 0, 0, 2)(TYPES)
If TYPES > 0 Then
ReDim X((UBound(B) + 1) / TYPES - 1)
CopyMemory ByVal VarPtr(X(0)), B(0), UBound(B) + 1
End Sub

Private Sub Form_Load()
Open "C:\XXX.TXT" For Binary As #1
ReDim B(LOF(1) - 1)
Get #1, , B
Close #1
End Sub
VBAHZ 2006-05-08
  • 打赏
  • 举报
回复
GZ
VBAHZ 2006-01-06
  • 打赏
  • 举报
回复
那老大能否说说:

如何将连续的Byte()数组转为vbInteger数组

如何将连续的Byte()数组转为vbLong

如何将连续的Byte()数组转vbSingle

如何将连续的Byte()转vbDouble

如何将连续Byte()转vbCurrency

如何将Byte()转vbDate

如何Byte()转vbBoolean

Byte()转vbByte。。。???

都转晕了,Byte就是原型,不用再转,呵呵

但是,上面一些类型确实不知道如何转,
文件中保存时,都已经变了样,VB自带的帮助文件(VB5)也没提到,诶。。。

不知道这时CopyMemory还有没有用?


rainstormmaster 2006-01-05
  • 打赏
  • 举报
回复
//转换效率比用原型读入的高吗?

肯定没有原型读入的高,毕竟多了个类型转换,不过效率不会很低就是了

VBAHZ 2006-01-05
  • 打赏
  • 举报
回复
读出的Byte()数组如何再转为其相应的数据类型,如:Long、Date、Single。。。?

转换效率比用原型读入的高吗?

注:文件中原来保存的数据是以数据原型写入的。在文件头之后的数据类型区,已经指明了数据类型(以VarType的返回值为准)

比如:

Dim I As Long
Put #FileNumber,,I
rainstormmaster 2006-01-04
  • 打赏
  • 举报
回复
如果数据长度相等的话,那就用Byte()数组,充分利用copymemory的话,效率不会很低

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧