توقف البرنامج عند قراءة وظيفة الملف 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 في حلقة while الخاصة بك، 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] ==';');