программа зависла при чтении файла с помощью функции on.get
Вопрос
Создаю программу на win32, программа перестает реагировать на функцию .get, не знаю что еще делать, думаю проблема в std::ifstream inFile;
но мне это нужно вне основной программы, поэтому я могу использовать его везде, например здесь я использую inFile в WM_CREATE, а также в WM_KEYDOWN и закрываю файл при закрытии окна.возможно ли это сделать?
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;
Решение
Ваша проблема в том, что вы не инициализируете i
и j
.Попробуйте инициализировать их 0
.Кроме того, вы, вероятно, захотите обновить их в своем цикле, чтобы не хранить символ постоянно в одном и том же элементе.
Затем вам нужно повторно инициализировать i
и j
к 0
перед циклом рисования.Однако живопись обычно выполняется в WM_PAINT
(Я даже не уверен, что это сработает в WM_CREATE
.)
Другие советы
Если пара входит в ошибку / EOF состояния в вашем цикле, Map[j][i]
не будет установлен на ';'
, что приводит к бесконечной цикле:
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] ==';');
.