写入随机文件为第一个仅记录写入不正确的文件长度

时间:2011-12-07 16:23:58

标签: file data-structures file-io vb6 user-defined-types

注意 - 我从头开始重写这个问题以简化问题......

以下函数将记录写入二进制文件:

Public Type TestRecord
    Available As Boolean
    Inidcator As String
End Type

Private Sub WriteTestRecord(ByVal RecCount As Integer)

    Dim Fn As Integer, CN As Integer
    Dim filename As String
    Dim EmpRec As TestRecord
    Dim clk() As TestRecord
    ReDim clk(1 To RecCount)

    Debug.Print Len(EmpRec)

    filename = "C:\TestRecFile.bin"

    If Len(Dir(filename)) > 0 Then Kill filename

    Fn = FreeFile
    Open filename For Random As #Fn Len = Len(EmpRec)
    For CN = 1 To RecCount
        EmpRec = clk(CN)
        Put #Fn, , EmpRec
    Next CN
    Close #Fn

End Sub

在单步执行此代码时请注意Len(EmpRec) = 6

如果我调用该函数并写出一条记录 - 它只写出4个字节:

Call WriteTestRecord(1)'文件长度为4个字节

如果我调用该函数并写出多条记录 - 它会写出(RecCount*6) - 2个字节:

Call WriteTestRecord(10)'文件长度为58字节

这是因为我的Type中有一个非固定长度的字符串,但为什么第一条记录的长度与其他记录的长度不同?

2 个答案:

答案 0 :(得分:2)

不是第一个记录错误,而是最后一个记录是错误的。

如果在每次写入之前将Available设置为True并查看文件,则可以看到此信息。

您的UDT只有4个字节,所以在第一次写入时,文件中有4个字节。但是当你写第二条记录时,VB首先将文件中的Rec#1填充为空值,并将其提供给Open中提供的6字节长度。然后它写入4字节记录(rec#2)。每次写入都会重复此过程。它总是最后的记录。

有趣的是,Close不会填充4字节最后6个字节的最后一条记录。

答案 1 :(得分:0)

VB6可变长度字符串是指向BSTR结构的指针。根据语言规范,它们可以为NULL。这意味着类型定义中的指针值将为零。我可以看到VB6在写出来时就像跳过这些字节一样。

正如您在编辑过的问题中提到的,正确答案是使用固定长度的字符串,如果您要将结构写入随机访问文件。