【问题标题】:How do I read a matrix from a file into an array如何将文件中的矩阵读入数组
【发布时间】:2016-04-20 12:07:32
【问题描述】:

大家好,我试图从文本文件中保存一个数组,但我正在努力弄清楚如何保存它。从文本文件中可以看出,我可以打印矩阵的所有元素。

示例输入:

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++;
            }
        }
    }
}

【问题讨论】:

  • 您的代码只是从文件中读取,并没有保存任何内容...? IE。你需要一个StreamWriter 或类似的东西来写一个文件。 (msdn.microsoft.com/en-us/library/… ) 但是,我真的不明白您为什么要从文件中读取某些内容只是为了再次保存它。
  • 哪里抛出的错误?

标签: c# arrays matrix


【解决方案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】:

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

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

    来源:MSDN

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        您的直接问题是您的代码在读取每一行后不会将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];
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2018-05-01
          • 1970-01-01
          • 2012-02-27
          • 1970-01-01
          • 2015-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多