配列を含む構造体の内容をFilePutで出力したい

解決


ヴェス  2009-08-20 11:19:57  No: 146248  IP: [192.*.*.*]

構造体の中に配列を含むデータをFilePutで出力しようとしていますが、FilePutでレコード長のエラーが出てしまいます。
構造体は以下のように定義しています。

----------------ここから----------------

    Public Structure TEST_TYPE

        <VBFixedString(8)> Public tHead As String
        <VBFixedString(10)> Public tData() As String
        <VBFixedString(132)> Public tFree As String

        '--------------------
        '---  初期化処理  ---
        '--------------------

        Public Sub Initializa()
            ReDim tData(49)
        End Sub

    End Structure

    Public GU_TEST As New TEST_TYPE

----------------ここまで----------------

これでレコード長は640。

この構造体にデータをセットし、以下の様に出力しようとしています。

----------------ここから----------------

    Public Sub TEST

        FileOpen(30, "C:\TEST.DTL", OpenMode.Random, OpenAccess.ReadWrite, OpenShare.LockWrite, 640)
        FilePut(30, GU_MdlClsCD, 1)

    End Sub
----------------ここまで----------------

構造体のデータは、全てセットしてあります。(イミディエイトで確認)
ですが、「FilePut」で「レコード長が正しくありません」が発生します。
イミディエイトで「Len(GU_TEST)」で確認すると、144が帰ってきます。

構造体の配列に問題があるようで調べてみたのですが、「VBFixedArray」を使うと良いのでしょうか。
とすると、String長の定義はどこでするのかわかりません。

おわかりの方、教えてください。
よろしくお願いします。

編集 削除
gtk2k  2009-08-20 11:46:37  No: 146249  IP: [192.*.*.*]

回答になってなくて悪いんだが、
XmlSerializer使うというのではだめ?

編集 削除
魔界の仮面弁士  2009-08-20 14:00:04  No: 146250  IP: [192.*.*.*]

> 144が帰ってきます。
配列のポインタが 4 バイトとすれば、
  8 +「4」+132 =144
になりますね。

> FilePut(30, GU_MdlClsCD, 1)
GU_TEST は?


> 「VBFixedArray」を使うと良いのでしょうか。
> とすると、String長の定義はどこでするのかわかりません。
両方指定してください。たとえば
  <VBFixedString(10)> <VBFixedArray(49)> Public tData() As String
あるいは
  <VBFixedString(10), VBFixedArray(49)> Public tData() As String
などといった形です。

編集 削除
ヴェス  2009-08-20 14:00:45  No: 146251  IP: [192.*.*.*]

>gtk2kさん
ご回答ありがとうございます。
ランダムアクセスファイルで処理したいので、XMLを使用する方法は考えていません。

編集 削除
ヴェス  2009-08-20 14:22:09  No: 146252  IP: [192.*.*.*]

>魔界の仮面弁士さん
・配列のポイント
すいません、勉強不足でよくわかりません。
調べてみます。

・GU_TEST
すいません、コードを簡略化したときの修正漏れでした。
正しくは、「FilePut(30, GU_TEST, 1)」です。

・両方指定する
この考えはありませんでした。
なるほど、両方指定できるのですね。
試したところ、うまく動作しました。

ずっとVB6で開発していたのですが、このたび.NETに変更することになり、今まで当たり前にやっていたことを調べるのに数日かかったりと四苦八苦しています。
本当にありがとうございました。

編集 削除