C++ 正在设置ifstream失败位不确定原因

C++ 正在设置ifstream失败位不确定原因,c++,ifstream,C++,Ifstream,也许看到这个问题会对你们大家都有所帮助: 屏幕截图: https://ws.onehub.com/files/37ggbfio 这是演示exe文件 我想让那个运动员四处走动 鼠标瞄准 鼠标左键点击开火 重新装载 M创建一个怪物(我在游戏中有一个繁殖点,每次最多能吐出5个怪物,3个活着的怪物) 我正在从包含以下内容的文件中加载monster数据: 蜘蛛步/ 12 Spider_Attack/ 1 Spider_Die/ 9 3 17 32 5 2 28 32 8 1 48

也许看到这个问题会对你们大家都有所帮助:

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

这是演示exe文件

我想让那个运动员四处走动 鼠标瞄准 鼠标左键点击开火 重新装载 M创建一个怪物(我在游戏中有一个繁殖点,每次最多能吐出5个怪物,3个活着的怪物)

我正在从包含以下内容的文件中加载monster数据:


蜘蛛步/

12

Spider_Attack/

1

Spider_Die/

9

3

17 32 5  2

28 32 8  1

48 32 15 1

每次生成蜘蛛时,我都会检查该文件,查看命中区域的数据和动画的文件路径。我不会每次都重新加载动画,因为资源管理器类可以防止多个动画被双重加载。目前我可以繁殖很多怪物,但是突然间ifstream给我设置了失败位,我崩溃了。我试图理解为什么我的失败位被设置

我的输出是:


(1) 加载文件是坏的!旗帜集

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

目前我正在考虑创建一个monster info类,并将其与资源管理器一起使用,以便只加载一次monster数据,任何建议都会很有帮助。我只是担心这次失败只是冰山一角,还有更大的东西潜伏着

可能最终重现问题的最小代码块

ifstream加载_文件

load_file.open(filename.c_str())

如果(!load_file.good())allegro_消息(“(1)load_file.BAD!”设置了标志\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())

完整的构造函数代码如下:


Monster::Monster(字符串文件名,资源管理器*nrm)

{
rm=nrm;
//类初始化
Draw\u Hit\u Zones=真;
Draw_Health_Bar=true;
最后一次分区命中=-1;
死=假;
死亡时间=0;
cur_state=0;
MAGIC=NULL;
延迟=100;
当前帧=0;
dr=0;
r=0;
移动速度=10;
定时器=时钟();
最大命中率=50;
当前命中率=最大命中率;
//端类初始化
细流ss;
字符串root\u path=filename.substr(0,filename.find\u last\u of(“/\\”)+1);///gfx/Spider/
字符串加载\图像\路径;
字符串加载\u掩码\u路径;
字符串温度;
ifstream加载_文件;
load_file.open(filename.c_str());
如果(!load_file.good())allegro_消息(“(1)load_file.BAD!”设置了标志\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());
加载文件>>temp>>W\u num\u帧;
W_ANI.assign(根路径);
附加动植物(临时);
加载文件>>临时>>数量帧;
A_ANI.assign(根路径);
A_ANI.append(临时);
加载文件>>临时>>数字帧;
D_ANI.assign(根路径);
D_ANI.追加(临时);
如果(!load_file.good())allegro_消息(“(2)load file不正确!设置了标志\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->加载精灵(A_ANI,A_ANI);
rm->Load_Sprite(D_ANI,D_ANI);
魔数=(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 W_Sprite(W_ANI,0)->h));
加载文件>>num\u col;
Hit_Zones=新的C_循环*[num_col];
乘数=新整数[num_col];
int-cx,cy,cr;
对于(int-lcv=0;lcv>cx>>cy>>cr>>乘法器[lcv];
命中区域[lcv]=新的C_循环(cx+(魔法数字-rm->获取精灵(W_ANI,0)->W)/2,cy+(魔法数字-rm->获取精灵(W_ANI,0)->h)/2,cr);
}
Master_Hit_Zone=新的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 W_Sprite(W_ANI,0)->h;
加载_文件。关闭();
}

它在打开时失败了。当你说spawn时,我假设你指的是不同的线程,而不是新进程。我怀疑您正在用完文件描述符,因为给定进程可能具有的打开文件的数量是有限的


当打开失败时,它将设置全局值ERRNO。您可以使用它(使用SrrError(ErrNO))获得C++幻想,或者只使用PrRoR()来查看这是否是问题。

这是太多代码。您应该尝试将代码样本减少到仍然产生问题的最小代码量。您将从堆栈溢出中获得更多帮助,您甚至可以自己在过程中找到解决方案。fstream在打开文件时失败。该文件存在,程序可以很好地访问它,比如说50或60次,然后它就失败了。实际上,就游戏繁殖而言,甚至线程都不意味着创建怪物。单线程程序,但我必须记住这一点,因为在这个游戏的多人游戏方面,我将使用多线程,这可能是一个潜在的问题。但问题是你没有使用多个进程,并且你可能会用完文件描述符。我不在这个程序中使用多个进程,目前不是。一个线程一个进程。等等,我误读了。。。。如果我通过load_File.close()关闭文件描述符每次我怎么跑完?你的代码可能不是多线程的,但游戏框架Allegro可能是:指链接MSVCRT的多线程DLL版本,强烈暗示它以某种方式使用线程。他是对的,我设法让它告诉我,我有太多打开的文件。。。fstream函数close()不关闭文件描述符吗?如果案例中有太多打开的文件,根据这个理论,即使我每次关闭它们,我也无法拥有100个不同的怪物文件。
{

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