none
读取文件中一段数据,求教,谢谢!!! RRS feed

  • 问题

  • 我想读出aa.day的第300 - 304 字节,并转成字符串或Integer,下面的代码中fs1.Read(bsy, 300, 4),提示错误(偏移量和长度超出数组的界限,或者计数大于从索引到源集合结尾处的元素数量),求教该如何作,谢谢!!!

    这个文件为我所写,300 - 304 字节原为Integer(20100921)

    Dim fs1 As New System.IO.FileStream(Application.StartupPath & "\SDDE\aa.DAY", System.IO.FileMode.Open, System.IO.FileAccess.Read)
                        Dim bsy(3) As Byte

                        fs1.Read(bsy, 300, 4)
                        fs1.Close()

                        MsgBox(System.Text.Encoding.Unicode.GetString(bsy))

    2010年11月4日 14:29

答案

  • 我认为Read方法第二个参数offset和数组下标对应。即你这样做了可能变成对数组的第300个位置进行赋值,直到第304个。

    Public Overrides Function Read ( _
    <InAttribute> <OutAttribute> array As Byte(), _
    offset As Integer, _
    count As Integer _
    ) As Integer

    array

    当此方法返回时,包含指定的数组,数组中 offset 和 (offset + count - 1) 之间的值被从当前源中读取的字节替换。

    offset

    array 中的字节偏移量,从此处开始读取。

    count

    最多读取的字节数。

    (参考:http://msdn.microsoft.com/zh-cn/library/system.io.filestream.read(VS.80).aspx

    【我的解决方法(尝试)】

    1)把数据全部读出赋给数组,取出第300到304个的:

    Dim fs1 As New System.IO.FileStream(Application.StartupPath & "\SDDE\aa.DAY", System.IO.FileMode.Open, System.IO.FileAccess.Read)
                        Dim bsy() As Byte

                        Redim bsy(fs1.Length) As Byte

                        fs1.Read(bsy, 0, fs1.Length)
                        fs1.Close()

                        MsgBox(System.Text.Encoding.Unicode.GetString(New Byte(){bsy(300),bsy(301),bsy(302),bsy(303),bsy(304)}))

    2)尝试使用Seek直接定位读取:

    Dim fs1 As New System.IO.FileStream(Application.StartupPath & "\SDDE\aa.DAY", System.IO.FileMode.Open, System.IO.FileAccess.Read)
                        Dim bsy(3) As Byte

                        fileStream.Seek(300, SeekOrigin.Begin)

                        fs1.Read(bsy, 0, 4)
                        fs1.Close()

                        MsgBox(System.Text.Encoding.Unicode.GetString(bsy))

    【参考:http://msdn.microsoft.com/zh-cn/library/system.io.filestream.seek(VS.80).aspx

    2010年11月5日 3:49
    版主

全部回复

  • 我不太熟悉vb

    从代码上来看,似乎是在定义bsy时出问题,用c的话是

    byte[] bsy = new byte[4];

     

    另外还有可能你的文件里没有那么多数据

    2010年11月5日 2:02
  • 我认为Read方法第二个参数offset和数组下标对应。即你这样做了可能变成对数组的第300个位置进行赋值,直到第304个。

    Public Overrides Function Read ( _
    <InAttribute> <OutAttribute> array As Byte(), _
    offset As Integer, _
    count As Integer _
    ) As Integer

    array

    当此方法返回时,包含指定的数组,数组中 offset 和 (offset + count - 1) 之间的值被从当前源中读取的字节替换。

    offset

    array 中的字节偏移量,从此处开始读取。

    count

    最多读取的字节数。

    (参考:http://msdn.microsoft.com/zh-cn/library/system.io.filestream.read(VS.80).aspx

    【我的解决方法(尝试)】

    1)把数据全部读出赋给数组,取出第300到304个的:

    Dim fs1 As New System.IO.FileStream(Application.StartupPath & "\SDDE\aa.DAY", System.IO.FileMode.Open, System.IO.FileAccess.Read)
                        Dim bsy() As Byte

                        Redim bsy(fs1.Length) As Byte

                        fs1.Read(bsy, 0, fs1.Length)
                        fs1.Close()

                        MsgBox(System.Text.Encoding.Unicode.GetString(New Byte(){bsy(300),bsy(301),bsy(302),bsy(303),bsy(304)}))

    2)尝试使用Seek直接定位读取:

    Dim fs1 As New System.IO.FileStream(Application.StartupPath & "\SDDE\aa.DAY", System.IO.FileMode.Open, System.IO.FileAccess.Read)
                        Dim bsy(3) As Byte

                        fileStream.Seek(300, SeekOrigin.Begin)

                        fs1.Read(bsy, 0, 4)
                        fs1.Close()

                        MsgBox(System.Text.Encoding.Unicode.GetString(bsy))

    【参考:http://msdn.microsoft.com/zh-cn/library/system.io.filestream.seek(VS.80).aspx

    2010年11月5日 3:49
    版主