急~~~如何从文件中取值赋给动态数组?~~~~在线等待

ayusay 2002-03-30 06:18:31
我将一个动态数组一次写入到文件中:
Dim FileName '文件名
Dim MyDate() As String '动态数组

'给动态数组赋值
.............
.............
.............

'写入到文件中
Open FileName For Binary As #1
Put #1,,MyData
Close #1

现在我的问题是,如果再从该文件中将数组的值读出,并一次赋值到另一数组?不用循环。应该是可以解决的,因为写入时就没有用循环。

急用!在线等待!
...全文
78 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ayusay 2002-03-30
  • 打赏
  • 举报
回复
多谢!

其实我本来也是用你这种方法来做的,但突发奇想,想去操作描述符。看来我走错路了。 :)

给分!
KiteGirl 2002-03-30
  • 打赏
  • 举报
回复
描述符号对你是不透明的,就像字符串的描述符一样。除非你使用UltraEdit去看。你把数组保存或读取的时候不会有什么察觉,MSDN上说的仅仅是数组在文件里的表现形式(是对于数组的数据结构来说的),并不是告诉你读回来的时候会有什么描述符号。除非你不想用VB或者用其他办法来读这个数组,否则没必要去想它。MSDN之所以告诉这些是对于那些想计算数组字节长度的人来说的。
  总之我觉得数组保存到文件里,也应该精确把它读出来。怎么写的就怎么去读它,这比较可靠。printer(打印机)的方法有点不够精确,因为一次把文件无止境地读到结尾可不是好习惯。
ayusay 2002-03-30
  • 打赏
  • 举报
回复
这样,干脆直接用随机文件了,还用二进制文件做什么
printer 2002-03-30
  • 打赏
  • 举报
回复
Option Explicit
Option Base 1
Private Sub Command1_Click()
Dim myData() As String, i As Long
ReDim myData(9, 2)
For i = 1 To 9
myData(i, 1) = "1234567" & Trim(Str(i))
myData(i, 2) = "2345678" & Trim(Str(i))
Next i
Open "D:\tt.txt" For Binary As #2
Put #2, , myData
Close
End Sub
Private Sub Command2_Click()
Dim myData() As String, i As Long
Close 2
Open "D:\tt.txt" For Binary As #2
ReDim myData(1 To (LOF(2) - 2 - 2 * 8) / 16, 1 To 2)
Get #2, , myData
Debug.Print (LOF(2) - 18)
Debug.Print LOF(2)
For i = 1 To UBound(myData)
Debug.Print myData(i, 1)
Debug.Print myData(i, 2)

Next i
End Sub

说明如下
ReDim myData(1 To (LOF(2) - 2 - 2 * 8) / 16, 1 To 2)

其中除以16的意思是因为,数组的1是8个字符,2也是8个字符,所以一共是16,那么,当你要使用时间和数字的时候,一定要保重这个每个日期都是一样的位数,每个数字也是一样的位数,不足的话后置空格
最后要除的值就是日期字符串的位数加上含后置空格的数字串的位数
softrain 2002-03-30
  • 打赏
  • 举报
回复
kitegirl(小仙妹) 的方法不错,我举双手赞同。
ayusay 2002-03-30
  • 打赏
  • 举报
回复
谢谢!
但你的处理方式是把动态数组来当作大小固定的数组来处理的。

但MSDN里不是写着:
如果写入的变量是动态数组,则PUT写入一个描述符,其长度等于2加上8乘以维数。
如果读出的变量是一个动态数组,则GET会读出一个描述符,其长度等于2加上8乘以维数。

这样,描述符怎么处理?
KiteGirl 2002-03-30
  • 打赏
  • 举报
回复
另外补充一点:Put和Get的时候,必须保证写入时和读取时的变量格式、数组元素数量是一致的。只有这样才能准确的读取。Put和Get可以一次存取整个数组,但必须保证这个数组的元素数量、最小和最大下标的设定在存取的时候都要一致。另外我还提醒你:利用数组的这种文件操作可以来做文件合并和分离(比如我用这个方法来大量合并BMP图片)。
KiteGirl 2002-03-30
  • 打赏
  • 举报
回复
其实这个问题的关键在于动态数组的实际元素数量如何保存在文件里。由于是你自己定义的Binary文件,而且保存的是动态数组。所以你要自行想办法来记录数组的元素数量。实际上只要Get #1,,MyData就可以了,但是有条件的:读取时候的MyData必须和保存的时侯有相同的元素数量。下面我告诉你一个办法:

Binary方式的Put语句是可以对指定地址操作的,你使用一个long的变量保存MyData的元素数量。

Dim MyDataLength As Long

MyDataLength=UBound(MyData) '这里假设MyData是从0开始的。

Put #1,1,MyDataLength '在第1字节开始保存一个Long

Put #1,9,MyData '在第9字节保存数组。9是数组的数据区地址,由你设定的。一般在程序中是常量。

那么当你读的时候:

Get #1,1,MyDataLength

ReDim MyData(MyDataLength)

Get #1,9,MyData

这样就获得了原来那个数组。

当然我给你的办法仅仅是个简单的解决方式,更好的办法在于你自己设计一个文件头和完善的文件结构。
KiteGirl 2002-03-30
  • 打赏
  • 举报
回复
其实这个问题的关键在于动态数组的实际元素数量如何保存在文件里。由于是你自己定义的Binary文件,而且保存的是动态数组。所以你要自行想办法来记录数组的元素数量。实际上只要Get #1,,MyData就可以了,但是有条件的:读取时候的MyData必须和保存的时侯有相同的元素数量。下面我告诉你一个办法:

Binary方式的Put语句是可以对指定地址操作的,你使用一个long的变量保存MyData的元素数量。

Dim MyDataLength As Long

MyDataLength=UBound(MyData) '这里假设MyData是从0开始的。

Put #1,1,MyDataLength '在第1字节开始保存一个Long

Put #1,9,MyData '在第9字节保存数组。9是数组的数据区地址,由你设定的。一般在程序中是常量。

那么当你读的时候:

Get #1,1,MyDataLength

ReDim MyData(MyDataLength)

Get #1,9,MyData

这样就获得了原来那个数组。

当然我给你的办法仅仅是个简单的解决方式,更好的办法在于你自己设计一个文件头和完善的文件结构。
sippey 2002-03-30
  • 打赏
  • 举报
回复
我想 “put” 本身就有循环性质
所以可能不用循环不行

7,763

社区成员

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

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