-1

我正在尝试阅读以下文本文件:(跳过前 8 行)并从箭头读取每一列 在此处输入图像描述

我这样做是通过将每个列值放入一个由位置和长度决定的数组中

要测试数组值是否实际捕获了列值,我想在单击另一个按钮时查看值 [0]。但是当我运行我的应用程序时,我得到了我的索引超出数组范围的错误?怎么样,当我的数组大小为 3 并且我不超过这个值时。

    string[] val = new string[3 ]; // One of the 3 arrays - this stores column values

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        OpenFileDialog ofd = new OpenFileDialog();
        if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {

            string[] lines = File.ReadAllLines(ofd.FileName).Skip(8).ToArray();
            textBox1.Lines = lines;

             int[] pos = new int[3] { 3, 6,18}; //setlen&pos to read specific clmn vals
             int[] len = new int[3] {2, 10,28}; // only doing 3 columns right now



             foreach (string line in textBox1.Lines)
             {
                 for (int j = 0; j <= 3; j++)
                 {
                     val[j] = line.Substring(pos[j], len[j]); // THIS IS WHERE PROBLEM OCCURS
                 }

             }

        }
    }

    private void button2_Click(object sender, EventArgs e)
    {   // Now this is where I am testing to see what actual value is stored in my    //value array by simply making it show up when I click the button.

        MessageBox.Show(val[0]);
    }
}

}

4

3 回答 3

2

数组是0索引的,这意味着具有 3 个元素的数组将在索引01和处具有元素2

3超出范围,因此当您尝试访问pos[3]or时len[3],您的程序将抛出异​​常。

使用j < 3而不是j<=3

 for (int j = 0; j < 3; j++)
 {
     val[j] = line.Substring(pos[j], len[j]); // THIS IS WHERE PROBLEM OCCURS
 }
于 2013-10-01T19:48:42.817 回答
2

问题是你一直j == 3for声明中。这将是第四个元素,因为数组是从零开始的,因此将for语句更改为:

for (int j = 0; j < 3; j++)

你会很高兴的。

于 2013-10-01T19:49:32.307 回答
2

该数组pos包含三个值。

考虑你的 for 循环。

  1. 首先 i 为零。即小于或等于三。
  2. 那么我就是一个。即小于或等于三。
  3. 然后我是两个。即小于或等于三。
  4. 然后我是三岁。即小于或等于三。
  5. 然后我四岁。即小于或等于三个。

它执行循环体 4 次。有3个项目。

for对于修复,要遵循标准约定,只需在循环的条件检查中使用小于,而不是小于或等于。

于 2013-10-01T19:49:37.603 回答