[英]Reading from text file into an array
我正在尝试将用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();
}
};
grid在头文件中定义为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)重新打印该数组。 当前,无论测试图文件中有什么内容,它都会读取测试图文件并打印全零。
如果我了解您的问题:您的解析会从整行开始设置值,而整行应该只包含一位数字...
int tnum = atoi(line.c_str());
grid[i][k] = tnum;
可以通过以下方式将数字(ASCII转换为int / byte / ...):
grid[i][k] = line[k] - '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;
}
}
再次查看您的代码。 尝试查看实际所说的内容,而不是您希望的内容
int tnum = atoi(line.c_str());
您明确希望该行依次读取该行上的五十个数字。 但这并没有说明。 它试图将整行变成整数(并尝试执行五十次)。
由于您的数字是个位数,因此您实际上需要简单得多的东西
int tnum = line[k] - '0';
通过说line [k],您将在每次循环中得到一个不同的数字(因为k每次循环都增加)。 - '0'
位只是将字符转换为整数的一个技巧。 看看您是否可以知道它是如何工作的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.