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

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

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

Re[2]: バイナリデータの読み込み


(過去ログ 21 を表示中)

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

■9049 / inTopicNo.1)  バイナリデータの読み込み
  
□投稿者/ えふ (1回)-(2007/10/17(Wed) 17:27:17)

分類:[VB.NET/VB2005] 

バイナリデータを読み込み、2次元配列の変数に格納する処理を実現させたいのですが、その実現方法が分かりません。
VB6.0では上記内容はGETステートメントで実現できていました。

<VB6.0での実現例>---------------------------------------------
Dim fp As Integer
Dim MyArray(4,9) As Integer 

fp = FreeFile
Open "C:\DATA\TEST.bin" For Binary Access Read Lock Write As fp
Get #fp, 1, MyArray
Close fp
----------------------------------------------------------------

VB.NETでは、GETステートメントに相当するのがFileGet関数となりましたが検討した内容を下記に示します。

<VB.NETでの検討例>---------------------------------------------
Dim MyArray(4, 9) As Integer
Dim FileNum As Integer = FileSystem.FreeFile

FileSystem.FileOpen(FileNum, "C:\DATA\TEST.bin", OpenMode.Binary, , , 118)
FileSystem.FileGet(FileNum, MyArray, 1, true)
FileSystem.FileClose()
----------------------------------------------------------------

上記内容で実行するが、データが配列MyArrayにセットされません。
また、下記警告も表示されています(コンパイルが通った為、これはとりえあず無視しましたが・・これがまずい?)。
『'ByRef' パラメータ 'Value' の値を、一致する引数に戻してコピーする際の、'System.Array' から 'Integer の 2 次元配列' への暗黙的な変換です。』


ご教授よろしくお願いします。
引用返信 編集キー/
■9050 / inTopicNo.2)  Re[1]: バイナリデータの読み込み
□投稿者/ mあ (108回)-(2007/10/17(Wed) 18:24:12)
2007/10/17(Wed) 18:24:43 編集(投稿者)
No9049 (えふ さん) に返信

へぇ〜、FileGet ってのがあるのですか。
なにやら、My.Computer.FileSystem ... を代わりに使うとパフォーマンス
が向上する、ってインテリセンスのツールチップテキストに書いてありま
せんか?

ByRef の代替手段はわかりません。m(__)m

下は手作り。手作りしなくても良さそうですね。

Module Module1


    Private sa() As Integer = {100, 200, 300, 400, 500, 600}

    Sub Main()

        WriteTest()
        System.Console.In.ReadLine()
        ReadTest()

        System.Console.In.ReadLine()

    End Sub

    Sub ReadTest()
        Dim ar(2 - 1, 3 - 1) As Integer
        Dim br As New System.IO.BinaryReader(New System.IO.FileStream("array.bin", IO.FileMode.Open))

        For i As Integer = 0 To 2 - 1
            For j As Integer = 0 To 3 - 1
                ar(i, j) = br.ReadInt32()
            Next
        Next

        For i As Integer = 0 To 2 - 1
            For j As Integer = 0 To 3 - 1
                Console.WriteLine(ar(i, j))
            Next
        Next
        br.Close()

    End Sub

    Sub WriteTest()
        Dim ar(2 - 1, 3 - 1) As Integer
        Dim bw As New System.IO.BinaryWriter(New System.IO.FileStream("array.bin", IO.FileMode.OpenOrCreate))

        For i As Integer = 0 To 2 - 1
            For j As Integer = 0 To 3 - 1
                ar(i, j) = sa(i * 3 + j)
            Next
        Next


        For i As Integer = 0 To 2 - 1
            For j As Integer = 0 To 3 - 1
                bw.Write(ar(i, j))
            Next
        Next
        bw.Close()

    End Sub
End Module

引用返信 編集キー/
■9053 / inTopicNo.3)  Re[1]: バイナリデータの読み込み
□投稿者/ 魔界の仮面弁士 (476回)-(2007/10/17(Wed) 19:58:18)
2007/10/17(Wed) 22:48:26 編集(投稿者)

No9049 (えふ さん) に返信
> <VB6.0での実現例>---------------------------------------------
> <VB.NETでの検討例>---------------------------------------------

そのまま移植するなら、こうかな。Option Strict Off モード用です。

Dim MyArray(4, 9) As Short
Dim FileNum As Integer = FileSystem.FreeFile
FileSystem.FileOpen(FileNum, "C:\DATA\TEST.bin", OpenMode.Binary, OpenAccess.Read, OpenShare.LockWrite)
FileSystem.FileGet(FileNum, MyArray, 1)
FileSystem.FileClose(FileNum)


Option Strict On の場合は、FileGet の部分を
 Dim data As Array = MyArray 'ByRef 渡しのため、Array 型変数を用意する
 FileSystem.FileGet(FileNum, data, 1)
 MyArray = DirectCast(data, Short(,)) 'Shortの 2 次元配列に復元
のように修正してやれば良いかと。
引用返信 編集キー/
■9080 / inTopicNo.4)  Re[2]: バイナリデータの読み込み
□投稿者/ えふ (2回)-(2007/10/18(Thu) 14:21:37)
No9053 (魔界の仮面弁士 さん) に返信
> 2007/10/17(Wed) 22:48:26 編集(投稿者)

教えて頂いた方法で、実現が出来ました。
ポイントは、
・Array型変数dataを用意(FileGet関数の第2引数がArray型の為)
・DirectCastによる型変換処理
と認識しています。まだ、分かった!と宣言できる程、把握しきれていないかもですが。。

時間的な余裕がない中で、解決方法の回答を頂けたので
大変助かりました。

ありがとうございました。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -