
バイナリーファイルから読み込んだデータを構造体にセットするにはどのようにすればよいですか?
ご教授よろしくお願いします。
ファイルサイズは構造体のサイズと同じく300byteです。
Public Structure ST1
<VBFixedString(10), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=10)> _
Public str1() As String
<VBFixedString(20), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=20)> _
Public str2() As String
<VBFixedString(30), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=30)> _
Public str3() As String
Public Sub Initialize()
ReDim str1(4)
ReDim str2(4)
ReDim str3(4)
End Sub
End Structure
処理
Private Sub btn1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn1.Click
dim ST as new ST1
ST.Initialize()
FileOpen(1, OpenFileDialog1.FileName, OpenMode.Binary, OpenAccess.Read, OpenShare.Default))
FileGet(1, ST)
FileClose(1)
End Sub
ここでわからないのが、イニシャライズを行い、配列数を設定しても、ファイルから読み込んでくるバイト数は配列でないときと同じサイズ(60byte)で読み込んできてしまいます。
STをイニシャライズしても、Marshal.SizeOf(ST)の値が変わらないのが原因だと思うのですが、宣言の仕方がおかしいのでしょうか?
ご教授お願いいたします。
No.1ベストアンサー
- 回答日時:
マーシャリングを
<VBFIxedArray(4), VBFixedString(10), MarshalAs(UnmanagedType.ByValArray, ArraySubType:=UnmanagedType.ByValTStr, SizeConst:=10)> _
Public str1() As String
といった具合に変更して
構造体の属性に
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)>
を追加してみてください
構造体のメンバーがVBFixedString属性がついていないと
文字列の長さ(2Byte)+文字列のデータ といった具合のデータ構造を要求します
これによりFileGetで読み込んだ際 Streamの終端を越えてしまうのではないでしょうか
回答ありがとうございます。
早速指摘していただいた変更を実装し実行してみました。
正しく処理を行うことができました。
行き詰っておりましたので本当に助かりました、ありがとうございます。
重ねて申し訳ないのですが、よろしければマーシャリングの宣言について、何か参考になる図書がありましたら、教えていただけないでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ファイル入力のデータを構造体に入れる方法
Visual Basic(VBA)
-
VB6.0の「vbFromUnicode」はVB.NETではどれに相当しますか?
Visual Basic(VBA)
-
VB6からの移行したいけど、VB.NETのコントロール配列は?
Visual Basic(VBA)
-
-
4
Shapeコントロールの.NET移行方法
Visual Basic(VBA)
-
5
VB6からVB2010への変換について
Visual Basic(VBA)
-
6
VBの「As String * 128」とは?
Visual Basic(VBA)
-
7
SPREAD(GrapeCity)のセルにフォーカスを設定するにはどうしたらいいのでしょうか?
Visual Basic(VBA)
-
8
VB.NETでフォームロード中のエラー時に終了する方法について
Visual Basic(VBA)
-
9
ファイルダイアログを開いた時のキャンセルボタンの処理
Visual Basic(VBA)
-
10
C# 固定長ファイルの取得 FileGet
C言語・C++・C#
-
11
VBのShapeコントロールを使用して,円を描く方法を教えてください
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
VB6のメモリ解放に関して
-
VB.NETの配列の限界を教えてく...
-
エクセルでXY座標に並べられた...
-
Excel2010のinputboxで複数デー...
-
配列の中の最大値とそのインデ...
-
Variant型配列の文字コード変換
-
C#でbyte配列から画像を表示さ...
-
配列のペースト出力結果の書式...
-
VBA: Select Caseを短くしたい
-
配列の要素がすべてカラかどう...
-
大量の変数を定義するにはどう...
-
.NET 文字コードの変換
-
OutOfMemoryExceptionの回避策...
-
RPG 配列宣言について
-
Excelマクロ:配列データからグ...
-
Imagelist の使い回しについて
-
VBAでMODE関数をつくる
-
クリスタルレポートで文字列の...
-
2つ目のレコードの値を取得す...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
C#でbyte配列から画像を表示さ...
-
エクセルでXY座標に並べられた...
-
vba フィルター 複数条件 3つ以...
-
配列のペースト出力結果の書式...
-
OutOfMemoryExceptionの回避策...
-
配列の中の最大値とそのインデ...
-
複数のtextboxの処理を一括で行...
-
Dir関数で読み取り順を操作でき...
-
VB6からの移行したいけど、VB.N...
-
COBOLの基本的な事なので...
-
構造体配列の特定のメンバーをF...
-
大量の変数を定義するにはどう...
-
EXCEL VBAの課題です
-
Redim とEraseの違いは?
-
VB.NETの配列にExcelから読み込...
-
VBAでMODE関数をつくる
-
VB.NETにて、構造体へデータを...
-
1ビットごとの配列を作りたい
-
VBAで配列引数を値渡しできない...
おすすめ情報