programme bloqué lors de la lecture du fichier fonction on.get
Question
Je crée un programme sur win32, le programme ne répond plus sur la fonction .get, je ne sais pas quoi faire d'autre, je pense que le problème vient de std::ifstream inFile;
mais j'en ai besoin en dehors du programme principal, donc je peux l'utiliser partout, par exemple ici j'utilise inFile dans WM_CREATE et aussi dans WM_KEYDOWN et ferme le fichier lorsque la fenêtre se ferme.est-ce possible de le faire ?
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;
La solution
Votre problème est que vous n'initialisez pas i
et j
.Essayez de les initialiser à 0
.De plus, vous souhaitez probablement les mettre à jour dans votre boucle afin de ne pas stocker continuellement le caractère dans le même élément.
Ensuite, vous devez réinitialiser i
et j
à 0
avant la boucle de peinture.Cependant, la peinture est généralement réalisée dans WM_PAINT
(je ne suis même pas sûr que ça fonctionnera WM_CREATE
.)
Autres conseils
Si le steam entre dans l'état error/eof dans votre boucle while, Map[j][i]
ne sera jamais réglé sur ';'
ce qui donne une boucle sans 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] ==';');