嘿伙计我试图能够从文本文件中保存一个数组,但我最终试图弄清楚如何保存它。从文本文件中可以看出,我可以打印矩阵的所有元素。
示例输入:
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++;
}
}
}
}
答案 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)
答案 3 :(得分:0)
您似乎在while循环中创建了numbersInt实例。这意味着每次循环都会重新创建数组,当循环退出时,数组将会丢失。将numberInt的声明移到while循环之外。