ランダムなファイルを作成するファーストレコードのみのファイルの長さが誤って書かれます

StackOverflow https://stackoverflow.com/questions/8418728

質問

注 - 問題を簡素化するために、この質問をゼロから書き直しました...

次の関数は、バイナリファイルにレコードを書き込みます。

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 このコードをステップするとき

関数を呼び出して1つのレコードを書き出すと、4バイトのみを書き込みます。

Call WriteTestRecord(1) 'ファイルの長さは4バイトです

関数を呼び出して複数のレコードを書き出すと、それは書き出します (RecCount*6) - 2 バイト:

Call WriteTestRecord(10) 'ファイルの長さは58バイトです

これは、私のタイプに固定されていない長さの文字列を持っているという事実が原因ですが、なぜ最初のレコードは他のすべてとは異なるのですか?

役に立ちましたか?

解決

THRの最初のレコードが間違っているわけではなく、最後のレコードが間違っているということです。

それぞれの書き込みの直前にTrueに設定してファイルを見ると、これを見ることができます。

UDTはわずか4バイトであるため、最初の書き込みではファイルに4バイトがあります。しかし、2番目のレコードを書くとき、VBは、オープンで提供された6バイトの長さまでヌルを備えたファイルの最初のパディングREC#1です。次に、4バイトレコード(REC#2)を書き込みます。このプロセスは、すべての書き込みで繰り返されます。それは常に短い最後のレコードです。

興味深いのは、最近6バイトの4バイトの最後のレコードをパッドしないことです。

他のヒント

VB6可変長文字列は、BSTR構造へのポインターです。言語仕様によると、それらはnullにすることができます。つまり、タイプ定義のポインター値はゼロになります。 VB6は、書き出すときにそれらのバイトをスキップするようなことをしているのを見ることができます。

編集された質問で言及しているように、正しい答えは、構造をランダムアクセスファイルに書き出す場合は、固定長の文字列を使用することです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top