我刚刚开始学习C#,遇到了一个问题,我的书都无法告诉我如何解决。
我想读取一个文本文件,并希望将其放入bytearray(BinaryReader
?)并确定所有字节的频率[0..255]。
更新:
这让我得到了理想的结果:
byte[] bar = File.ReadAllBytes("a.txt");
long[] far = new long[256];
foreach (byte b in bar)
{
++far[b];
}
Thanxs为所有帮助和努力的人,我真的很感激;)
答案 0 :(得分:6)
我想读取一个文本文件并希望将其放入bytearray(BinaryReader?)并确定所有字节的频率[0..255]。
奖励积分和陷阱:
答案 1 :(得分:2)
这可能是最有效的方式
int b;
var stats = new int[255];
using (var fs = File.OpenRead(@"file path"))
{
while(-1 != (b = fs.ReadByte()))
stats[b]++;
}
答案 2 :(得分:0)
要从文件中读取 ALL 字节,您需要做的就是:
byte[] data = File.ReadAllBytes("MyFileName");
详情请见此处:http://msdn.microsoft.com/en-us/library/system.io.file.readallbytes.aspx
我假设您正在阅读的文本文件是ASCII还是ANSI?因为如果不是,你不能只把它读作字节,因为有些字符可能不是1个字节长。
无论如何,在拥有字节数据数组之后,您可以遍历它以确定每个字节的总出现次数:
int[] totals = new int[256];
foreach (byte b in data)
{
++totals[b];
}
注意:如果任何字节超过2 ^ 31次,则会失败。我猜它不会发生。 ;)
我不确定“频率”是什么意思。你能定义它吗?
答案 3 :(得分:0)
试试这个:
byte[] bytes = System.IO.File.ReadAllBytes("file.txt");
var groups = bytes.GroupBy(x => x);
foreach (var group in groups)
{
Console.WriteLine(string.Format("{0} : {1}", group.Key, group.Count()));
}
Console.ReadLine();
答案 4 :(得分:0)
对于挑战,在LINQ:
byte[] content = File.ReadAllBytes(myFileName);
var groups = (from character in content
group character by character).ToDictionary(g => g.Key, g => (float)g.Count() / content.Length);
float[] stats = (from character in Enumerable.Range(0, 255)
select groups[character]).ToArray();
我在LINQ中找不到更简单的方法。