2011-12-14 5 views
1

なぜこれが起こるのかわからなかった私は、これよりも早くこれを見つけました。Stream.Seekの動作

ファイルストリームの内部位置を場所に設定して、その位置から行数を読み取ることができる次のコードがあります。それは、this other postに似ていますが、私はstream.Seekを使用したとき、私は奇妙な結果

を参照してください
StringBuilder b = new StringBuilder(); 
using(var stream = _streamFactory.CreateStream()) 
using (var streamReader = new System.IO.StreamReader(stream, _streamFactory.Encoding)) 
{ 
    stream.Seek(startPosition, System.IO.SeekOrigin.Begin); 

    string value; 
    for (int i = 0; i < lines; i++) 
    { 
     if ((value = streamReader.ReadLine()) != null) 
     { 
      b.AppendLine(value); 
     } 
     } 
} 

今、私は、私は余分なビットは、ファイルの先頭にある知っているので、UTF-8エンコーディングを使用してファイルを読んでやっていることこれを示すが、抽出したいテキストの一部ではない。

セイeampleのために、私は、ファイル

Hello my name is bob 

に次のテキストを持って、私は0にstartPositionを設定するのであれば私の結果は、になり、私は1にstartPositionを設定した場合こんにちは私の名前は私が得るいけないしかしボブですello私の名前はボブではなくむしろ@@こんにちは私の名前はボブですここで@@はエンコーディングビットから2バイトです。

.Seek(0)を設定してからReadLineを入力すると、正しい行が得られますが、Seek(1)はエンコードの2番目と3番目のバイトを返しますか?

Seek(3)でも、Seek(0)と同じ結果が得られます。これが一致した場合、私はSeek(0)を返すだろうと思っているだろう@@@こんにちは私の名前はボブ

である。また、どのように私は余分なバイトがそれを読んで(ただし、エンコーディングを知って)せずに、ファイルの先頭にあるどのように多くのを知っています?

私は、分解されたコードを見て、私の脳がストライキに入る前に停止しなければならなかった。

注: この場合のStreambuilderは、FileStreamを作成しています。私はこれを行うことができますので、このコードをユニットテストするMemoryStream

答えて

1

最初の2バイトはファイルのエンコーディングを表します。 thisの記事をご覧ください。

+0

はい私の質問はなぜ 'Seek(0)'に 'ReadLine'を実行するときに2バイト含まれていないのでしょうか? – aqwert