2011-08-27 113 views
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]); 
       }; 
     }; 
}; 

调用地图SMAP =地图( “testmap”)之后;

我只是试图将单个数字的数字捕获到数组中,并重新打印该数组(使用curses)。目前,它读取testmap文件,并打印所有的零,不管testmap文件中有什么。

+0

好的。问题。什么问题? –

+0

当它打印数字时,它只打印全零。即使当我更改“testmap”文件中的数字时。 – syl

回答

1

如果我理解你的问题:您解析设置从整条生产线,其中只有一个数字应该是值...

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

翻译数字(ASCII为int /字节/ ...能以这种方式来完成:(也许需要一些铸造)

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

+0

'while(m_file.good())'应该是'if(...)'。否则for循环可能会运行几次。检查文件状态应该在变量i的for循环中。 – erikH

+0

你对减零的建议一开始并不奏效,但我只是改变了一段时间,如果问题解决了!非常感谢你,我一直在为这么简单的事情而奋斗!当我使用cout时,相同的代码可以正常打印,但当我使用curses库时不会。我不确定发生了什么变化。 – syl

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; 
    } 
} 
0

再次查看您的代码。试试,看看什么是真正的说,而不是你希望它说什么

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

您明确希望该行改为每五十号上依次行。但它并没有这么说。它试图将整行行变成一个整数(并试图做50次)。

因为你的数字是个位数,你真正需要的东西要简单得多

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

按说线[K]你每次都会得到一个不同的数字一轮循环(因为K均时间增加一轮循环)。 - '0'位只是将字符转换为整数的一种技巧。看看你是否可以研究它是如何工作的。