0

我正在尝试将我用 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 文件中有什么。

4

3 回答 3

1

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

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

将数字(ASCII 转换为 int/byte/... 可以通过以下方式完成:

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

(也许需要一些铸造。)

于 2011-08-27T19:08:52.357 回答
0

在内部循环中,您atoi每次都使用该行的全部内容进行调用。由于该行有 50 个字符长,atoi因此无法将其转换为 an int(an 可表示的最大值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;
    }
}
于 2011-08-27T19:09:50.233 回答
0

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

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

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

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

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

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

于 2011-08-27T19:16:58.970 回答