C# basestream.seek显示?

C# basestream.seek显示?,c#,C#,我有一个名为message.txt的文本文件,其中有“abcdef”作为文本 现在,代码输出如下: a如果使用偏移量0进行搜索 ?如果使用偏移量1或2进行搜索 a(再次)如果我使用偏移量3进行搜索 b如果我使用偏移量4进行搜索 c如果使用偏移量5进行搜索 等等 static void Main(string[] args) { StreamReader sr = new StreamReader("Message.txt"); sr.BaseStream.

我有一个名为message.txt的文本文件,其中有“abcdef”作为文本

现在,代码输出如下:

a如果使用偏移量0进行搜索

如果使用偏移量1或2进行搜索

a(再次)如果我使用偏移量3进行搜索

b如果我使用偏移量4进行搜索

c如果使用偏移量5进行搜索 等等

static void Main(string[] args)
    {
        StreamReader sr = new StreamReader("Message.txt");
        sr.BaseStream.Seek(2, SeekOrigin.Begin);
        Console.WriteLine((char)sr.Read());
    }
问题:

从偏移量3开始,其行为与预期一致。但理想情况下,从偏移量1开始的输出应该是相同的。因此

Q1.为什么偏移量为0和3时会出现相同的输出a

为什么我会得到a?对于偏移量1和偏移量2


谢谢

您的文件开头有BOM表。字节顺序标记,unicode头


在某个十六进制编辑器中查看您的文件。(重命名为.bin并在Visual Studio中打开)。此特定BOM表告诉计算机这是一个UTF-8文件。

这里有三个可能的因素:

  • 编码:在大多数编码中,字节!=字符
  • 缓冲区:如果您
    查找
    基流,您必须告诉读取器删除它可能拥有的任何缓冲区,否则它会变得非常混乱;要执行此调用
    sr.discardeBufferedData()
  • 文件开头的字节顺序标记

但为什么偏移量为0的seek会给出一个?eD:这是因为StreamReader/TextReader的工作方式。seek方法在二进制字节上运行,而StreamReader/TextReader在文本模式下运行。位置0是文件的开头,有一个字母“a”。它必须从文件中读取4个字节才能读取第一个字母。(只要使用美国拉丁字母,这是正确的。)如果跳过3个字节,它也会读取“a”,因为该位置上有“a”。:-)