从文本文件读取到数组

时间:2011-08-27 18:55:52

标签: c++ arrays newline curses

我正在尝试将我用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”);

之后

我只是想将单个数字数字捕获到数组中,然后重新打印该数组(使用curses)。目前,无论testmap文件中是什么,它都会读取testmap文件并打印全部零。

3 个答案:

答案 0 :(得分:1)

如果我理解你的问题:你的解析设置了整个行的值,只有一个数字应该...

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

翻译数字(ASCII到int / byte / ...可以这样做:

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

(也许需要一些演员。)

答案 1 :(得分:0)

在内部循环中,您每次都使用该行的完整内容调用atoi。由于该行长度为50个字符,atoi无法将其转换为intint的最大可表示值为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;
    }
}

答案 2 :(得分:0)

再次查看您的代码。试着看看实际上说的是什么,而不是你希望它说什么

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

您清除想要该行依次读取该行上的五十个数字中的每一个。但它并没有这么说。它试图将整个行变成一个整数(并尝试这样做五十次)。

由于你的数字是个位数,你实际上需要更简单的东西

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

通过说行[k],每次循环都会得到一个不同的数字(因为每次循环时k都会增加)。 - '0'位只是将字符转换为整数的技巧。看看你是否可以弄清楚它是如何工作的。