这个文件的工作方式是有一个空缓冲区,然后是一个用户校验和,然后是一个字节,它给出了用户名字母计数,然后是一个字节,表示跳到下一个用户的字节数,以及一个字节,用户在其中保存他们的设置。
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发布于 2009-05-27 05:24:55
当你改变底层流的位置时,StreamReader不知道你已经这样做了。如果它之前读取了“太多”的数据(出于效率的考虑,它故意避免在底层流上进行大量的少量读取),那么它将使用缓冲数据,而不是直接与重新定位的流对话。您需要在重新定位流之后调用StreamReader.DiscardBufferedData来避免这种情况。
https://stackoverflow.com/questions/913630
复制相似问题