我在MODULE中自定义了以下数据类型(长度不确定): Public Type wordType
En As String
Cn As String
End Type
Public Type lesson
title As String
word() As wordType
End Type 在窗体模块中代码如下: Dim lsn As lesson lsn.title = "Lesson 1"
ReDim lsn.word(0)
lsn.word(0).En = "good"
lsn.word(0).Cn = "adj.好的"
ReDim Preserve lsn.word(1)
lsn.word(1).En = "bad"
lsn.word(1).Cn = "adj.坏的"
Dim ln As Long
ln = Len(lsn.title)
For i = 0 To UBound(lsn.word())
ln = ln + Len(lsn.word(i).En) + Len(lsn.word(i).Cn)
Next i
Open "c:\test.txt" For Random As #1 Len = ln Put #1, 1, lsn '写入到第一个记录
Close #1
运行代码出现“记录长度错误”的信息。请问:
1、如何准确地计算这个记录长度?
2、假如我的每个记录的长度都不同(lsn.word()的下标是不确定的),那么以后读取记录会产生错误吗?能准确地读取每个记录数据不?
En As String
Cn As String
End Type
Public Type lesson
title As String
word() As wordType
End Type 在窗体模块中代码如下: Dim lsn As lesson lsn.title = "Lesson 1"
ReDim lsn.word(0)
lsn.word(0).En = "good"
lsn.word(0).Cn = "adj.好的"
ReDim Preserve lsn.word(1)
lsn.word(1).En = "bad"
lsn.word(1).Cn = "adj.坏的"
Dim ln As Long
ln = Len(lsn.title)
For i = 0 To UBound(lsn.word())
ln = ln + Len(lsn.word(i).En) + Len(lsn.word(i).Cn)
Next i
Open "c:\test.txt" For Random As #1 Len = ln Put #1, 1, lsn '写入到第一个记录
Close #1
运行代码出现“记录长度错误”的信息。请问:
1、如何准确地计算这个记录长度?
2、假如我的每个记录的长度都不同(lsn.word()的下标是不确定的),那么以后读取记录会产生错误吗?能准确地读取每个记录数据不?
dim lTmp as longOpen "c:\test.txt" for binary as #1
lTmp = ubound(lsn.word)
put #1,1,lTmp '一定要用一个变量,确保确定的字节.LONG是4字节.
put #1, ,lsn
close #1'读取时
dim lTmp as longOpen "c:\test.txt" for binary as #1
get #1, ,lTmp '先读出下标
redim lsn.word(ltmp) '重定义
put #1,1,lsn '读入即可.
close #1
只有一个记录可能就行!不只一个记录的时候,并且每个记录的长度都不同时,我看这样行不通。我要做的是,把每一课时的单词作为一个记录,这个记录包含该课的标题(title属性),该课的单词(word()数组存放该课的
所有单词,每个单词又包含英文(en属性)和中文意思(cn属性))。 因为每课的单词数目可能不一样,所以没办法确定自定义数据
类型的长度。不知道用随机文件存取的方式是否行得通? 楼上建议用二进制方式可能更行不通,因为我希望读取时是一个记录一个记录(一个
课时的所有数据)读出来,用二进制的话就需要知道每个记录的长度。
我没看懂lz的要求
是在文件里写多个相同记录类型不同长度吗?但从从代码里看好象是每次都覆盖前一贯记录.
请lz更清楚的说明一下
如果是单一记录类型文件 并且是按记录来读写文件,去掉len=一样可以随机读写
感谢大家的关注!!我要做的是,把每一课时的单词作为一个记录(lesson),这个记录包含该课的标题(lesson.title属性),该课的单词(lesson.word()数组存放该课的
所有单词,每个单词又包含英文(lesson.word(下标).en属性)和中文意思(lesson.word(下标).cn属性))。一个课时的所有单词存放在lesson.word()里,完成存放后就把该课的数据作为一个记录(lesson)写入文件,再用lesson存放其他课时的数据,再写入文件:
dim record_idx as integer
record_idx=1
put #1,record_idx,lsn ' lsn是lesson数据类型
record_idx=record_idx+1 不知这样清楚没有?
我遇到的问题是,由于每课的单词数目不一样,所以没办法确定每个记录的长度。random是按记录来读文件的,所以我才说二进制的更难操作。
由于写入文件的每个记录的长度不一样,所以写入文件时长度的计算有些问题:
Dim lsn As lesson lsn.title = "Lesson 1"
ReDim lsn.word(0)
lsn.word(0).En = "good"
lsn.word(0).Cn = "adj.好的"
ReDim Preserve lsn.word(1)
lsn.word(1).En = "bad"
lsn.word(1).Cn = "adj.坏的" Dim record_len As Long
record_len = Len(lsn.title) '计算标题的长度
For i = 0 To UBound(lsn.word()) 循环把该课每个单词的长度相加以得到整个记录的长度
record_len =record_len + Len(lsn.word(i).En) + Len(lsn.word(i).Cn)
Next i
Open "c:\test.txt" For Random As #1 Len = record_len dim record_idx as integer
Put #1, record_idx , lsn '写入一个记录
record_idx =record_idx +1
...
...
Put #1, record_idx , lsn 运行代码出现“记录长度错误”的信息。请问:
1、如何准确地计算这个记录长度?
2、假如我的每个记录的长度都不同(lsn.word()的下标是不确定的),那么以后读取记录会产生错误吗?能准确地读取每个记录数据不?
问题就在于lesson没有确定长度,写入记录时每个记录的长度也不一样。 请各位指教解决办法!
dim lTmp as longOpen "c:\test.txt" for binary as #1
get #1, ,lTmp '先读出下标
redim lsn.word(ltmp) '重定义
put #1,1,lsn '读入即可.
close #1
这样你的数据都已经在lsn这个变量里了,直接访问这个变量即可就好象你之前写入了数据到LSN一样.读写文件实现只是把这个变量进行内存<-->硬盘的一个往返而已,你不需要做其它事.操作变量即可.
dim lTmp as longOpen "c:\test.txt" for binary as #1
get #1, ,lTmp '先读出下标
redim lsn.word(ltmp) '重定义
put #1,1,lsn '读入即可.
close #1
加粗那段代码什么意思? 为什么把记录写入#1,1字节处?
dim lTmp as longOpen "c:\test.txt" for binary as #1
get #1, 1,lTmp '先读出下标,从文件第一字节开始
redim lsn.word(ltmp) '重定义
get #1, ,lsn '读入即可.从当前指针开始读
close #1
应该是GET的......汗......