2

特定の文字の存在に基づいて大きなファイルから行数を計算しようとしていますが、StreamReader と ReadBlock を使用したいと考えています。以下は私のコードです。

 protected virtual long CalculateRowCount(FileStream inStream, int bufferSize)
        {
            long rowCount=0;
            String line;

            inStream.Position = 0;

            TextReader reader = new StreamReader(inStream);

            char[] block = new char[4096];
            const int blockSize = 4096;
            int indexer = 0;
            int charsRead = 0;
            long numberOfLines = 0;
            int count = 1;
            do
            {

                charsRead = reader.ReadBlock(block, indexer, block.Length * count);
                indexer += blockSize ;

                numberOfLines = numberOfLines + string.Join("", block).Split(new string[] { "&ENDE" }, StringSplitOptions.None).Length;
                count ++;

            } while (charsRead == block.Length);//charsRead !=0


            reader.Close();
            fileRowCount = rowCount;
            return rowCount;

        }

しかし、私はエラーが発生します

オフセットと長さが配列の範囲外であるか、カウントがインデックスからソース コレクションの末尾までの要素数を超えています。

何が悪いのかわかりません...助けてもらえますか。ありがとうございます!

4

1 に答える 1

4

1 つには、StreamReader.ReadBlock() のドキュメントhttp://msdn.microsoft.com/en-us/library/system.io.streamreader.readblock.aspxを注意深く読み、実行していることと比較します。

  • 2 番目の引数 (インデクサー) は、渡すブロックの範囲内にある必要がありますが、1 回の反復後におそらくそれを超える何かを渡しています。メモリブロックを再利用したいようなので、ここでは0を渡します。
  • 3 番目の引数 (count) は、メモリ ブロックに読み込むバイト数を示します。ブロックサイズより大きいものを渡すと機能しない場合があります (実装によって異なります)。
  • ReadBlock() は実際に読み取られたバイト数を返しますが、ブロックのサイズを常に正確に返すかのようにインデクサーをインクリメントします (ほとんどの場合、そうではありません)。
于 2014-09-02T20:13:03.023 に答える