Бит сбоя ifstream устанавливается неуверенно почему - PullRequest
0 голосов
/ 27 марта 2012

Может быть, видение проблемы поможет вам всем немного:

https://ws.onehub.com/files/nzvrbj4s

Снимки экрана: https://ws.onehub.com/files/9rw3li12 https://ws.onehub.com/files/37ggbfio

Это демонстрационный exe-файл.

WASD для перемещения игрока мышь, чтобы прицелиться щелкните левой кнопкой мыши, чтобы стрелять R для перезагрузки M для создания монстра (у меня есть одна точка появления в игре, которая выплевывает 5 монстров 3 живыми в момент времени максимум на точку появления)

Я загружаю данные монстров из файла, который содержит следующее:

Spider_Walk/</p> <pre><code>12 Spider_Attack/ 1 Spider_Die/ 9 3 17 32 5 2 28 32 8 1 48 32 15 1

Я проверяю файл каждый раз, когда порождаю паука, для данных зон попадания и путей к файлам для анимации. Я не перезагружаю анимации каждый раз из-за класса менеджера ресурсов, который предотвращает двойную загрузку нескольких анимаций. В настоящее время я могу породить много монстров, но затем неожиданно, если поток установит для меня бит неудачи, и я рухну. Я пытаюсь понять, почему устанавливается мой бит сбоя.

Мой вывод:

(1)LOAD FILE IS BAD! FLAGS SET</p> <pre><code>EOF: 0 BAD: 0 FAIL: 1 FILENAME.c_str(): gfx/Spider/Spider.txt

Любой совет был бы полезен в тот момент, когда я подумываю о создании информационного класса для монстров и добавлении его в менеджер ресурсов для загрузки данных монстров только один раз. Я просто боюсь, что эта неудача - вершина айсберга, и скрывается нечто гораздо большее.

Самый маленький фрагмент кода, который, вероятно, в конечном итоге воспроизведет проблему.

</p> <p>ifstream load_file;</p> <p>load_file.open(filename.c_str());</p> <p>if(!load_file.good())allegro_message("(1) LOAD FILE IS BAD! FLAGS SET\n EOF: %i \n BAD: %i \n FAIL: %i \n FILENAME.c_str(): %s", load_file.eof(), load_file.bad(), load_file.fail(), filename.c_str());</p> <p>

ПОЛНЫЙ КОД КОНСТРУКТОРА СЛЕДУЕТ:

Monster::Monster(string filename,Resource_Manager *nrm)</p> <pre><code>{ rm = nrm; //Class initalizations Draw_Hit_Zones = true; Draw_Health_Bar = true; last_zone_hit = -1; Dieing = false; Time_Of_Death = 0; cur_state = 0; MAGIC = NULL; delay = 100; cur_frame = 0; dr = 0; r = 0; Move_Speed = 10; timer = clock(); Max_Hit_Points = 50; Cur_Hit_Points = Max_Hit_Points; //end class initalizations stringstream ss; string root_path = filename.substr(0,filename.find_last_of("/\\")+1); // /gfx/Spider/ string load_image_path; string load_mask_path; string temp; ifstream load_file; load_file.open(filename.c_str()); if(!load_file.good())allegro_message("(1) LOAD FILE IS BAD! FLAGS SET\n EOF: %i \n BAD: %i \n FAIL: %i \n FILENAME.c_str(): %s", load_file.eof(),load_file.bad(),load_file.fail(),filename.c_str()); load_file>>temp>>W_num_frames; W_ANI.assign(root_path); W_ANI.append(temp); load_file>>temp>>A_num_frames; A_ANI.assign(root_path); A_ANI.append(temp); load_file>>temp>>D_num_frames; D_ANI.assign(root_path); D_ANI.append(temp); if(!load_file.good())allegro_message("(2)LOAD FILE IS BAD! FLAGS SET\n EOF: %i \n BAD: %i \n FAIL: %i", load_file.eof(),load_file.bad(),load_file.fail()); rm->Load_Sprite(W_ANI,W_ANI); rm->Load_Sprite(A_ANI,A_ANI); rm->Load_Sprite(D_ANI,D_ANI); magic_number = (int)ceil(sqrt(rm->Get_Sprite(W_ANI,0)->w*rm->Get_Sprite(W_ANI,0)->w + rm->Get_Sprite(W_ANI,0)->h*rm->Get_Sprite(W_ANI,0)->h)); load_file>>num_col; Hit_Zones = new C_Circ*[num_col]; multipliers = new int[num_col]; int cx,cy,cr; for(int lcv = 0;lcv < num_col;lcv++) { load_file>>cx>>cy>>cr>>multipliers[lcv]; Hit_Zones[lcv] = new C_Circ(cx+(magic_number-rm->Get_Sprite(W_ANI,0)->w)/2,cy+(magic_number-rm->Get_Sprite(W_ANI,0)->h)/2,cr); } Master_Hit_Zone = new C_Rect(x - (rm->Get_Sprite(W_ANI,0)->w/2),y - (rm->Get_Sprite(W_ANI,0)->h/2),rm->Get_Sprite(W_ANI,0)->w,rm->Get_Sprite(W_ANI,0)->h); load_file.close(); }

1 Ответ

0 голосов
/ 27 марта 2012

Это терпит неудачу на открытии.Когда вы говорите «порождение», я предполагаю, что вы имеете в виду разные темы, а не новые процессы.Я подозреваю, что у вас заканчиваются файловые дескрипторы, поскольку существует ограничение на количество открытых файлов, которые может иметь данный процесс.

При сбое открытия устанавливается глобальное значение ERRNO.Вы можете использовать C ++ в этом (используя strerror (errno)) или просто использовать perror (), чтобы увидеть, была ли это проблема.

...