簡體   English   中英

獲取System.Byte []而不是ASCII值

[英]Getting System.Byte [] instead of ASCII value

我是C#的新程序員。 我遇到一個字符頻率讀取程序無法正確顯示ASCII值的問題。 應該從文本文件中讀取內容,將所有大寫字母轉換為小寫字母,顯示ASCII值,出現的頻率以及文件中每個字符出現的字符總數的百分比,然后按頻率對列表進行排序。 下面是我到目前為止的代碼:

using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.IO;
using LibUtil;
using LibDate;

namespace Ch8Prb3
{
  class Program
  {
    const string INPUT_FILE_NAME = "\\CIS210\\Ch8Prb3\\TextDat.Txt";
    const string OUTPUT_FILE_NAME = "\\CIS210\\Ch8Prb3\\Ch8Prb3Rpt.Txt";

    int count;
    static StreamReader fileIn;
    static StreamWriter fileOut;

    static void Main()
    {
      ConsoleApp.ClrScr(); IdentifyApplication();
      OpenFiles(); LetterFreq();
      CloseFiles();
    }

    static void IdentifyApplication()
    {
      Console.WriteLine();
      Console.WriteLine("Application: Ch8Prb3 -- Find and display a character-frequency  ");
      Console.WriteLine("                        report of only letter chracters and their");
      Console.WriteLine("                        ASCII values from a text file.");
      Console.WriteLine();
    }

    static void OpenFiles()
    {
      try
      {
        fileIn = File.OpenText(INPUT_FILE_NAME);
        Console.WriteLine("{0} was opened", INPUT_FILE_NAME);
      }
      catch
      {
        Console.WriteLine("Error: {0} does not exist\n", INPUT_FILE_NAME);
        ConsoleApp.Exit();
      }

      try
      {
        fileOut = File.CreateText(OUTPUT_FILE_NAME);
        Console.WriteLine("{0} was created\n", OUTPUT_FILE_NAME);
      }
      catch
      {
        Console.WriteLine("Error: {0} could not be created\n", OUTPUT_FILE_NAME);
        ConsoleApp.Exit();
      }
    }

    static void LetterFreq()
    {
      int[] c = new int[(int)char.MaxValue];
      int total = 0;
      int j = 0;

      string s = File.ReadAllText("\\CIS210\\Ch8Prb3\\TextDat.Txt");
      string l = Convert.ToString(Encoding.ASCII.GetBytes(s));

      s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToLower(s.ToLower());      
      double percent;

      foreach (char t in s)
      {
        c[(int)t]++;
      }

      PrintHeader();

      for (int i = 0; i < (int)char.MaxValue; i++)
      {
        if (c[i] > 0 && char.IsLetter((char)i))
        {
          total += c[i];
          percent = c[i] / total * 100;          
          fileOut.WriteLine("  {0}  {1,3}  {2,3}  {3,2:f2}", (char)i, l, c[i], percent);
        }        
      }

      fileOut.WriteLine();
      fileOut.WriteLine("Number of Characters: {0}", total);
    }   

    static void PrintHeader()
    {
      fileOut.WriteLine("   Chapter 8 Problem 3");
      fileOut.WriteLine("Character Frequency Report");
      fileOut.WriteLine("      {0:MM/dd/yyyy}", Date.Today);
      fileOut.WriteLine();
      fileOut.WriteLine("      ASCII               ");
      fileOut.WriteLine("Char  Value  Freq  Percent");
      fileOut.WriteLine("----  -----  ----  -------");
    }

    static void CloseFiles()
    {
      fileIn.Close(); fileOut.Close();
    }
  }
}

我沒有獲得每個字符的ASCII值,而是一直從ASCII列開始獲得System.Byte []。

救命!

這就是問題:

Convert.ToString(Encoding.ASCII.GetBytes(s));

Encoding.GetBytes(string)返回一個byte[] ,在其上調用Convert.ToString()將僅返回System.Byte[]

目前尚不清楚為什么你使用Encoding.ASCII的一切都在這里-你已經得到了文件作為字符串的內容,上一行:

string s = File.ReadAllText("\\CIS210\\Ch8Prb3\\TextDat.Txt");

只需使用它代替l 老實說,目前尚不清楚您對l期望。 如果您是指字符的Unicode代碼點,則用“ ASCII值”表示,只需將iint

fileOut.WriteLine("  {0}  {1,3}  {2,3}  {3,2:f2}", (char)i, (int) i, c[i], percent);

哦,您可能也想更改計算percent的方式-您正在使用整數算術,因此結果將始終為0。

尚不清楚,為什么還要對字符串進行兩次下套管。 你不覺得一次就夠了嗎? 為什么根本沒有外殼?

哦,您打開了一個輸入文件,但從未對其執行任何操作。 為什么?

我會對您的代碼進行很多其他更改-不僅是布局(每行一個語句,幾乎總是!)-但這將作為開始。

使用list和groupby可以大大簡化程序的壓縮:

class Program
{
    const string INPUT_FILE_NAME = "\\CIS210\\Ch8Prb3\\TextDat.Txt";

    static void Main(string[] args)
    {
        var s = System.IO.File.ReadAllText(INPUT_FILE_NAME).ToLower();
        var list = s.ToList();
        var group = list.GroupBy(i => i);

        foreach (var g in group)
        {
            Console.WriteLine("{0} {1}", g.Key, g.Count());
        }

        Console.ReadLine();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM