我正在尝试将我用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文件并打印全部零。
答案 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
无法将其转换为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;
}
}
答案 2 :(得分:0)
再次查看您的代码。试着看看实际上说的是什么,而不是你希望它说什么
int tnum = atoi(line.c_str());
您清除想要该行依次读取该行上的五十个数字中的每一个。但它并没有这么说。它试图将整个行变成一个整数(并尝试这样做五十次)。
由于你的数字是个位数,你实际上需要更简单的东西
int tnum = line[k] - '0';
通过说行[k],每次循环都会得到一个不同的数字(因为每次循环时k都会增加)。 - '0'
位只是将字符转换为整数的技巧。看看你是否可以弄清楚它是如何工作的。