首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Stream.Seek行为

Stream.Seek行为
EN

Stack Overflow用户
提问于 2011-12-14 05:16:42
回答 1查看 880关注 0票数 1

今天早些时候我遇到了这个问题,但我不知道为什么会发生这种情况。

下面的代码将文件流的内部位置设置为一个位置,以便从该位置读取行数。它类似于另一个职位,但是当我使用stream.Seek时,我看到了奇怪的结果

代码语言:javascript
复制
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编码读取一个文件,所以我知道在文件的开头有额外的位来表示这一点,但不是我想要提取的文本的一部分。

例如,我在文件中有以下文本

代码语言:javascript
复制
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来测试这段代码

EN

回答 1

Stack Overflow用户

发布于 2011-12-14 05:31:57

前两个字节表示文件的编码。看一看的文章。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8499773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档