今天早些时候我遇到了这个问题,但我不知道为什么会发生这种情况。
下面的代码将文件流的内部位置设置为一个位置,以便从该位置读取行数。它类似于另一个职位,但是当我使用stream.Seek时,我看到了奇怪的结果
StringBuilder b = new StringBuilder();
using(var stream = _streamFactory.CreateStream())
using (var streamReader = new System.IO.StreamReader(stream, _streamFactory.Encoding))
{
stream.Seek(startPosition, System.IO.SeekOrigin.Begin);
string value;
for (int i = 0; i < lines; i++)
{
if ((value = streamReader.ReadLine()) != null)
{
b.AppendLine(value);
}
}
}现在我要做的是使用UTF-8编码读取一个文件,所以我知道在文件的开头有额外的位来表示这一点,但不是我想要提取的文本的一部分。
例如,我在文件中有以下文本
Hello my name is bob因此,如果我将startPosition设置为0,我的结果将是bob,我的名字是bob,但是当我将startPosition设置为1时,我没有得到ello,我的名字是bob,而是@Hello,我的名字是bob,其中@@是编码位的2个字节。
所以我的问题是,为什么当我设置.Seek(0),然后做一个ReadLine时,我得到正确的行,但是Seek(1)会返回编码的第二个和第三个字节?
Seek(3)还将产生与Seek(0)相同的结果。如果这是一致的,我会认为Seek(0)会返回@Hello,我的名字是bob
另外,我如何知道在不读取文件(但知道编码)的情况下,文件的开头有多少个额外的字节?
我试着看了看分解的代码,在我的大脑开始罢工之前,我不得不停下来。
注意:本例中的Streambuilder只是创建一个FileStream。我这样做是为了让我可以用MemoryStream来测试这段代码
发布于 2011-12-14 05:31:57
前两个字节表示文件的编码。看一看这的文章。
https://stackoverflow.com/questions/8499773
复制相似问题