programa preso durante a leitura de arquivo.função get
Pergunta
Eu estou criando um programa do win32, o programa pára de responder .obter funcionar, eu não sei o que fazer mais, eu acho que o problema é com std::ifstream inFile;
mas eu preciso dele fora do programa principal, para que eu possa usá-lo em todos os lugares, por exemplo, aqui eu uso inFile em WM_CREATE e também em WM_KEYDOWN e feche o arquivo quando fecha a janela.é possível fazer?
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;
Solução
O seu problema é que você não está inicializando i
e j
.Tente inicializar-los para 0
.Além disso, você provavelmente deseja atualizá-los no seu ciclo, para que você não se continuamente a loja que o personagem do mesmo elemento.
Em seguida, você precisará reinicializar i
e j
para 0
antes que a pintura loop.No entanto, a pintura é feita geralmente em WM_PAINT
(Eu nem tenho certeza de que ele vai trabalhar em WM_CREATE
.)
Outras dicas
Se o vapor entra erro/eof estado em seu loop while, Map[j][i]
não vai ser definida para ';'
resultando em um 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] ==';');