C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.10060 の関連記事表示

<< 0 >>
■10060  構造体にファイルからデータをセット
□投稿者/ トップオブツヨシ -(2007/11/10(Sat) 16:16:58)

    分類:[VB.NET/VB2005] 

    構造体に参照ファイルからデータをセットする方法を検討しております。
    どなたか良い案があれば、ご教授下さい。


    私が作成した処理↓

    '定義した構造体-----
    Private Structure TEST_TYPE
    Dim AAA As Byte
    Dim BBB As Byte
        dim CCC() as Byte
    Public Sub Initialize()
    ReDim CCC(2)
    End Sub
    End Structure

    'ファイルゲット関数-----
      Public Function sbGETFile(ByVal strFile As String) 'strFileは参照するファイル名がセット

    Dim typData As TEST_TYPE
    Dim TempData As System.ValueType = typData

    '読み込み用ファイルオープン
    GetFileNum = FreeFile()
    FileSystem.FileOpen(GetFileNum, strFile, OpenMode.Binary, OpenAccess.Read, OpenShare.LockWrite)

    FileSystem.FileGet(GetFileNum, TempData, 1) 'ファイルゲット
       typData = DirectCast(TempData, TEST_TYPE) '一時的に格納したデータを復元

      End Function

    上記、処理において"FileSystem.FileGet"したタイミングで
    『ストリームの終わりを超えて読み取ることはできません。』とエラーになります。
    やはり、処理が間違っているのでしょうか?

    ★★strFile(参照するファイル)についてですが、構造体で定義された順番にデータがセットされています。★★

    ファイルの中身********
     1byte目 AAAデータ
     2byte目 BBBデータ
     3byte目 CCCデータ
     4byte目 CCCデータ
     5byte目 CCCデータ

       ・
       ・
     **********************


親記事 /過去ログ23より / 関連記事表示
削除チェック/

■10062  Re[1]: 構造体にファイルからデータをセット
□投稿者/ 魔界の仮面弁士 -(2007/11/10(Sat) 17:28:56)
    2007/11/10(Sat) 18:02:17 編集(投稿者)

    No10060 (トップオブツヨシ さん) に返信
    > Public Function sbGETFile(ByVal strFile As String) 'strFileは参照するファイル名がセット
    戻り値を利用しないのであれば、Function ではなく、Sub を使うべきかと。


    > ファイルの中身********
    >  1byte目 AAAデータ
    >  2byte目 BBBデータ
    >  3byte目 CCCデータ
    >  4byte目 CCCデータ
    >  5byte目 CCCデータ
    これでは駄目ですよ。ファイル内に『配列サイズ』などが定義されていませんので。

    たとえば、今回の TEST_TYPE 構造体に対して
      .AAA = &H12
      .BBB = &H34
      .CCC(0) = &H56
      .CCC(1) = &H78
      .CCC(2) = &H9A
    というデータを求める場合、ファイルの内容は 15バイトの
     12 34 01 00 03 00 00 00 00 00 00 00 56 78 9A
    でなければなりません。これは、下記の意味を持ちます。


     位置 内容 意味
     ------ -------- -----------------------------------------------------------------
     00 12 Byte値18。AAAを意味する。
     01 34 Byte値52。BBBを意味する。
     02-03 01 00 Short値1。CCC配列の次元数を意味する。
     04-07 03 00 00 00 Integer値3。CCC配列の1次元目の長さを意味する。
     08-0B 00 00 00 00 Integer値0。CCC配列の1次元目の下限値を意味する。VB.NETでは0固定。
     0C 56 Byte値170。CCC(0)を意味する。
     0D 78 Byte値187。CCC(1)を意味する。
     0E 9A Byte値204。CCC(2)を意味する。


    > 『ストリームの終わりを超えて読み取ることはできません。』
    今回の場合、3バイト目以降(位置02〜)のデータが不正だったので、その(誤って指定された)配列サイズが、
    実際のファイルサイズを超えてしまう結果となり、ファイル終端を越えた読み取りが発生したのでしょう。


    あるいはデータを修正するのではなく、ソース側を修正することができるのであれば、
    > ファイルの中身********
    >  1byte目 AAAデータ
    >  2byte目 BBBデータ
    >  3byte目 CCCデータ
    >  4byte目 CCCデータ
    >  5byte目 CCCデータ
    を読み込むために、TEST_TYPE 構造体の定義を
     Public AAA As Byte
     Public BBB As Byte
     <VBFixedArray(2)> Public CCC() As Byte
    のように変更するという回避策もあります。
記事No.10060 のレス /過去ログ23より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -