我在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()的下标是不确定的),那么以后读取记录会产生错误吗?能准确地读取每个记录数据不?

解决方案 »

  1.   

    你直接使用二进制进行读写即可'写入时
    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
      

  2.   


    只有一个记录可能就行!不只一个记录的时候,并且每个记录的长度都不同时,我看这样行不通。我要做的是,把每一课时的单词作为一个记录,这个记录包含该课的标题(title属性),该课的单词(word()数组存放该课的
    所有单词,每个单词又包含英文(en属性)和中文意思(cn属性))。 因为每课的单词数目可能不一样,所以没办法确定自定义数据
    类型的长度。不知道用随机文件存取的方式是否行得通? 楼上建议用二进制方式可能更行不通,因为我希望读取时是一个记录一个记录(一个
    课时的所有数据)读出来,用二进制的话就需要知道每个记录的长度。
      

  3.   

    lz的问题不是无法解决
    我没看懂lz的要求
    是在文件里写多个相同记录类型不同长度吗?但从从代码里看好象是每次都覆盖前一贯记录.
    请lz更清楚的说明一下
      

  4.   

    random是按"记录"而不是按"长度"来读文件的
    如果是单一记录类型文件 并且是按记录来读写文件,去掉len=一样可以随机读写
      

  5.   


    感谢大家的关注!!我要做的是,把每一课时的单词作为一个记录(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 不知这样清楚没有?
      

  6.   

    直接用Open FileName For Random As #1即可
      

  7.   


    我遇到的问题是,由于每课的单词数目不一样,所以没办法确定每个记录的长度。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()的下标是不确定的),那么以后读取记录会产生错误吗?能准确地读取每个记录数据不? 
      

  8.   

    因为读取记录的时候也需要定义一个lesson类型的变量,然后计算机就按这个类型的长度把文件划分为一个个记录读取,
    问题就在于lesson没有确定长度,写入记录时每个记录的长度也不一样。 请各位指教解决办法!
      

  9.   

    '读取时
    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一样.读写文件实现只是把这个变量进行内存<-->硬盘的一个往返而已,你不需要做其它事.操作变量即可.
      

  10.   

    老马,再请教您一个问题:'读取时
    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字节处?
      

  11.   

    哦哈哈~~~~~~~~~~~~~~因为~~~~~~~~~~写错了~~~'读取时
    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的......汗......