TextReader.Read() 没有返回正确的整数?

TextReader.Read() not returning correct integer?

所以理论上我的方法应该有效,我只是没有得到预期的结果。

我有一个函数可以创建一个新的 TextReader class,从我的文本文件中读取一个字符 (int) 并将其添加到一个列表中。

文本文件数据如下所示 (48 x 30):

111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111100000000001111111111000000111111111 111111110000000000000000000000000000000011111111 100000000000000000000000000000000000000001111111 000000000000001111111111111111111111000001111111 100000001111111111111111111112211221000001111111 100000111111122112211221122111111111000001111111 111111111221111111111111111112211110000011111111 111112211111111111111111111111111100000111221111 122111111111111122111100000000000000001111111111 111111111111111111100000000000000000011111111111 111111111111111111000000000000000001112211111111 111111111111221110000001111110000111111111111111 111111111111111100000111112211111122111111111111 111111112211110000001122111111221111111111111111 111122111111000000011111111111111111112211221111 111111110000000011111111112211111111111111111111 111111000000001111221111111111221122111100000011 111111000000011111111111000001111111110000000001 111111100000112211111100000000000000000000000001 111111110000111111100000000000000000000000000011 111111111000011100000000000000000000000011111111 111111111100000000000000111111111110001111111111 111111111110000000000011111111111111111111111111 111111111111100000111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111

我的方法如下:

private void LoadReferenceMap(string FileName)
    {
        FileName = Path.Combine(Environment.CurrentDirectory, FileName);
        List<int> ArrayMapValues = new List<int>();

            if (File.Exists(FileName))
            {
                // Create a new stream to write to the file
                using (TextReader reader = File.OpenText(FileName))
                {
                    for (int i = 0; i < 48; i++)
                    {
                        for (int j = 0; j < 30; j++)
                        {
                            int x = reader.Read();

                            if (x == -1)
                                break;

                            ArrayMapValues.Add(x);
                        }
                    }
                }

                level.SetFieldMap(ArrayMapValues);
            }
    }

Returns:

如您所见,一旦它到达第一行的末尾 Read() returns 13,然后是 10,然后再移动到下一行?

这是因为您需要将您得到的符号转换为 char,像这样:

(char)sr.Read();

之后,您可以使用不同的方法将其解析为 int,例如:

int.Parse(((char)sr.Read()).ToString());

More information on MSDN.

As you can see once it reaches the end of the first line Read() returns 13 and then 10 before moving on to the next row?

.NET 中的换行符如下所示:\r\n,而不是 \n(检查 Environment.NewLine 属性。

一种不同的方法,可以消除将字符转换为整数和跳过 Environment.NewLine 个字符的问题

private void LoadReferenceMap(string FileName)
{
    List<int> ArrayMapValues = new List<int>();

    if (File.Exists(FileName))
    {
        foreach(string line in File.ReadLines(FileName))
        {
            var lineMap = line.ToCharArray()
                              .Select(x => Convert.ToInt32(x.ToString()));
            ArrayMapValues.AddRange(lineMap);
        }
        level.SetFieldMap(ArrayMapValues);
    }
}

文件很小,所以将一行作为字符串读取似乎很方便(这删除了 ​​Environment.NewLine),处理将其转换为 char 数组并将转换应用于整数的行每个字符。最后,单行的整数列表可以添加到所有文件的整数列表中。

我没有对单行的长度(48 个字符)和总行数(30)插入任何检查,因为你说每个文件都有这种格式。但是,在加载的总行数及其长度上添加一个小检查应该非常简单。

实际的文本文件中有换行符。这意味着一旦您阅读了前 48 个字符,文件中的下一个字符就是换行符。在这种情况下,它是一个标准的 windows 新行,它是一个 Carriage Return(字符 13),后跟一个 Line Feed(字符 10)。

您需要以某种方式处理代码中的这些换行符。我首选的方法是上面 Steve 概述的方法(使用 File.ReadAllLines)。您也可以在每组 48 个字符读取的末尾检查 13/10 字符组合。需要注意的一件事是,某些系统仅使用换行而不使用回车 return 来指示换行。根据这些文件的来源,您可能需要编写一些代码来处理可能的不同换行符。使用 ReadAllLines 会让其他东西处理这个问题,尽管使用 reader.ReadLine()

如果您还不确定为什么它是 returning 49 而不是 1,那么您需要了解字符编码。该文件存储为由读取程序解释的字节。在这种情况下,您将字符的值作为整数读出(这是 .NET 内部存储它们的方式)。您需要将其转换为字符。在这种情况下,您可以转换为 char(即 (char)x)。这将 return 一个 '1' 的字符。如果您希望将其作为整数,则需要使用 Integer.Parse 将文本解析为整数。