从文件中读取int类型返回ASCII

本文关键字:类型 返回 ASCII int 读取 文件 | 更新日期: 2023-09-27 18:19:23

我目前正在制作一款游戏,但我似乎有问题从文本文件读取值。由于某种原因,当我读取该值时,它给我的是该值的ASCII码,而不是我将其写入文件时的实际值本身。我试过每一个ASCII转换函数和字符串转换函数,但我似乎就是弄不清楚。

我使用一个二维整数数组。我使用嵌套的for循环将每个元素写入文件。我已经查看了文件,值是正确的,但我不明白为什么它返回ASCII码。下面是我用来写入和读取文件的代码:

写入文件:

for (int i = 0; i < level.MaxRows(); i++)
{
    for (int j = 0; j < level.MaxCols(); j++)
    {
        fileWrite.Write(level.GetValueAtIndex(i, j) + " ");
        //Console.WriteLine(level.GetValueAtIndex(i, j));
    }
    //add new line
    fileWrite.WriteLine();
}
下面是我从文件中读取值的代码:
string str = "";
int iter = 0;    //used to iterate in each column of array
for (int i = 0; i < level.MaxRows(); i++)
{
    iter = 0;
    //TODO: For some reason, the file is returning ASCII code, convert to int
    //keep reading characters until a space is reached.
    str = fileRead.ReadLine();
    //take the above string and extract the values from it.
    //Place each value in the level.
    foreach (char id in str)
    {
        if (id != ' ')
        {
            //convert id to an int
            num = (int)id;
            level.ChangeTile(i, iter, num);
            iter++;
        }
    }

这是我用来读取值的循环的最新版本。读取其他值是可以的;只是当我到达数组时,事情就出错了。我想我的问题是,为什么会发生ASCII转换?如果我能算出来,我就能解决这个问题。我使用XNA 4来制作游戏

从文件中读取int类型返回ASCII

这是发生ascii转换的地方:

fileWrite.Write(level.GetValueAtIndex(i, j) + " ");

+操作符隐式地将GetValueAtIndex返回的整数转换为字符串,因为您正在将其添加到字符串中(真的,您期望发生什么?)

此外,ReadLine方法返回一个String,所以我不确定为什么您期望在这里神奇地返回一个数值。如果您想写入二进制数据,请查看BinaryWriter

这是将字符转换为字符代码的地方:

num = (int)id;

id变量是一个char,将其转换为int会得到字符代码,而不是数值。

同样,这将转换单个字符,而不是整数。例如,如果您的文本文件中有"12 34 56 ",则它将获得1,2,3,4,5和6的代码,而不是12,34和56。

您想要用空格分隔行,并解析每个子字符串:

foreach (string id in str.Split(' ')) {
  if (id.Length > 0) {
    num = Int32.Parse(id);
    level.ChangeTile(i, iter, num);
    iter++;
  }
}

Update:我保留了旧代码(如下),假设每行有一个记录,但我也添加了一种不同的方法来处理一行中的多个整数,以空格分隔。

一行多条记录

str = fileRead.ReadLine();
string[] values = str.Split(new Char[] {' '});
foreach (string value in values)
{
    int testNum;
    if (Int32.TryParse(str, out testnum))
    {
        // again, not sure how you're using iter here
        level.ChangeTile(i, iter, num);
    }
}

一行一条

str = fileRead.ReadLine();
int testNum;
if (Int32.TryParse(str, out testnum))
{
    // however, I'm not sure how you're using iter here; if it's related to 
    // parsing the string, you'll probably need to do something else
    level.ChangeTile(i, iter, num);
}

请注意,如果你一行一行地写出每个整数(也就是说,你是如何通过你在上面的代码中注释出来的WriteLine来完成的),上面应该可以工作。如果您切换回使用WriteLine,这应该可以工作。

你有:

foreach (char id in str)
{
    //convert id to an int
    num = (int)id;

char ASCII码(或者可以被认为是ASCII码;从技术上讲,它是一个unicode代码点,但假设您正在编写ANSI或低值UTF-8,则大致可比较)。

你想要的是:

num = (int)(id - '0');

This:

fileWrite.Write(level.GetValueAtIndex(i, j) + " ");

level.GetValueAtIndex(i, j)返回的int转换为字符串。假设函数为特定的ij返回值5,则将"5 "写入文件。

当你读它被读成一个字符串,它由字符组成,你得到5的ASCII码,当你把它简单地转换为int。你需要的是:

foreach (char id in str)
{
    if (id != ' ')
    {
        //convert id to an int
        num = (int)(id - '0'); // subtract the ASCII value for 0 from your current id
        level.ChangeTile(i, iter, num);
        iter++;
    }
}

然而,这只适用于当你只打算有个位数整数(只有0 - 9),这可能更好:

foreach (var cell in fileRead.ReadLine().Split(' '))
{
     num = Int.Parse(cell);
     level.ChangeTile(i, iter, num);
     iter++;
}