0

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

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

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

111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111100000000001111111111000000111111111 111111110000000000000000000000000000000011111111 100000000000000000000000000000000000000001111111 000000000000001111111111111111111111000001111111 100000001111111111111111111112211221000001111111 100000111111122112211221122111111111000001111111 111111111221111111111111111112211110000011111111 111112211111111111111111111111111100000111221111 122111111111111122111100000000000000001111111111 111111111111111111100000000000000000011111111111 111111111111111111000000000000000001112211111111 111111111111221110000001111110000111111111111111 111111111111111100000111112211111122111111111111 111111112211110000001122111111221111111111111111111122111111000000011111111111111111112211221111 111111110000000011111111112211111111111111111111 111111000000001111221111111111221122111100000011 111111000000011111111111000001111111110000000001 111111100000112211111100000000000000000000000001 111111110000111111100000000000000000000000000011 111111111000011100000000000000000000000011111111 111111111100000000000000111111111110001111111111 111111111110000000000011111111111111111111111111 111111111111100000111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111111111000000011111111111000001111111110000000001 111111100000112211111100000000000000000000000001 111111110000111111100000000000000000000000000011 111111111000011100000000000000000000000011111111 111111111100000000000000111111111110001111111111 111111111110000000000011111111111111111111111111 111111111111100000111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111111111000000011111111111000001111111110000000001 111111100000112211111100000000000000000000000001 111111110000111111100000000000000000000000000011 111111111000011100000000000000000000000011111111 111111111100000000000000111111111110001111111111 111111111110000000000011111111111111111111111111 111111111111100000111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111成11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111成

我的方法如下:

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);
            }
    }

回报:

在此处输入图像描述

正如您所看到的,一旦到达第一行的末尾,Read() 返回 13,然后返回 10,然后再继续下一行?

4

3 回答 3

4

一种不同的方法,它消除了将字符转换为整数和跳过 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 数组的行并将转换应用于每个 char 的整数。最后,可以将单行的整数列表添加到所有文件的整数列表中。

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

于 2015-01-24T15:45:42.593 回答
2

这是因为您需要将您拥有的符号转换为char,如下所示:

(char)sr.Read();

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

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

有关 MSDN 的更多信息

正如您所看到的,一旦到达第一行的末尾,Read() 返回 13,然后返回 10,然后再继续下一行?

.NET 中的换行符如下所示:\r\n,而不是\n(Check the Environment.NewLineproperty.

于 2015-01-24T15:05:50.003 回答
1

实际的文本文件中有换行符。这意味着一旦您读取了前 48 个字符,文件中的下一个内容就是换行符。在这种情况下,它是一个标准的 windows 换行符,它是一个回车(字符 13),后跟一个换行符(字符 10)。

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

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

于 2015-01-24T16:09:57.860 回答