得到系统.Byte[]代替ASCII值

本文关键字:代替 ASCII 系统 Byte | 更新日期: 2023-09-27 18:11:44

我是一个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值,而是得到System。Byte[]一直到ASCII列。

帮助!

得到系统.Byte[]代替ASCII值

这就是问题所在:

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的期望是什么。通过"ASCII值",如果您指的是字符的Unicode代码点,只需将i转换为int:

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();
    }
}