所以我的方法应该在理论上有效,我只是没有得到预期的结果。
我有一个创建新TextReader类的函数,从我的文本文件中读取一个字符(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);
}
}
返回:
正如你所看到的那样,一旦它到达第一行的末尾,Read()会返回13然后再返回10,然后再转到下一行吗?
答案 0 :(得分: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)的检查,因为你说每个文件都有这种格式。但是,对加载的总行数及其长度进行小幅检查应该非常简单。
答案 1 :(得分:2)
这是因为您需要将您拥有的符号转换为char
,如下所示:
(char)sr.Read();
之后,您可以使用不同的方法将其解析为int
,例如:
int.Parse(((char)sr.Read()).ToString());
正如你所看到的那样,一旦它到达第一行的末尾,Read()会返回13然后再返回10,然后再转到下一行吗?
.NET中的换行符如下所示:\r\n
,而不是\n
(检查Environment.NewLine
属性。
答案 2 :(得分:1)
实际的文本文件中包含换行符。这意味着一旦你读完前48个字符,文件中的下一个就是换行符。在这种情况下,它是标准的Windows新行,它是回车符(字符13),后跟换行符(字符10)。
您需要以某种方式处理代码中的这些换行符。我这样做的首选方式是Steve上面概述的方法(使用File.ReadAllLines
)。您可以选择在每组48个字符读取结束时检查13/10字符组合。但有一点需要注意的是,有些系统只使用换行而没有回车来指示新行。根据这些文件的来源,您可能需要编写一些代码来处理可能的不同换行符。使用ReadAllLines
会让其他问题处理此问题,就像使用reader.ReadLine()
如果您还不确定为什么它返回49而不是1,那么您需要了解字符编码。该文件存储为由读取程序解释的字节。在这种情况下,您将字符的值读出为整数(这是.NET在内部存储它们的方式)。您需要将其转换为角色。在这种情况下,您可以转换为char(即(char)x
)。然后,这将返回'1'
的char。如果您希望将其作为整数,则需要使用Integer.Parse
将文本解析为整数。