2009-05-27 75 views
0

這個文件的工作方式是有一個空緩衝區,然後用戶檢查和然後一個字節,給你的用戶名字母數,然後一個字節多少字節跳到下一個用戶和一個字節爲哪個用戶文件用戶保留其設置。在VB.NET中讀取文件錯誤?

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 

回答

2

當您更改底層流的位置,StreamReader不知道你這樣做。如果之前讀取的數據太多(故意爲了提高效率 - 它會盡量避免在底層數據流上做很多小的讀取操作),那麼它將使用緩衝的數據,而不是直接與重新定位的數據進行對話流。重新定位流後,您需要撥打StreamReader.DiscardBufferedData以避免這種情況。

+0

它的asinine,如果你操縱streamreader下的流,它不跟上變化,這個作品謝謝你 – Jim 2009-05-27 09:13:52