c#读取文件

本文关键字:文件 读取 | 更新日期: 2023-09-27 18:12:08

我有两个函数:

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

当它正确保存数据时,它不会读取数据。正在读取随机值(至少不是文件中的值)

我做错了什么?

c#读取文件

即使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分隔每行上的值。这种方法的优点是,您可以在电子表格程序或文本编辑器中编辑文件。

当从流中逐字节读取值时,stream . read()返回当前字符的ASCII码,因此您首先需要将其转换为常规字符,然后将其解析为int型。所以我们不用:

map[j, i] = (int)stream.Read();

你需要做的是:

char c = (char)stream.Read();
map[j, i] = Int32.Parse(c.ToString());

应该可以了