代码之家  ›  专栏  ›  技术社区  ›  Jim

在vb.net中读取文件错误?

  •  0
  • Jim  · 技术社区  · 16 年前

    这个文件的工作方式是有一个空缓冲区,然后是一个用户校验和,然后是一个字节,它给出用户名字母计数,然后是一个字节,表示要跳到下一个用户的字节数,以及一个字节,表示用户将其设置保存在哪个用户文件中。

    if语句中带有usersm变量的循环将设置整个文件流以进行提取。然而,对于几乎完全相同的代码,else子句(特别是else代码中的str.read(xnl,0,usn-1))似乎正在读取文件的最开始部分,尽管之前设置了文件流的位置,但有人知道这里发生了什么吗?

    这是在vb2005

    Private Sub readusersdata(ByVal userdatafile As String)
        ListView1.BeginUpdate()
        ListView1.Items.Clear()
        Using snxl As IO.Stream = IO.File.Open(userdatafile, IO.FileMode.Open)
    
            Using str As New IO.StreamReader(snxl)
                str.BaseStream.Position = 4
                Dim usersm As Integer = str.BaseStream.ReadByte()
                Dim users As Integer = usersm
                While users > 0
                    If usersm = users Then
                        Dim trailtouser As Integer = 0
                        str.BaseStream.Position = 6
                        Dim ust As Integer = str.BaseStream.ReadByte()
                        str.BaseStream.Position = 8
                        Dim snb(ust - 1) As Char
                        str.ReadBlock(snb, 0, ust)
                        Dim bst = New String(snb)
                        If usersm = 1 Then
                            str.BaseStream.Position = 16
                        Else
                            str.BaseStream.Position = 15
                        End If
                        cLVN(ListView1, bst, str.BaseStream.ReadByte)
                        str.BaseStream.Position = 8 + snb.Length
                        str.BaseStream.Position += str.BaseStream.ReadByte + 1
                    Else
    
                        Dim usn As Integer = str.BaseStream.ReadByte
                        str.BaseStream.Position += 2
                        Dim chrpos As Integer = str.BaseStream.Position
                        Dim xnl(usn - 1) As Char
                        str.Read(xnl, 0, usn - 1)
                        Dim skpbyte As Integer = str.BaseStream.ReadByte
                        str.BaseStream.Position += 3
                        Dim udata As Integer = str.BaseStream.ReadByte
    
    
                    End If
    
                    users -= 1
    
                End While
            End Using
        End Using
        ListView1.EndUpdate()
    End Sub
    
    1 回复  |  直到 16 年前
        1
  •  2
  •   Jon Skeet    16 年前

    当您更改基础流的位置时, StreamReader 不知道你做到了。如果以前读取的数据“太多”(为了提高效率,故意这样做是为了避免在底层流上进行大量的少量读取),那么它将使用缓冲数据,而不是直接与重新定位的流通信。你需要打电话 StreamReader.DiscardBufferedData 重新定位流以避免这种情况。