[英]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值”表示,只需将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();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.