如何从文件中读取矩阵到数组中

时间:2016-04-20 12:07:32

标签: c# arrays matrix

嘿伙计我试图能够从文本文件中保存一个数组,但我最终试图弄清楚如何保存它。从文本文件中可以看出,我可以打印矩阵的所有元素。

示例输入:

1 2 3 4 5
2 3 4 5 6 
3 4 5 6 7 
1 2 3 4 5

我不断获得超出范围异常的索引。不确定发生了什么。 希望你们明白我想做什么。 这是我到目前为止所做的:

class Program
{
    static void Main(string[] args)
    {
        string input =
            @"C:\Users\Nate\Documents\Visual Studio 2015\Projects\Chapter 15\Chapter 15 Question 5\Chapter 15 Question 5\TextFile1.txt";
        StreamReader reader = new StreamReader(input);

        List<string> list = new List<string>();
        char[] unwanted = new char[] { ' ' };
        using (reader)
        {
            int row = 0;
            int column = 0;
            string line = reader.ReadLine();

            while (line != null)
            {
                string[] numbersString = line.Split(unwanted);
                int[,] numbersInt = new int [ row, numbersString.Length];
                foreach (string a in numbersString)
                {

                    Console.Write("{0} ",a);// this is to check that the array was read in the right order
                    numbersInt[row, column] = int.Parse(a);
                    column++;
                }
                line = reader.ReadLine();
                Console.WriteLine();
                row++;
            }
        }
    }
}

4 个答案:

答案 0 :(得分:1)

您的直接问题是,在读取每一行后,您的代码不会将column重置为零。将int column = 0移至while循环以解决此问题。

第二个问题是numbersInt分配。你为每一行创建它,这是不对的,因为它是一个二维数组。你需要在循环之前创建它,但当然你不能,因为你不知道你将拥有多少行。一种方法是使用动态数据结构,并一次添加一行。

通过将File.ReadAllLines方法与LINQ结合使用,可以大大简化代码,因为这可以让您摆脱许多简单的代码。现在你可以在创建二维数组之前检查你有多少行,你也可以更容易地填充它:

var allRows = File
    .ReadLines(@"C:\Users\Nate\Documents\Visual Studio 2015\Projects\Chapter 15\Chapter 15 Question 5\Chapter 15 Question 5\TextFile1.txt")
    .Select(line => line.Split(unwanted).Select(int.Parse).ToList())
    .ToList();

如果对阵列阵列没问题,则不需要做任何事情:allRows是包含矩阵的行和列的二维结构。

如果必须将其转换为二维数组,则可以使用一对嵌套的for循环来执行此操作:

if (allRows.Count == 0) {
    // ... The file has no data - handle this error
}
var matrix = new int[allRows.Count, allRows[0].Count];
for (int row = 0 ; row != allRows.Count ; row++) {
    for (int col = 0 ; col != allRows[0].Count ;col++) {
        matrix[row, col] = allRows[row][col];
    }
}

答案 1 :(得分:1)

我建议使用 jugged 数组(数组int[][]数组)而不是 2D 数组;在这种情况下,解决方案将非常简单,就像这样( Linq ):

int[][] matrix = File
  .ReadLines(@"C:\myFile.txt")
  .Split(new Char[] {' ', '\t'}, StringSplitOptions.RemoveEmptyEntries)
  .Select(items => items
     .Select(item => int.Parse(item))
     .ToArray())
  .ToArray();

测试(让我们打印矩阵):

  String report = String.Join(Environment.NewLine, matrix
    .Select(line => String.Join(" ", line)));

  Console.Write(report);

答案 2 :(得分:0)

while中的此更改应该可以解决问题:

while (line = file.ReadLine()) != null)
{
    ...
}

来源:MSDN

答案 3 :(得分:0)

您似乎在while循环中创建了numbersInt实例。这意味着每次循环都会重新创建数组,当循环退出时,数组将会丢失。将numberInt的声明移到while循环之外。