programa atascado al leer el archivo en la función on.get
Pregunta
Estoy creando un programa en win32, el programa deja de responder en la función .get, no sé qué hacer más, creo que el problema está en std::ifstream inFile;
pero lo necesito fuera del programa principal, así puedo usarlo en todas partes, por ejemplo aquí uso inFile en WM_CREATE y también en WM_KEYDOWN y cierro el archivo cuando se cierra la ventana.¿es posible hacerlo?
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;
Solución
Tu problema es que no estas inicializando i
y j
.Intente inicializarlos para 0
.Además, probablemente quieras actualizarlos en tu bucle para no almacenar continuamente el carácter en el mismo elemento.
Entonces necesitas reinicializar i
y j
a 0
antes del ciclo de pintura.Sin embargo, la pintura se suele realizar en WM_PAINT
(Ni siquiera estoy seguro de que funcione en WM_CREATE
.)
Otros consejos
Si el vapor entra en estado de error/eof en su ciclo while, Map[j][i]
nunca se configurará para ';'
resultando en un bucle sin fin:
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] ==';');