对于Int32,值太大或太小。读取和解析文本文件

时间:2014-06-10 09:39:32

标签: c# parsing int streamreader

我无法对此问题应用任何解决方案。这一行发生异常: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++;
                }
            }


        }

1 个答案:

答案 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以避免在检索到的值不是有效整数的情况下发生异常。