gpt4 book ai didi

c# - 为什么 StreamReader.EndOfStream 属性更改 BaseStream.Position 值

转载 作者:行者123 更新时间:2023-11-30 14:16:25 25 4
gpt4 key购买 nike

我写了这个小程序,它从 Random.txt 中每隔 5 个字符读取一次在 random.txt 中,我有一行文本:ABCDEFGHIJKLMNOPRST。我得到了预期的结果:

  • A的位置为0
  • F的位置是5
  • K的位置是10
  • P的位置是15

代码如下:

static void Main(string[] args)
{
StreamReader fp;
int n;
fp = new StreamReader("d:\\RANDOM.txt");
long previousBSposition = fp.BaseStream.Position;
//In this point BaseStream.Position is 0, as expected
n = 0;

while (!fp.EndOfStream)
{
//After !fp.EndOfStream were executed, BaseStream.Position is changed to 19,
//so I have to reset it to a previous position :S
fp.BaseStream.Seek(previousBSposition, SeekOrigin.Begin);
Console.WriteLine("Position of " + Convert.ToChar(fp.Read()) + " is " + fp.BaseStream.Position);
n = n + 5;
fp.DiscardBufferedData();
fp.BaseStream.Seek(n, SeekOrigin.Begin);
previousBSposition = fp.BaseStream.Position;
}
}

我的问题是,为什么 while (!fp.EndOfStream) BaseStream.Position 行后更改为 19,例如BaseStream 的结尾。我预计,当我调用 EndOfStream 检查时,BaseStream.Position 会保持不变?

谢谢。

最佳答案

唯一确定 Stream 是否在其末尾的方法是实际从中读取一些内容并检查返回值是否为 0。(StreamReader 有另一种方式——检查它的内部缓冲区,但你正确地不让它通过调用 DiscardBufferedData 来做到这一点。)

因此,EndOfStream 必须从基本流中读取至少一个字节。而且由于逐字节读取效率低下,因此它读取更多。这就是为什么调用 EndOfStream 将位置更改为末尾的原因(对于更大的文件,它不会是文件末尾)。

看起来你实际上并不需要使用StreamReader,所以你应该直接使用Stream(或者特别是FileStream):

using (Stream fp = new FileStream(@"d:\RANDOM.txt", FileMode.Open))
{
int n = 0;

while (true)
{
int read = fp.ReadByte();
if (read == -1)
break;

char c = (char)read;
Console.WriteLine("Position of {0} is {1}.", c, fp.Position);
n += 5;
fp.Position = n;
}
}

(我不确定在这种情况下将位置设置到文件末尾之后有什么作用,您可能需要为此添加一个检查。)

关于c# - 为什么 StreamReader.EndOfStream 属性更改 BaseStream.Position 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7597089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com