2009-12-09 81 views
2

我正在制作游戏,并将地图数据存储在大小为[34] [10]的二维数组中。本来我生成使用一个简单的功能,填补了阵列的地图,并使用下面的代码此数据保存到一个文件:将文本从文件加载到二维数组中(C++)

ofstream myFile; 
myFile.open("map.txt"); 

for (int y = 0 ; y < MAP_HEIGHT ; ++y) 
{ 
    for (int x = 0 ; x < MAP_WIDTH ; ++x) 
    { 
     myFile << m_acMapData[x][y]; 
    } 
    myFile << '\n'; 
} 

myFile.close(); 

它输出一个文本文件,它看起来像我希望的方式。然而,当我尝试重新使用下面的代码读它,我得到的访问冲突的负载,它在运行时崩溃:

ifstream myFile; 
int i=0; 
int j=0; 
char line[MAP_WIDTH]; 

myFile.open("map.txt"); 
while (!myFile.eof()) 
{ 
    myFile.getline(line, MAP_WIDTH); 
    for (i=0; i<MAP_WIDTH; i++) 
    { 
     m_acMapData[i][j] = line[i]; 
    } 
    ++j; 
    cout << line; 
} 

有谁知道问题是什么?

+0

什么'm_acMapData',它是如何声明和初始化? – atzz 2009-12-09 10:25:04

回答

3
while (!myFile.eof()) 
{ 
     myFile.getline(line, MAP_WIDTH); 

应该是:

while (myFile.getline(line, MAP_WIDTH)) 
{ 

这将然而是更安全的读入的std :: string:

string line: 
while (getline(myFile, line)) 
{ 

您可能还希望阅读我的博客在这个问题上,在http://punchlet.wordpress.com

0

雅我会肯定崩溃,因为你在这里做错了。

ofstream myFile; 
myFile.open("map.txt"); 

for (int y = 0 ; y < MAP_HEIGHT ; ++y) 
{ 
    for (int x = 0 ; x < MAP_WIDTH ; ++x) 
    { 
      myFile << m_acMapData[x][y]; 
    } 
    myFile << '\n'; 
} 
myFile.close(); 

假设MAP_HEIGHT = 3MAP_WIDTH = 6 ;

而且你必须知道在C/C数组++是一排大,所以当你试图进出

m_acMapData [4] [0]会访问内存其范围。

所以做这样的事情:

for (int y = 0 ; y < MAP_HEIGHT ; ++y) 
{ 
    for (int x = 0 ; x < MAP_WIDTH ; ++x) 
    { 
      myFile << m_acMapData[y][x]; // here to be changed 
    } 

    myFile << '\n'; 
} 
相关问题