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

解決


ヴェス  2009-08-20 20:19:57  No: 146248

構造体の中に配列を含むデータを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 20:46:37  No: 146249

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


魔界の仮面弁士  2009-08-20 23:00:04  No: 146250

> 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 23:00:45  No: 146251

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


ヴェス  2009-08-20 23:22:09  No: 146252

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

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

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加