Чтение из текстового файла в массив - PullRequest
0 голосов
/ 27 августа 2011

Я пытаюсь прочитать текстовый файл, который я отредактировал с помощью Vim, в массив.

Текстовый файл 30 * 50 и состоит из однозначных чисел. Я схожу с ума, пытаясь заставить его работать, но я думаю, что у меня проблемы из-за символов новой строки. Вот что я использовал:

Map::Map(char* filename)
{
grid[30][50] = (0);
string line;
ifstream m_file(filename);
if (m_file.is_open())
        {
                while(m_file.good())
                 {
                        for (int i = 0; i < 30; i++)
                        {
                        getline(m_file,line);
                                 for (int k = 0; k < 50; k++)
                                {
                                int tnum = atoi(line.c_str());
                                grid[i][k] = tnum;
                                }
                        }
                }
                m_file.close();
        }
};
Сетка

определяется в заголовочном файле как int grid [30] [50].

Код, который я использую для печати, выглядит следующим образом:

void display_room(int trid[30][50])
{
        for (int i = 0; i < 30; i++)
        {
                for (int k = 0; k < 50; k++)
                {
                        mvprintw(i,k,"%d",trid[i][k]);
                };
        };
};

после вызова Map sMap = Map ("testmap");

Я просто пытаюсь записать однозначные числа в массив и перепечатать этот массив (используя проклятия). В настоящее время он читает файл тестовой карты и печатает все нули, независимо от того, что находится в файле тестовой карты.

Ответы [ 3 ]

1 голос
/ 27 августа 2011

Если я понимаю Ваша проблема: Ваш анализ устанавливает значение из всей строки, где должна быть только цифра ...

int tnum = atoi(line.c_str());
grid[i][k] = tnum;

Перевод цифры (ASCII в int / byte / ...)может быть сделано следующим образом:

grid[i][k] = line[k] - '0';

(Возможно, требуется некоторое количество кастинга.)

0 голосов
/ 27 августа 2011

Посмотрите на свой код еще раз. Попытайтесь увидеть то, что на самом деле говорит, а не то, что вы надеетесь, что оно говорит

int tnum = atoi(line.c_str());

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

Поскольку ваши числа состоят из одной цифры, вам действительно нужно нечто гораздо более простое

int tnum = line[k] - '0';

Говоря строку [k], вы будете получать разные цифры каждый раз вокруг цикла (потому что k увеличивается каждый раз вокруг цикла). Бит - '0' - это всего лишь уловка, чтобы превратить символ в целое число. Посмотри, сможешь ли ты понять, как это работает.

0 голосов
/ 27 августа 2011

Во внутреннем цикле вы каждый раз вызываете atoi с полным содержанием строки. Поскольку строка длиной 50 символов, atoi не может преобразовать ее в int (наибольшее представимое значение на int равно 2147483647, и ваше число, вероятно, больше этого значения). Когда atoi терпит неудачу, он возвращает 0.

То, что вы хотите, это преобразовать каждый символ строки в int. Примерно так:

for (int i = 0; i < 30; i++)
{
    getline(m_file,line);
    for (int k = 0; k < 50; k++)
    {
        // The ASCII character of the digits 0 to 9 have
        // successives values.
        int tnum = line[k] - '0';
        grid[i][k] = tnum;
    }
}
...