2012-03-26 80 views
0

也许看到的问题会帮助你都有点:ifstream的失败位被设置不清楚为什么

​​

屏幕截图: https://ws.onehub.com/files/9rw3li12 https://ws.onehub.com/files/37ggbfio

这是演示exe文件。

WASD移动玩家周围 鼠标瞄准 鼠标左键单击射击 R重新载入 M至创建一个怪物(我在那吐出了5个怪物3活着时最大的游戏一个重生点

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 2012-03-26 23:38:27

+0

打开文件时fstream失败。该文件存在,程序可以很好地访问它,第一次说50或60次,然后它只是失败。 – 2012-03-27 00:01:46

回答

0

它的失败在开放。当你说产卵时,我假设你是指不同的线程,而不是新的进程。我怀疑你的文件描述符已经用完,因为对于给定进程可能具有的打开文件数量有限制。

当打开失败时,它会设置全局值ERRNO。你可以用C++来看它(使用strerror(errno)),或者使用perror()来查看这是否是问题。

+0

实际上,即使在游戏派生方面甚至没有意味着创造一个怪物。单线程程序,但我必须记住这一点,因为在这个游戏的多人游戏方面,我将使用多线程,这可能是一个问题。 – 2012-03-27 00:10:34

+0

但关键是你没有使用多个进程,而且你很可能会用完文件描述符。 – DRVic 2012-03-27 00:20:47

+0

我目前没有在这个程序中使用多个进程。一个线程一个进程。等待我误读了....如果每次我通过load_file.close()关闭文件描述符,我将如何用完? – 2012-03-27 00:25:04

相关问题