программа зависла при чтении файла с помощью функции on.get

StackOverflow https://stackoverflow.com//questions/24038464

  •  21-12-2019
  •  | 
  •  

Вопрос

Создаю программу на 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] ==';');
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top