-5

我刚开始学习 C#,遇到了一个我的书都没有告诉我如何解决的问题。

我想读取一个文本文件并将其放入一个字节数组(BinaryReader?)中并确定所有字节 [0..255] 的频率。

申请图片

更新:

好吧,这让我得到了想要的结果:

        byte[] bar = File.ReadAllBytes("a.txt");
        long[] far = new long[256];

        foreach (byte b in bar)
        {                
            ++far[b];
        }

感谢所有帮助和努力的人,我真的很感激;)

4

5 回答 5

6

我想读取一个文本文件并将其放入一个字节数组(BinaryReader?)并确定所有字节 [0..255] 的频率。

  1. 将文本文件读入字节:System.IO.File.ReadAllBytes
  2. 使用foreach循环遍历每个字节
  3. 在合适的数据结构中增加一个整数,表示找到的每个字节

奖励积分和陷阱:

  1. 处理大型(1GB)文件而不将其完全读入内存(提示:查看 System.IO.Stream 命名空间)
  2. Unicode(提示:并非所有语言每个字符都有 1 个字节。查看 System.Text 命名空间)
于 2013-01-29T16:21:14.050 回答
2

这可能是最有效的方式

int b;
var stats = new int[255];
using (var fs = File.OpenRead(@"file path"))
{
    while(-1 != (b = fs.ReadByte()))
        stats[b]++;
}
于 2013-01-29T16:22:17.053 回答
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();
于 2013-01-29T16:18:06.470 回答
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 中找不到更简单的方法。

于 2013-01-29T16:28:37.860 回答
0

从文件中读取所有字节所需要做的就是:

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 次,这将失败。我猜这不会发生。;)

我不确定您所说的“频率”是什么意思。你能定义它吗?

于 2013-01-29T16:13:58.097 回答