我写了这个小程序,它从Random.txt中读取每第5个字符 在random.txt中,我有一行文本:ABCDEFGHIJKLMNOPRST。我得到了预期的结果:为什么StreamReader.EndOfStream属性更改BaseStream.Position值
- A的位置为0 的F
- 位置是K的5
- 位置是P的10
- 位置是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;
}
}
我的问题是,为什么行后BaseStream.Position
变为19,例如结尾BaseStream
。我的预期,显然是错误的,是BaseStream.Position
将保持不变,当我打电话EndOfStream
检查?
谢谢。
StreamReader的内部有一个缓冲,让解码字节的文本。使用它的任何方法都会导致它从文件流中汲取字节。其头寸价值将不可预测。 –
@HansPassant,我认为这是'在发布代码()调用'DiscardBufferedData的原因。 – svick
@HansPassant,是的,我打我上面的代码,我注意到的StreamReader的Read()方法也导致在某些情况下BaseStream.Position的变化,所以它是不可预测的。 – vldmrrdjcc