【问题标题】:Getting System.Byte [] instead of ASCII value获取 System.Byte [] 而不是 ASCII 值
【发布时间】:2014-07-06 21:44:52
【问题描述】:

我是 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 列。

帮助!

【问题讨论】:

    标签: c# file text ascii


    【解决方案1】:

    这就是问题所在:

    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 值”,只需将 i 转换为 int

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

    哦,您可能还想更改计算 percent 的方式 - 您使用的是整数运算,因此结果将始终为 0。

    顺便说一句,您也不清楚为什么要将字符串小写两次。你不觉得一次就够了吗?你为什么要小写呢?

    哦,你打开了一个输入文件,但从来没有对它做任何事情。为什么?

    对于您的代码,我还有很多其他方面的更改 - 尤其是布局(每行一个语句,几乎总是如此!) - 但这只是一个开始。

    【讨论】:

    • 嘿,伙计们,关于如何按频率对列表进行排序的任何想法?我也在努力解决这个问题。
    • @user3810458:我会使用 LINQ,但我不确定它是否对你来说是最好的学习...
    【解决方案2】:

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

    【讨论】:

    • 为什么要创建一个List&lt;&gt;?只需使用s.GroupBy(c =&gt; c) 就可以了。
    猜你喜欢
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多