我怎么做错了这个程序它抛出System.IndexOutOfRangeException?

时间:2016-03-01 00:39:58

标签: c#

class Program
{
    const string CFd = "...\\...\\Duomenys.txt";

    static void Main(string[] args)
    {
        int ki, kj;
        int[,] Grafas = new int[10,10];
        using (StreamReader reader = new StreamReader(CFd))
        {
            string line;
            string[] parts;
            line = reader.ReadLine();
            ki = int.Parse(line);
            kj = int.Parse(line); 
            for (int i = 0; i < ki; i++)
            {
                line = reader.ReadLine();
                parts = line.Split(' ');
                for (int j = 0; j < kj; j++)
                {
                    Grafas[i,j] = int.Parse(parts[j]); //It throws exception in this line
                }
            }
        }
        //--------------------------
        for (int i = 0; i < ki; i++)
        {
            for (int j = 0; i < kj; j++)
            {
                Console.Write("{0} ", Grafas[i,j]);
            }
            Console.WriteLine();
        }
    }
}

我只是不知道我做了什么qrong而且我对c#很新,所以如果nyone足够好来帮助它会意味着很多。我需要的是它从文件中读取多维数组然后在控制台中打印它之后我会尝试做其他所有事情只是因为即使读取文件也不起作用...

文本文件如下所示:

5
5
0 0 0 0 1
1 1 1 0 0
0 1 0 1 0
1 0 1 1 0
0 0 0 1 1

发现问题谢谢大家的帮助

3 个答案:

答案 0 :(得分:1)

在此行中,您可以为kj。

指定一个值
 kj = int.Parse(line);

假设该值为50。

现在这个循环将迭代50次。

for (int j = 0; j < kj; j++)
{
      Grafas[i,j] = int.Parse(parts[j]); //It throws exception in this line
}

parts数组的大小由此行确定。

parts = line.Split(' ');

因此,如果parts的大小为20,系统将抛出错误,因为50&gt; 20.

除此之外,Grafas[i,j]的大小为[10,10]. So if i or j`大于10,它将再次引发类似错误。

希望这会有所帮助。你将不得不重新考虑这个逻辑。

答案 1 :(得分:0)

您确定文件中的第一行包含二维数组高度的正确大小吗?

此外,在打印到控制台时,您的嵌套for循环应该说 Dim htmlDoc As New HtmlAgilityPack.HtmlDocument Dim html As String = <![CDATA[<div class='class1' id='id1'> <iframe id="iframe1" src="wanted1"</iframe> <iframe id="iframe" src="wanted2"</iframe> </div>]]>.Value 'load the html string to the HtmlDocument we defined htmlDoc.LoadHtml(html) 'using LINQ and some xpath you can target any node you want ' //iframe[@src] xpath passed to the SelectNodes function means select all iframe nodes that has src attribute Dim srcs = From iframeNode In htmlDoc.DocumentNode.SelectNodes("//iframe[@src]") Select iframeNode.Attributes("src").Value 'print all the src you got For Each src In srcs Console.WriteLine(src) Next 代替j < kj

i < kj

编辑:您的文本文件使用两行来定义数组的高度和宽度,但您的代码只读取一行。

请改为尝试:

for (int j = 0; j < kj; j++)
{
    Console.Write("{0} ", Grafas[i,j]);
}

答案 2 :(得分:0)

你可能想要这样的东西:

class Program
{
    const string CFd = "...\\...\\Duomenys.txt";

    static void Main(string[] args)
    {
       int ki, kj;
        int[,] Grafas;
        using (StreamReader reader = new StreamReader(CFd))
        {
            string line;
            string[] parts;
            ki = int.Parse(reader.ReadLine()); //read first line
            kj = int.Parse(reader.ReadLine()); //read second line
            Grafas = new int[ki, kj]; //define array size
            for (int i = 0; i < ki; i++)
            {
                line = reader.ReadLine();
                parts = line.Split(' ');
                for (int j = 0; j < kj; j++)
                {
                    Grafas[i, j] = int.Parse(parts[j]); //no more exception!
                    Console.Write("{0} ", Grafas[i, j]); //Output here, so no need for second loop.
                }
                Console.WriteLine();
            }
        }

        Console.ReadLine();
    }
}

发生了什么变化?我们现在将数组的大小基于文本文件的前两行。然后我们解析结果以填充数组。

输出:

0 0 0 0 1
1 1 1 0 0
0 1 0 1 0
1 0 1 1 0
0 0 0 1 1