【问题标题】:Value was either too large or too small for an Int32. Reading and parsing textfile对于 Int32,值太大或太小。读取和解析文本文件
【发布时间】:2014-06-10 09:39:31
【问题描述】:

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


        }

【问题讨论】:

  • 你有没有试过调试它,看看它坏的时候s的值是多少?
  • 能否提供异常详情?
  • 磁盘上的文件有多大?
  • for (int row = 0; row &lt; rows + 1; row++) 更改为for (int row = 0; row &lt; rows; row++)。现有代码导致 index 超出范围异常,而不是 integer 超出范围。
  • @KrisVandermotten 没有注意到这一点。很好的收获。

标签: c# parsing int streamreader


【解决方案1】:

不,您的数组大小不正确。您在每个循环中读取两行,但仅将行计数器增加一次。

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

【讨论】:

  • 感谢您的好评。我尝试了代码,但仍然遇到同样的问题,所以我去修复了加载文件的方式。原来这是问题所在,所以我对这个毫无意义的帖子感到抱歉。之后,我通过首先检查 line 是否为空来设法让我的原始代码工作。我将把它编辑成我原来的问题。一切仍然正常,即使我的阵列关闭,我也可以从中得到我想要的东西。我会改变它并坚持我的代码,因为我不知道我会制作多大的文本文件。不需要尝试解析,因为我会确保可以解析文本文件本身。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 2011-09-14
  • 2017-06-08
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
相关资源
最近更新 更多