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

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

C# と VB.NET の入門サイト

Re[1]: 構造体にファイルからデータをセット


(過去ログ 23 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■10060 / inTopicNo.1)  構造体にファイルからデータをセット
  
□投稿者/ トップオブツヨシ (7回)-(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データ

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



引用返信 編集キー/
■10062 / inTopicNo.2)  Re[1]: 構造体にファイルからデータをセット
□投稿者/ 魔界の仮面弁士 (518回)-(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
のように変更するという回避策もあります。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -