File 写入随机文件只为第一条记录写入不正确的文件长度

File 写入随机文件只为第一条记录写入不正确的文件长度,file,data-structures,file-io,vb6,user-defined-types,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

注意-我从头开始重新编写了这个问题,以简化问题

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

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个字节:

调用WriteTestRecord(1)
'文件长度为4字节

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

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


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

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


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

不是第一条记录错误,而是最后一条记录错误

如果在每次写入和查看文件之前将“可用”设置为True,则可以看到这一点

您的UDT只有4个字节,因此在第一次写入时,文件中有4个字节。但是,当您写入第二条记录时,VB首先在文件中用空值填充Rec#1,使其达到您在打开时提供的6字节长度。然后它写入4字节的记录(rec#2)。每次写入时都会重复此过程。总是最后一张短唱片


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

谢谢,我知道字节可能会被跳过,但我希望每条记录都是一致的,而不是跳过第一条记录,然后为第二条记录插入两个字节。您是否查看了该文件以了解第一条记录与其他记录之间的区别?无论如何,一旦开始将内容放入Inidcator字段,代码就会真正中断,因为这样记录的长度就不同了。在VB6中,随机文件是一种遗留的东西。Jet数据库使用成本低廉,提供了强大的功能和灵活性,从索引和管理删除到轻松处理并发性。当然,关系功能也很方便。ADO和Jet 4.0自Win2K以来就在Windows中原生,因此您甚至不需要部署MDAC和Jet来使用它们。@BobRiemersma-VB6是旧版本,但这是旧版本应用程序退出时写入数据的真实世界,因此我需要一些方法来读取数据-如果只是将其转换为其他格式的话!啊,是的,我只是在玩设置各种值的游戏-如果我将
指示器设置为
AB
,最后一条记录将被截断为
A
。如果我尝试在
指示器中输入超过2个字符,我会得到一个错误的记录长度