-5

私は C# の学習を始めたばかりで、私の本では解決方法を教えてくれない問題に遭遇しました。

テキスト ファイルを読み取り、それを bytearray ( 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 文字あたり 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[] 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 に答える
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 に答える