我有两个功能:
public void SaveMap()
{
StreamWriter stream = new StreamWriter("file.txt");
for (int j = 0; j < GameConstants.MapMaxTilesX; j++)
{
for (int i = 0; i < GameConstants.MapMaxTilesY; i++)
{
stream.Write( map[j,i] );
}
}
stream.Close();
}
public void LoadMap()
{
StreamReader stream = new StreamReader("file.txt");
for (int j = 0; j < GameConstants.MapMaxTilesX; j++)
{
for (int i = 0; i < GameConstants.MapMaxTilesY; i++)
{
map[j, i] = (int)stream.Read();
}
}
stream.Close();
}
由于它正确保存数据,因此无法读取数据。正在读取随机值(至少不是文件中的那些)
我错了什么?
答案 0 :(得分:4)
即使StreamReader.Read()
方法返回int
,它也不会从文件中读取int
。相反,它返回一个字符。类型为int
的原因是它可以用-1标记文件结束条件。这是旧C风格的延续。
如果您想从文件中读取字符,可以调用Read()
并测试返回值-1。如果返回-1以外的值,则将其转换为char
。然后你将负责以有意义的方式将角色放在一起。但是有更简单的方法来完成你想要完成的任务!
要执行您想要执行的操作,您必须以某种方式分隔整数值,然后解析文件中的字符串,或者使用BinaryWriter / BinaryReader。
也许最简单的方法是每行输入一个值:
...
stream.WriteLine( map[j,i] );
...
map[j, i] = int.Parse(stream.ReadLine());
如果要最小化文件大小,我建议使用BinaryWriter
编写每个int,然后使用BinaryReader.ReadInt32()
方法读取值。如果你这样做,那么该文件的长度将精确4 * GameConstants.MapMaxTilesX * GameConstants.MapMaxTilesY
。
另一种有趣的方法是将地图的每一行写在自己的行上,并使用制表符'\t'
分隔每列。然后,您可以一次读取一行的值,并使用string.Split
分隔每行的值。这种方法的优点是您可以在电子表格程序或文本编辑器中编辑文件。
答案 1 :(得分:1)
当逐字节地从流中读取值时,Stream.Read()返回当前字符的ASCII代码,因此您首先需要将其转换为常规字符,然后将其解析为int。所以不要这样做:
map[j, i] = (int)stream.Read();
你需要这样做:
char c = (char)stream.Read();
map[j, i] = Int32.Parse(c.ToString());
这应该可以解决问题。