程序在读取文件时卡住.得到的功能

program stuck when reading file on.get function

本文关键字:功能 读取 文件 程序      更新时间:2023-10-16

我正在win32上创建一个程序,程序停止响应。get函数,我不知道该怎么办,我认为问题是std::ifstream inFile;,但我需要它在主程序之外,所以我可以在任何地方使用它,例如这里我在WM_CREATE中使用inFile,也在WM_KEYDOWN中使用inFile,并在窗口关闭时关闭文件。有可能做到吗?

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;

如果蒸汽在while循环中进入error/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] ==';');

您的问题是您没有初始化ij。尝试将它们初始化为0。而且,您可能希望在循环中更新它们,这样您就不会连续地将字符存储在同一元素中。

那么你需要在绘制循环之前将ij重新初始化为0。然而,绘画通常是在WM_PAINT完成的(我甚至不确定它会在WM_CREATE工作)