我无法对此问题应用任何解决方案。这一行发生异常:currentMap [row,col] = Int32.Parse(s);我想要做的是将此方法传递给存储数字行的特定文件,如下所示:
1,1,1
1,0,1
1,1,1
然后我希望每个数字都存储在返回的int [,] currentMap中。我使用的文件不包含大数字。我认为我创建的数组的大小是正确的,所以我不明白为什么这不起作用。我习惯在java中使用NextInt做类似的事情,但我找不到任何替代c#。
感谢您的帮助。
private int[,] LoadMapArray(String filename)
{
int[,] currentMap;
int rows = 0;
int cols = 0;
StreamReader sizeReader = new StreamReader(filename);
using (var reader = File.OpenText(filename))
{
while (reader.ReadLine() != null)
{
string line = sizeReader.ReadLine();
cols = line.Length;
rows++;
}
}
currentMap = new int[rows,cols];
StreamReader sr = new StreamReader(filename);
for (int row = 0; row < rows + 1; row++)
{
string line = sr.ReadLine();
string[] split = new string[] {","};
string[] result;
result = line.Split(split, StringSplitOptions.None);
int col = 0;
foreach (string s in result)
{
currentMap[row, col] = Int32.Parse(s);
col++;
}
}
return currentMap;
}
编辑:更改我访问文件的方式后修复了代码。然后我不得不改变它以捕获null:
for (int row = 0; row < rows + 1; row++)
{
string line = sr.ReadLine();
string[] split = new string[] { "," };
string[] result;
if (line != null)
{
result = line.Split(split, StringSplitOptions.None);
int col = 0;
foreach (string s in result)
{
currentMap[row, col] = Int32.Parse(s);
col++;
}
}
}
答案 0 :(得分:2)
不,数组的大小不正确。你在每个循环中读取了两行但是你只增加了行计数器一次。
using (var reader = File.OpenText(filename))
{
string line = string.Empty;
while ((line = reader.ReadLine()) != null)
{
rows++;
}
}
我确信cols计数也不正确,但它不会引发异常,因为你将cols维度的尺寸大于要求。 (你也算一下逗号的空间,而不仅仅是数字)
更简单的方法(如果你的文件不是很大)是使用File.ReadAllLines()
string[] split = new string[] {","};
string[] lines = File.ReadAllLines(filename);
int rows = lines.Length;
int cols = lines[0].Split(split, StringSplitOptions.RemoveEmptyEntries).Count();
currentMap = new int[rows,cols];
for (int row = 0; row < rows; row++)
{
string line = lines(row);
string[] result = line.Split(split, StringSplitOptions.None);
int col = 0;
foreach (string s in result)
{
int value;
Int32.TryParse(s, out value)
currentMap[row, col] = value;
col++;
}
}
现在,整个文件在内存中只有一个磁盘操作,您可以使用内存字符串。应该更改整数的解析以使用Int32.TryParse以避免在检索到的值不是有效整数的情况下发生异常。