我的程序崩溃了,老实说我很困惑(c++)

Posted

技术标签:

【中文标题】我的程序崩溃了,老实说我很困惑(c++)【英文标题】:My program is crahing, and honestly i am confused (c++) 【发布时间】:2014-10-18 23:54:29 【问题描述】:

由于某种原因,我的程序在收到用户输入后立即崩溃。然而最奇怪的部分是它只有在用户输入Yes 时才会崩溃,而不是在他们输入no 时。我的想法是这与Players 类有关。我已经尝试通过所有常规方法进行调试。断点似乎不起作用,因为如果我把它放在cout << "Is this the first time... 之后,由于没有分配它们,所有变量都不会有任何数据。直到我创建了readPlayerData 函数,它才能完美运行,然后崩溃开始了。

using namespace std;

int main() 
    mt19937 rand_engine(time(nullptr));
    vector<Player> plyrs;
    srand(time(NULL));
    bool firstTimer = false;
    cout << "Is this the first time this program has run?" << endl;
    string firstTime;
    cin >> firstTime;

    if (firstTime == "Yes" || firstTime == "yes") 
        firstTimer == true;

        for (int i = 0; i < 30; i++) 
            int limit = 18; // rand() % (25 - 18) + 18;
            for (int w = 0; w < limit; w++) 
                int z = plyrs.size();
                plyrs.resize(z + 1);
                plyrs[z].setPlayeName(rand_engine);
                plyrs[z].setPlyrVal();
                plyrs[z].setPlayerTeam(i);
            
        
        string human_input;
        cout << "Pick a # between 1-30, this will be your team: " << endl;
        cin >> human_input;
        int human_teamInput = 0;
        human_teamInput = atoi(human_input.c_str());
        ofstream plyrdata;
        plyrdata.open("plyr.txt");
        plyrdata << human_teamInput << endl;
        plyrdata.close();
        ofstream playerSaveData;

        playerSaveData.open("savedata.txt");

        for (int i = 0; i < plyrs.size(); i++) 
            playerSaveData << plyrs[i].plName << endl;
            playerSaveData << plyrs[i].plOvr << endl;
            playerSaveData << plyrs[i].ploaw << endl;
            playerSaveData << plyrs[i].pldaw << endl;
            playerSaveData << plyrs[i].pldspg << endl;
            playerSaveData << plyrs[i].pldsps << endl;
            playerSaveData << plyrs[i].plSpg << endl;
            playerSaveData << plyrs[i].plSps << endl;
            playerSaveData << plyrs[i].plteam
                           << (i < (plyrs.size() - 1) ? "\n" : "");
        
        playerSaveData.close();
        assemble_Team_Data();
    

    else 
        assemble_Team_Data();
    
    Sleep(10000);
    return 0;

这里是 readPlayerData() 的代码

void readPlayerData() 
    numFnames = 1;
    numLnames = 1;
    string line;
    ifstream fnameFile("PlayersFname.txt");
    if (fnameFile.is_open()) 
        while (fnameFile.eof() == false) 
            plFname.resize(numFnames);
            getline(fnameFile, line);
            numFnames += 1;
        
        fnameFile.close();
    
    ifstream lnameFile("PlayersLname.txt");
    if (lnameFile.is_open()) 
        while (lnameFile.eof() == false) 
            plLname.resize(numLnames);
            getline(lnameFile, line);
            numLnames += 1;
        
        lnameFile.close();
    

void setPlayeName(mt19937& rand_engine) 
    readPlayerData();
    uniform_int_distribution<int> fname_rand(0, numFnames);

    string fname = plFname[fname_rand(rand_engine)];
    uniform_int_distribution<int> lname_rand(0, numLnames);

    string lname = plLname[lname_rand(rand_engine)];
    plName = string(fname + " " + lname);

【问题讨论】:

@PiotrS 当你有一个布尔值时它不应该是这样的 【参考方案1】:

不太可能是你的崩溃,但这段代码很糟糕:

if (fnameFile.is_open())

    while (fnameFile.eof() == false)
    
        plFname.resize(numFnames);
        getline(fnameFile,line);
        numFnames += 1;
    
    fnameFile.close();

它没有正确检查文件结尾,因为文件结尾发生在 getline 期间,而不是之前。 line 变量无处可去。试试

while (getline(fnameFile,line)) plFnames.push_back(line);
fnameFile.close();

【讨论】:

这是否与.eof 具有相同的效果?以便它知道何时到达文件末尾? @Gorlan: getline 返回流本身,while (stream) 检查流是否仍处于良好状态。未打开或到达文件末尾将使流处于失败状态并结束循环。 (通过while循环条件触发的“contextual conversion to bool”工作。fstream转换为bool返回流是否良好)跨度> @Gorlan:随机取名字时也使用plFNames.size(),而不是numFnames。矢量会记住自己的大小。 @Gorlan:对不起,没有你调试器的信息(什么线路崩溃,当时的变量是什么),我看不到问题。

以上是关于我的程序崩溃了,老实说我很困惑(c++)的主要内容,如果未能解决你的问题,请参考以下文章

为啥谷歌播放商店稳定性报告说我的应用程序在一台设备上崩溃了[重复]

preg_replace 这个:123.. - 可能是一个简单的 PHP / preg_replace / RegEx 问题,但老实说我很难过

应用程序在 Xcode 中运行,但存档时崩溃

C++:当我的应用程序在随机位置崩溃时从哪里开始?

C++ 单例模板类使我的程序崩溃

我的 C++ 程序中的一些代码使程序崩溃。我正在实现 BFS 算法