Caricamento di testo da un file in una matrice a 2 dimensioni (C ++)
-
18-09-2019 - |
Domanda
Sto facendo un gioco e ho memorizzato i dati della mappa in un array a 2 dimensioni di dimensioni [34] [10]. Originariamente ho generato mappa utilizzando una semplice funzione per riempire l'array e salvato questi dati in un file utilizzando il seguente codice:
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();
Questo genera un file di testo che sembra qualcosa di simile a come lo voglio a. Tuttavia, quando provo a leggere di nuovo in utilizzando il seguente codice, ottengo un carico di violazioni di accesso e si blocca in fase di esecuzione:
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;
}
Qualcuno sa qual è il problema?
Soluzione
while (!myFile.eof())
{
myFile.getline(line, MAP_WIDTH);
dovrebbe essere:
while ( myFile.getline(line, MAP_WIDTH) )
{
Sarebbe tuttavia più sicuro di leggere in uno std :: string:
string line:
while ( getline( myFile, line ) )
{
Si potrebbe anche voler leggere il mio blog su questo argomento, a http://punchlet.wordpress.com .
Altri suggerimenti
Ya Ci tornerò sicuramente in crash perché si sta facendo male qui.
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
Supponiamo e MAP_WIDTH = 6 ;
E devi sapere che array in C / C ++ è importante fila in modo che quando si tenta di accedere
m_acMapData [4] [0] sarebbe accedere alla memoria di fuori della sua portata.
Quindi, fare qualcosa di simile:
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';
}