Programma bloccato durante la lettura del file on.get Function
Domanda
Sto creando un programma su Win32, il programma smette di rispondere sulla funzione .Get, non so cosa fare altro, penso che il problema sia con std::ifstream inFile;
ma ne ho bisogno al di fuori del programma principale, quindi ioPuò usarlo ovunque, ad esempio qui uso INFile in WM_Create e anche in wm_keydown e chiudere il file quando la finestra si chiude.è possibile fare?
char Map[10][10], c[256];
std::ifstream inFile;
//windProc
case WM_CREATE: {
inFile.open ("Map.txt");
if (!inFile) {
::MessageBox(hwnd, "Failed to open file", "Error", MB_OK);
}
int i,j;
do { //loop for skipping comments
Map[j][i] = inFile.get(); //<---stuck here
if (Map[j][i] ==';') inFile.getline(c, 256);
} while (Map[j][i] ==';');
while (Map[j][i] !=';') { //loop for painting
switch (Map[j][i]) {
//
//paint based on char
//
}
i++;
Map[j][i] = inFile.get();
if (i==10) {j++; i=0;}
}
}
case WM_KEYDOWN: {
//...
inFile.getline(c, 256); // continue reading from file
int j=0; int i=0;
Map[j][i] = inFile.get();
while (Map[j][i] !=';') {
switch (Map[j][i]) {
//
//paint based on char
//
}
i++;
Map[j][i] = inFile.get();
if (i==10) {j++; i=0;}
}
break; }
case WM_DESTROY:
inFile.close();
PostQuitMessage (0);
break;
. Soluzione
Il tuo problema è che non stai inizializzando i
e j
.Prova a inizializzarli su 0
.Inoltre, desideri presumibilmente aggiornarli nel tuo loop in modo da non memorizzare continuamente il personaggio nello stesso elemento.
Quindi è necessario reinizializzare i
e j
a 0
prima del ciclo di pittura.Tuttavia, la verniciatura viene solitamente fatta in WM_PAINT
(non sono nemmeno sicuro che lavorerà in WM_CREATE
.)
Altri suggerimenti
Se il vapore entra nell'errore / stato EOF nel ciclo mentre loop, Map[j][i]
non sarà mai impostato su ';'
con conseguente loop infinito:
do { //loop for skipping comments
Map[j][i] = inFile.get(); //<---stuck here
if (Map[j][i] ==';') inFile.getline(c, 256);
} while (inFile.good() && Map[j][i] ==';');
.