2009-12-09 2 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

ответ

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

должно быть:

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

Было бы, однако безопаснее читать в станд :: строка:

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 = 3 и MAP_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'; 
} 
Смежные вопросы