从文件中读取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来制作游戏
这是发生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
转换为字符串。假设函数为特定的i
和j
返回值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++;
}