【问题标题】:ifstream fail bit being set unsure whyifstream 失败位被设置不确定为什么
【发布时间】:2012-03-26 23:35:45
【问题描述】:

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

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/

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.open(filename.c_str());

if(!load_file.good())allegro_message("(1) 加载文件错误!FLAGS SET\n EOF: %i \n 错误: %i \n FAIL: %i \n FILENAME.c_str() : %s", load_file.eof(), load_file.bad(), load_file.fail(), filename.c_str());

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

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

【问题讨论】:

  • 代码太多了。您应该尝试将代码示例减少到仍然会产生问题的最少代码量。您将从 Stack Overflow 获得更多帮助,甚至可以在此过程中自己找到解决方案。
  • fstream 打开文件时失败。该文件存在,程序可以正常访问它,第一次说 50 或 60 次,然后它就失败了。

标签: c++ ifstream


【解决方案1】:

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

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

【讨论】:

  • 实际上在游戏生成方面甚至没有线程意味着创造一个怪物。单线程程序,但我必须记住这一点,因为在这个游戏的多人游戏方面,我将使用多线程,这可能是一个问题。
  • 但关键是您没有使用多个进程,而且您可能会用完文件描述符。
  • 我目前不在这个程序中使用多个进程。一线程一进程。等等,我看错了....如果我每次都通过 load_file.close() 关闭文件描述符,我将如何用完?
  • 您的代码可能不是多线程的,但游戏框架 Allegro 可能是:alleg.sourceforge.net/stabledocs/en/build/msvc.html 指的是链接 MSVCRT 的多线程 DLL 版本,强烈暗示它以某种方式使用线程。跨度>
  • 嗯,他是对的,我设法让它告诉我打开的文件太多...... fstream 函数 close() 不是关闭文件描述符吗?如果情况下打开的文件太多,即使每次完成后我都关闭()它们,根据该理论,我也无法拥有 100 个不同的怪物文件。
猜你喜欢
  • 1970-01-01
  • 2012-06-20
  • 2020-08-04
  • 1970-01-01
  • 2018-08-09
  • 1970-01-01
  • 2016-05-10
  • 2023-02-14
  • 1970-01-01
相关资源
最近更新 更多