【发布时间】:2020-02-13 07:20:18
【问题描述】:
abc.txt 文件内容为
ABCDEFGHIJ•XYZ
现在,如果我使用此代码(即寻找位置 9),显示的字符就可以了,
string filePath = "D:\\abc.txt";
FileStream fs = new FileStream(filePath, FileMode.Open);
StreamReader sr = new StreamReader(fs, new UTF8Encoding(true), true);
sr.BaseStream.Seek(9, SeekOrigin.Begin);
char[] oneChar = new char[1];
char ch = (char)sr.Read(oneChar, 0, 1);
MessageBox.Show(oneChar[0].ToString());
但如果 SEEK 位置正好在那个特殊点字符之后,那么我会得到垃圾字符。
所以,如果我搜索到第 11 位(即在点位置之后),我会得到垃圾字符
sr.BaseStream.Seek(11, SeekOrigin.Begin);
这应该给出“X”,因为第 11 位的字符是 X。
我认为文件内容是合法的 UTF8。
还有一件事, StreamReader BaseStream 长度和 StreamReader Contents Length 不同。
MessageBox.Show(sr.BaseStream.Length.ToString());
MessageBox.Show(sr.ReadToEnd().Length.ToString());
【问题讨论】:
-
如果你使用
StreamReader,你应该从不寻找底层流;读者假设 it 现在控制流,因为它维护一个内部缓冲区;寻找底层流可能会导致非常奇怪的效果;另外,Seek(9...)没有任何意义:除非您使用单字节编码,否则您无法通过在 bytes 中查找来查找 9 个 characters,其中:您不是;您需要让StreamReader丢弃 9 个字符
标签: c# utf-8 streamreader