4

次のような 3 行の .txt ファイルがあります。

A50

B25

C25

これは私のコードです:

FileStream fs = new FileStream(@"E:\1.txt", FileMode.Open);
StreamReader sr = new StreamReader(fs);
textBox1.AppendText(sr.ReadLine() + "\r\n");
textBox1.AppendText(fs.Position.ToString());

上記のコードを実行すると、出力は次のようになります。

A50

14

私の質問は、なぜ位置の値が 14 なのですか? ストリームのポインターが A50 の最初の行の末尾にある '\n' 文字を指すため、4 ではないのはなぜですか?

下手な英語でごめんなさい。

4

2 に答える 2

4

StreamReader、ディスクから内部バッファにデータを読み取り、そのバッファからの要求を満たします。

オペレーティング システムを呼び出してデータを取得する回数を減らすために、このように動作します。内部バッファがない場合は、次のようにする必要があります。

while (not end-of-file and character != newline)
{
    read next character and append to string
}

内部バッファを使用して、大量のデータ (デフォルトは 4K バイト程度ですが、変更可能) をメモリに読み込みます。次に、そのデータ ブロックをすばやくスキャンして改行文字を探し、文字列を返すことができます。

于 2013-05-13T18:30:12.583 に答える
3

私の質問は、なぜ位置の値が 14 なのですか?

StreamReader、基になるストリームに対して比較的少ない読み取り操作を実行するために、「オーバーリード」を持っています。はい、それは内部バッファに関連しています - アイデアは、基礎となるストリームで「分厚い」読み取り操作を実行し、多くの場合、現在の操作を満たすために厳密に必要以上に読み取ります - したがって、多くのシングルバイト読み取りを防ぎます.

読み過ぎのリスクなしに一度​​に 1 行ずつ読み取るには、一度に 1バイトずつ読み取る必要があります。これは 1 文字でさえない可能性があります。ストリームの実装によっては、これは非効率的である可能性があります。代わりに、非表示の実装の詳細であるバッファーを読み取り (バッファーに直接アクセスすることはできません)、ストリームから再度読み取る必要があるまで、そのバッファーからの要求を満たします。

于 2013-05-13T18:28:36.667 に答える