C#读取文件

时间:2011-10-20 21:40:49

标签: c# io

我有两个功能:

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

由于它正确保存数据,因此无法读取数据。正在读取随机值(至少不是文件中的那些)

我错了什么?

2 个答案:

答案 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());

这应该可以解决问题。