2012-03-26 5 views
0

어쩌면이 문제를 보는 것은 모두 약간의 도움을 왜 확신이 설정되는 실패 :ifstream이 비트

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

스크린 샷을 : https://ws.onehub.com/files/9rw3li12 https://ws.onehub.com/files/37ggbfio

이것은 데모 exe 파일입니다. 마우스를 목표로 마우스 주위 플레이어를 이동

WASD 괴물 (나는 한 번에 최대 살아 3 5 괴물을 뱉어 게임에서 하나의 스폰 포인트를 만들기 M을 다시로드 R을 발사 마우스 왼쪽 버튼으로 클릭

Spider_Walk/

12 

Spider_Attack/ 

1 

Spider_Die/ 

9 

3 

17 32 5 2 

28 32 8 1 

48 32 15 1 

은 내가 히트 영역의 데이터에 대한 거미를 생성 할 때마다 파일을 확인하십시오

) 스폰 포인트에 나는 다음이 포함 된 파일에 괴물 데이터를로드하고 애니메이션 파일 경로. 여러 애니메이션이 이중으로로드되는 것을 막는 자원 관리자 클래스로 인해 매번 애니메이션을 다시로드하지 않습니다. 현재 많은 수의 몬스터를 스폰 할 수 있지만, 파란색 ifstream에서 나에게 실패 비트를 설정하면 충돌이 발생합니다. 내 실패 비트가 설정되는 이유를 이해하려고합니다.

내 출력은 다음과 같습니다

(1)LOAD FILE IS BAD! FLAGS SET

EOF: 0 
BAD: 0 
FAIL: 1 
FILENAME.c_str(): gfx/Spider/Spider.txt 

어떤 조언을 나는 몬스터 정보 클래스를 만들기 만 부하 몬스터 데이터 자원 관리자 한 시간을 퍼팅에 대해 생각하고있는 순간에 도움이 될 것입니다. 나는이 실패가 빙산의 일각이며 훨씬 더 큰 것이 숨어 있다는 것을 두려워합니다.

아마도 결국 문제를 재현 할 수있는 가장 작은 코드 조각입니다.

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());

FULL 생성자 코드는 다음 : 그것은 오픈에 실패한 것

Monster::Monster(string filename,Resource_Manager *nrm)

{ 

    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(); 
} 

+2

너무 많은 코드입니다. 여전히 문제를 일으키는 코드 샘플을 줄이는 것이 좋습니다. Stack Overflow에 대한 더 많은 도움을 얻을 것이며 프로세스에서 직접 솔루션을 찾을 수도 있습니다. – meagar

+0

파일을 열 때 fstream이 실패합니다. 파일이 존재하면, 프로그램은 첫 번째 50 또는 60 번 말한대로 잘 액세스 할 수 있습니다. –

답변

0

. 당신이 스폰한다고 말하면, 나는 당신이 새로운 프로세스가 아니라 다른 스레드를 의미한다고 가정합니다. 주어진 프로세스가 가질 수있는 열린 파일의 수에 제한이 있기 때문에 파일 기술자가 부족한 것 같습니다.

열기가 실패하면 전역 값 ERRNO가 설정됩니다. C++을 사용하거나 (strerror (errno)를 사용하여) C++을 사용하거나, perror()를 사용하여 이것이 문제인지 여부를 확인할 수 있습니다.

+0

실제로 게임 스폰의 관점에서 스레드조차도 괴물을 만드는 것을 의미하지 않습니다. 단일 스레드 프로그램이지만이 게임의 멀티 플레이어 측에서 멀티 스레딩을 사용하고 잠재적으로 문제가 될 수 있으므로이 점을 명심해야합니다. –

+0

하지만 요점은 여러 프로세스를 사용하지 않고 파일 설명자가 부족하다는 것입니다. – DRVic

+0

나는이 프로그램에서 다중 프로세스를 사용하지 않는다. 하나의 스레드 하나의 프로세스. 내가 잘못 읽었을 때 .... 내가 load_file.close()를 통해 File descriptor를 닫으면 어떻게 될까? –

관련 문제