Random.txt에서 5 번째 문자를 읽는이 작은 프로그램을 작성했습니다. random.txt에 한 줄의 텍스트가 있습니다. ABCDEFGHIJKLMNOPRST. 내가 예상 결과를 얻었다 : (A)의StreamReader.EndOfStream 속성이 BaseStream.Position 값을 변경하는 이유
- 위치가 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;
}
}
내 질문은 이유가 무엇입니까? while (!fp.EndOfStream)
BaseStream.Position
은 19로 변경됩니다. BaseStream
끝. 나는 BaseStream.Position
가 EndOfStream
에 전화 할 때 똑같이 체재 할 것이라는 점을 명백하게 틀리게 예상했다?
감사합니다.
StreamReader에는 바이트를 텍스트로 디코딩 할 수있는 내부 버퍼가 있습니다. 그 메소드를 사용하면 (자), 파일 스트림로부터 바이트를 slurp하게됩니다. 그것의 위치 가치는 예측할 수 없을 것입니다. –
@HansPassant, 나는 이것이 게시 된 코드에서'DiscardBufferedData()'를 호출하는 이유라고 생각한다. – svick
@HansPassant, 네, 위의 코드로 놀았습니다. 그리고 StreamReader의 Read() 메서드로 인해 상황에 따라 BaseStream.Position이 변경되어 예측할 수없는 것으로 나타났습니다. – vldmrrdjcc