每三个字符读取时,因缓冲区遗留问题造成字符重复的解决办法。


每三个字符读取时,因缓冲区遗留问题造成字符重复。

可以根据读取的返回值(整数)来判断是否为3,不为3说明没有填满缓冲区,另外处理。


先看一下故障:

Imports System.IO
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        OpenFileDialog1.Filter = "Text File(*.txt)|*.txt"
        If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            Dim sr As StreamReader = New StreamReader(OpenFileDialog1.FileName, System.Text.Encoding.Default)
            Dim s(2) As Char
            While sr.Peek > 0
                sr.Read(s, 0, 3)
                TextBox1.AppendText(s & vbCrLf)
            End While

            sr.Close()
        End If
    End Sub
End Class

      运行,结果:

          每三个字符读取时,因缓冲区遗留问题造成字符重复的解决办法。_第1张图片

         最后一行本来应该只有“多”,但由于缓冲区上次的内容是“cef”,其中“c”被“多”覆盖,便缓冲区剩下的"ef"还在。

        导致最后一次读取时,会显示“多ef”


        开始以为用erase进行擦除,结果它是释放分配的内存,没克服这个问题。


         怎么解决呢?

         sr.read的返回值是读取的字符个数,因此它就告诉了最后读出了多少个字符,用它来判断,可以得正确的结果:

Imports System.IO
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        OpenFileDialog1.Filter = "Text File(*.txt)|*.txt"
        If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            Dim sr As StreamReader = New StreamReader(OpenFileDialog1.FileName, System.Text.Encoding.Default)
            Dim s(2) As Char '缓冲区,3个字符
            Dim i As Int32
            While sr.Peek > 0
                i = sr.Read(s, 0, 3) '一次读3,用返回值判断是否填满缓冲区
                If i = 3 Then '若是三个,直接缓冲区全填
                    TextBox1.AppendText(s & vbCrLf)
                Else          '否则根据返回值,读取剩下缓冲区内容
                    For j As Int16 = 0 To i - 1
                        TextBox1.AppendText(s(j))
                    Next
                End If
            End While

            sr.Close()
        End If
    End Sub
End Class

          结果如下:

          每三个字符读取时,因缓冲区遗留问题造成字符重复的解决办法。_第2张图片






你可能感兴趣的:(VB.NET,缓冲区,StreamReader)