2009-05-27 6 views
0

Le fonctionnement de ce fichier est un tampon nul, puis une somme de contrôle utilisateur puis un octet qui vous donne le nombre de lettres du nom d'utilisateur, puis un octet pour le nombre d'octets à passer à l'utilisateur suivant et un octet pour quel utilisateur le fichier dans lequel l'utilisateur conserve ses paramètres.Lire un fichier bogue dans VB.NET?

La boucle avec la variable usersm dans l'instruction IF configure le flux de fichier entier pour l'extraction. Cependant, avec presque exactement le même code, la clause else spécifiquement le str.Read (xnl, 0, usn - 1) dans le code else semble lire le tout début du fichier malgré la position du flux de fichiers étant réglé plus tôt, quelqu'un sait Qu'est-ce qu'il se passe ici?

c'est dans 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 

Répondre

2

Lorsque vous modifiez la position du flux sous-jacent, l'StreamReader ne sait pas que vous avez fait cela. S'il a déjà lu des données "trop" (délibérément, par souci d'efficacité - il essaie d'éviter de faire beaucoup de petites lectures sur le flux sous-jacent), il aura alors des données tamponnées qu'il utilisera au lieu de parler directement au repositionné courant. Vous devez appeler StreamReader.DiscardBufferedData après avoir repositionné le flux pour éviter cela.

+0

Son asinine que si vous manipuler le flux sous le lecteur de flux qu'il ne suit pas les changements, cela fonctionne merci – Jim

+0

Pourquoi est-ce asinine? Comment le StreamReader le sait-il? Pour 99% des cas, vous * ne * gâchez pas le flux sous-jacent et la mise en mémoire tampon est très utile. Rappelez-vous également que tous les flux ne soutiennent même pas la notion de recherche ou de recherche de la position actuelle, ce qui rendrait la détection encore plus difficile. –

+0

vous penseriez que si le pointeur interne a changé sur un flux que le lecteur de flux utilisait comme ressource qu'il mettrait à jour son propre pointeur. C'était quelque chose que je ne pensais pas devoir m'inquiéter. Dans ce programme, je dois sauter un peu pour obtenir les données dont j'ai besoin à la fois en octets et en chaînes – Jim