2013-01-16 105 views

回答

1

除非编码是一个固定宽度的一个(每个字符的字节数相同 - 例如ASCII但不是UTF-8),则需要读取整个文件 - 但不需要在内存中。例如:

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字符或显示字形,但在这种情况将会足够好。 (考虑诸如组合字符和替代对之类的情况。)

+0

哇,你回答的速度比我可以复制粘贴自己的执行更快!^:))^ –

+0

只是一个建议:char count可以比'int.MaxValue'大,所以我建议使用'long total' ...和一个返回类型的'long'而不是int –

+0

@CristiDiaconescu:真 - 将编辑。 (您是否有可能处理大于2GB的文件,出于兴趣?) –

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; 
0

它取决于编码。如果它是一个固定长度的编码,则将字节长度除以字符的大小,如果它是可变长度编码,则在处理文件之前它是不可知的。