なぜこれが起こるのかわからなかった私は、これよりも早くこれを見つけました。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
はい私の質問はなぜ 'Seek(0)'に 'ReadLine'を実行するときに2バイト含まれていないのでしょうか? – aqwert