我寫了這個小程序,它從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