繁体   English   中英

发生异常 索引超出数组范围

[英]Exception occurred Index was outside the bounds of the array

运行我的代码时出现以下错误:

发生异常 索引超出数组范围。

我的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace ASCII

{
    class CharacterFrequency
    {
        private char ch;
        private int frequency;

        public char Ch
        {
            get { return ch; }
            set { ch = value; }
        }
        public int Frequency
        {
            get { return frequency; }
            set { frequency = value; }
        }
    }

    class Program
    {
        public string InputFileName = "wap.txt";
        public string OutputFileName = "Output.txt";
        public string FilePath = "";

        public static SortedDictionary<char, ulong> Count(string stringToCount)
        {
            SortedDictionary<char, ulong> characterCount = new SortedDictionary<char, ulong>();


            foreach (var character in stringToCount)
            {
                if (!characterCount.ContainsKey(character)) // added character to dictionary if only character is absent in charactercount
                {
                    characterCount.Add(character, 1);
                }
                else
                {
                    characterCount[character]++; // increemetned count
                }
            }
            return characterCount;
        }

        static void Main(string[] args)
        {
            Program p = new Program();
            CharacterFrequency obj = new CharacterFrequency();
            StreamWriter streamWriter = new StreamWriter(p.OutputFileName);

            try
            {
                p.InputFileName = args[0]; // get input
                p.OutputFileName = args[1]; // get output
                p.FilePath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\" + p.InputFileName; // get file path
                if (File.Exists(p.FilePath)) // checked if file exist
                {
                    string data = File.ReadAllText(p.FilePath); // read the data in string
                    var count = Program.Count(data); // pass the string to count method
                    foreach (var character in count)
                    {
                        streamWriter.WriteLine(character.Key + "(" + (int)character.Key + ")" + "\t" + character.Value); // write data to output file
                    }
                    streamWriter.Close();
                    Console.ReadLine();
                }
                else
                {
                    Console.WriteLine("Please provide input File"); // if input file absent sent message to user to place input file
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception occured " + ex.Message.ToString());
            }
        }
    }
}

该程序应该读取一个 ASCII 文本文件并计算每个字符在文本文件中出现的次数。 它应该输出一个包含此信息的文本文件,并且字符频率对象应该存储在数组中。 任何帮助,将不胜感激。

我看到的唯一可能抛出异常的行是这些:

p.InputFileName = args[0]; // get input
p.OutputFileName = args[1]; // get output

args数组具有来自命令行的参数。 所以当你运行这个时,你是在命令行中传递参数吗? 喜欢:

program.exe input.txt output.txt

但是您正在为它们声明变量:

public string InputFileName = "wap.txt";
public string OutputFileName = "Output.txt";

所以也许这就是你的意图?:

p.InputFileName = InputFileName;
p.OutputFileName = OutputFileName;
public static SortedDictionary<char, ulong> Count(string stringToCount)
{
   var characterCount = new SortedDictionary<char, ulong>();

   foreach (var character in stringToCount)
      if (!characterCount.ContainsKey(character))       
         characterCount.Add(character, 1);
      else
         characterCount[character]++; //

   return characterCount;
}

static void Main(string[] args)
{

   var filePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);  
   var inputFileName = Path.Combine(filePath, args[0]);
   var outputFileName = Path.Combine(filePath, args[2]);

   // read data, count chars
   var count = Count(File.ReadAllText(inputFileName)); 

   // create output
   var outPut = count.Select(x => $"{x.Key}\t{x.Value}");

   // write it
   File.WriteAllLines(outputFileName, outPut);

}

所以

  • 如果您需要组合路径,请使用Path.Combine

  • 如果您需要投影或转换事物,请使用Select

  • 如果你需要写一些行File.WriteAllLines

显然,这缺少错误检查,以及您传入的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM