Чтение int из файла возвращает ASCII - PullRequest
2 голосов
/ 05 января 2012

Я сейчас создаю игру, но у меня, похоже, проблемы с чтением значений из текстового файла По какой-то причине, когда я читаю значение, оно дает мне ASCII-код значения, а не фактическое значение, когда я записываю его в файл. Я пробовал все функции преобразования ASCII и функции преобразования строк, но я просто не могу понять это.

Я использую двумерный массив целых чисел. Я использую вложенный цикл для записи каждого элемента в файл. Я посмотрел на файл, и значения верны, но я не понимаю, почему он возвращает код 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, чтобы сделать мою игру.

Ответы [ 5 ]

4 голосов
/ 05 января 2012

Здесь происходит преобразование в ascii:

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

Оператор + неявно преобразует целое число, возвращаемое GetValueAtIndex, в строку, потому что вы добавляете ее в строку (действительно, что вы сделалиожидаете, что произойдет?)

Кроме того, метод ReadLine возвращает String, поэтому я не уверен, почему вы ожидаете, что числовое значение будет волшебным образом возвращаться сюда.Если вы хотите записать двоичные данные, загляните в BinaryWriter

2 голосов
/ 05 января 2012

Здесь вы переводите символы в коды символов:

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++;
  }
}
1 голос
/ 05 января 2012

Обновление: Я сохранил старый код (ниже), предполагая, что в каждой строке была одна запись, но я также добавил другой способ сделать это, который должен работать с несколькими целыми на строке, разделенной пробелом.

Несколько записей в одной строке

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, это должно сработать.

0 голосов
/ 05 января 2012

Это:

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

преобразует int, возвращенное из level.GetValueAtIndex(i, j) в строку. Предполагая, что функция возвращает значение 5 для определенных i и j, вы вводите «5» в файл.

Когда вы затем читаете, он читается как строка, состоящая из символов, и вы получаете код ASCII 5, когда вы просто приводите его к 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++;
}
0 голосов
/ 05 января 2012

У вас есть:

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

A char является кодом ASCII (или может рассматриваться как таковой; технически это кодовая точка Unicode, но это в целом сопоставимо, если вы пишете ANSI или UTF- с низким значением). 8).

То, что вы хотите:

num = (int)(id - '0');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...