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