每三个字符读取时,因缓冲区遗留问题造成字符重复。
可以根据读取的返回值(整数)来判断是否为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
最后一行本来应该只有“多”,但由于缓冲区上次的内容是“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