2012-01-13 5 views
1
   int j = (1024 * 1024); // = 1 megabyte 
       char[] buffer = new char[j]; 
       int charsRead = 0; 
       while ((charsRead = sr.Read(buffer, 0, buffer.Length)) > 0) 
       { 
        string john = new string(buffer, 0, charsRead); 
        sw.WriteLine(john);       
       } 

これは私の最初のバッファ使用の経験であり、上記のコードはバッファの最後が一致しないという事実を除いて私が望むことをしていますテキストファイル内の行の終わりが読み込まれます。これにより、以下の内容が表示されます。バッファの最後までの埋め込み方法

john likes to farm cattle 
john likes to farm beetles 
john likes to farm rabbits 
john likes to farm carrots 
john likes to farm b  <---1MB buffer ends here 
ears      <---new 1MB buffer begins here 
john likes to farm antelope 
john likes to farm rabies 
john likes to farm lions 

程度のバッファを持つ方法があります:ソースファイルの各行は、潜在的に異なる長さであるため、ブレークは常に行に同じ場所で発生していないことに注意してください指定されたサイズ(この例では1MB)ですが、1MBに達する前の最後の行の最後までです(したがって、バッファのサイズは常に1MBよりもわずかに小さくなります)。私はそのプロセスの一部が、正確に行が何であるかを定義することを含むと思っています(幸いにもこれを行う方法はわかっていますが)その後、私は何をする必要があるか分かりません。

バッファの内容がファイルに書き込まれ、不完全な行が検索され、破損した行でそれらを再結合した後、私が考えることができる唯一の解決策は考えられます。しかし、これは本当に非効率なようだ。

編集:私はから読まれているソースファイルの形式を含めるのを忘れ:

john likes to farm cattle 
john likes to farm beetles 
john likes to farm rabbits 
john likes to farm carrots 
john likes to farm bears 
john likes to farm antelope 
john likes to farm rabies 
john likes to farm lions 

答えて

3

(私の意見では)最も明白な解決策は、あなたのバッファ内の文字列は、改行が含まれて持っているだろう(と読み取り時に保管してください)、WriteLineの代わりにWriteを使用してください。

+0

それは私には起こらなかった、ありがとう。 –

+0

合意。おそらく、改行は、バッファの終わりの前の行が正しいように見えるので、すでにバッファに入っています。 –

+1

バッファサイズを約4KiBまで減らすこともできます。小さいほうが頻繁に呼び出されますが、大きくなるとメモリが増え、メインメモリへの呼び出しが増えます。およそ4KiBが、現在の多くのマシンのスイートスポットに当たっています。 –

2

まずはWriteLineの代わりにWriteを使用してください。

最初に、一度に1つの文字を読み込んだとしても、上書きせずにこれを行うことは絶対にありません。容量が50バイト残っている場合は、新しい行を読み始めますか?そうでない場合は、未使用容量で終了する可能性があります。そうしないと、その場では使用できない50バイト分のデータが読み込まれます。

バッファの容量は、何を読んでも同じです。しかし、あなたは無関係なキャラクターをどうするかを決める必要があります。

1つのオプションは、より小さなバッファを最後の行まで戻し、余分な文字を破棄し、入力ストリームを「巻き戻し」して、ハーフリード線の先頭から次の読み取りを開始することです。しかし、これは遅くなるでしょう(バッファを少し前のバッファに戻す前にバッファをコピーしなければなりません)。また、実行不可能な場合もあります(入力ストリームが巻き戻しをサポートしていない場合はどうでしょうか?

ご覧のとおり、これをどの程度正確に処理すべきかは、単純な選択ではなく、達成しようとしていることに依存します。それはcopying from a stream to anotherより複雑でなければなりません。

+0

実際にはFileStreamを使用している場合はこれが可能です。 'Seek'をバッファの長さの位置にして、見つかった最初の改行文字まで逆方向に読み込むことができます。素晴らしい計画ではありませんが、可能です。 –

+0

@DavidClarke:しかし、通常は、それが特にFileStreamまたはMemoryStreamなどであると仮定したくありません。巻き戻せない川もあります。 – Jon

+0

引数なし、サポートされていることを指摘する –

2

バッファを書き出すときにStreamWriter.WriteLineを使用する代わりに、StreamWriter.Writeを使用します。 StreamWriter.WriteLineは改行文字を追加するため、ファイルに改行が入っています。

関連する問題