0

ストリーム/ファイルの長さを文字数(バイトではなく)で取得するにはどうすればよいですか?ファイル/ストリームのエンコーディングが(実行時に)既知であると仮定しましょう。

ストリーム全体をメモリにロードしたくないので、使用しないでくださいTextReader.ReadToEnd()

4

3 に答える 3

1

エンコーディングが固定幅のもの (すべての文字のバイト数が同じ - たとえば、UTF-8 ではなく ASCII) でない限り、ファイル全体を読み取る必要がありますが、メモリ内にある必要はありません。例えば:

public long CountCharacters(TextReader reader)
{
    char[] buffer = new char[8 * 1024]; 
    long total = 0;
    int charsRead;
    while ((charsRead = reader.Read(buffer, 0, buffer.Length)) > 0)
    {
        total += charsRead;
    }
    return total;
}

次のように使用します。

using (var reader = File.OpenText("file.txt", Encoding.UTF8))
{
    Console.WriteLine(CountCharacters(reader));
}

これは UTF-16 コード単位をカウントすることに注意してください。これは、Unicode 文字または表示可能なグリフとまったく同じではありませんが、ほとんどの場合、十分です。(文字とサロゲートペアを組み合わせる場合などを考慮してください。)

于 2013-01-16T16:58:42.557 に答える
0

これが私がこれまでに持っているものです:

Stream stream = file.OpenRead("file.txt");
Encoding encoding = Encoding.Default; //or whatever

TextReader reader = new StreamReader(stream, encoding);
var buf = new char[4096];
long total=0;
long crt;
while ((crt = reader.Read(buf, 0, 4096)) > 0)
{
   total += crt;
}

return total;
于 2013-01-16T16:58:34.750 に答える
0

エンコーディングに依存します。固定長エンコーディングの場合は、バイト長を文字のサイズで割ります。可変長エンコーディングの場合は、ファイルが処理されるまでわかりません。

于 2013-01-16T16:59:36.840 に答える