2011-12-07 9 views
0

注間違ったファイルの長さを書き込みます - 私は、問題を単純化するために一から書き直さこの質問を持っている...は、最初のレコードのみ

次の関数は、バイナリファイルにレコードを書き出します:

このコードをステップ実行するとき

私は関数を呼び出すと、一つのレコードを書き出す場合は注意Len(EmpRec) = 6こと

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 

- それは唯一の4バイトの書き出し:

Call WriteTestRecord(1)「ファイルの長さが、私は関数を呼び出すと、複数のレコードを書き出す場合は4バイト

である - それは(RecCount*6) - 2バイトを書き出す:

Call WriteTestRecord(10)」ファイル長これは58バイト

です私のタイプでは長さの固定されていない文字列がありますが、最初のレコードの長さは他のレコードの長さとは違うのはなぜですか?

+0

ファイルを調べて、最初のレコードと他のレコードの違いを確認しましたか?とにかく、あなたのInidcatorフィールドにコンテンツを入れ始めると、コードは実際には破損します。なぜなら、レコードは本当に異なる長さになるからです。 – tcarvin

+0

ランダムなファイルは、VB6ではいつものようなものです。 Jetデータベースは、使用するのが安価であり、削除の索引付けと管理から並行処理の処理まで、多くの機能と柔軟性を提供します。もちろん、リレーショナル機能も便利です。 ADOとJet 4.0はWin2KからWindowsにネイティブですので、MDACとJetを使用してそれらを使用する必要はありません。 – Bob77

+0

@BobRiemersma - VB6は従来の期間ですが、これは、古いバージョンのアプリケーションが終了したときにこのデータが書き出される現実の世界なので、読み込む方法が必要です。 –

答えて

2

最初のレコードが間違っていないのは、最後のレコードが間違っているということではありません。

各書き込みの直前に「利用可能」を設定してファイルを参照すると、これが表示されます。

あなたのUDTはわずか4バイトなので、最初の書き込みではファイルに4バイトあります。しかし、2番目のレコードを書くとき、VBは最初に、Openで提供した6バイトの長さにヌルを持つファイルのRec#1を埋め込みます。次に、4バイトのレコード(rec#2)を書き込みます。このプロセスはすべての書き込みで繰り返されます。これは常に最後の短いレコードです。

興味深いことに、Closeは、4バイトから6バイトまでの最後のレコードもパディングしません。

+0

ああ私はいろいろな値を設定して遊んでいました - もし 'Indicator'を' AB'に設定すると、最後のレコードは 'A'に切り捨てられます。 2つ以上の文字をインジケータに入れてみると、レコードの長さが正しくない –

0

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

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

+0

ありがとう、私は、バイトがスキップされる可能性がありますが、私は、最初のレコードをスキップし、2番目のレコードの2バイトを挿入しないで、各レコードが一貫していると期待します。 –

関連する問題