读取文件内容时发生M_construct错误

时间:2019-06-11 09:42:32

标签: c++ ifstream stdstring

我正在创建一个需要大量设置的游戏。我决定添加一个配置文件(.ini)和一个读取器以获取信息。我的ini文件设置如下:

-cmd arg0 arg1

最初,我只有一个命令可以正常工作,直到添加第二个命令为止。无论出于何种原因,当我的命令不是第一个命令时,都会收到std :: logic_error。

// this works
-load w "someName"

// this doesn't
-delete "someName"

以下是用于读取文件的代码:

InitFileReader::InitFileReader()
{
    std::string ini_file_path = "";
    ini_file_path += PROGRAM_FOLDER;
    ini_file_path += "\\blockgame.ini";
    std::ifstream ini_file(ini_file_path);

    if (!ini_file.is_open()) std::cout << "Couldn't find configuration file at " << ini_file_path << std::endl;

    std::string line;

    while(std::getline(ini_file, line))
    {
        if (starts_with(line, "-load "))
        {
            std::string arg0 = "";

            unsigned int index = 6;
            for (; index < line.size(); index++)
            {
                char c = line[index];
                if (c == ' ') break;

                arg0 += c;
            }

            std::string arg1 = "";
            bool reached_quote = false;

            for (; index < line.size(); index++)
            {
                char c = line[index];
                if (c == ' ' && !reached_quote) continue;

                if (c == '\"' && !reached_quote)
                {
                    reached_quote = true;
                    continue;
                }
                else if (c == '\"') break;

                arg1 += c;
            }

            sfr = new SaveFolderReader(arg1);

            if (arg0 == "new")
            {
                sfr->new_header(DEFAULT_HEADER);
            }
            else if (arg0 == "def")
            {
                sfr->restore_header(DEFAULT_HEADER);
            }
        }
        else if (starts_with(line, "-delete "))
        {
            std::string arg0 = "";

            unsigned int index = 8;
            for (; index < line.size(); index++)
            {
                char c = line[index];
                if (c == ' ') break;

                arg0 += c;
            }

            std::string world_path = "";
            world_path += PROGRAM_FOLDER;
            world_path += "\\save\\";
            world_path += arg0;

            if (rmdir(world_path.c_str()) != 0)
            {
                std::cout << "Error deleting world \"" << arg0 << "\"" << std::endl;
            }
        }
    }
}

inline bool starts_with(const std::string& target, const std::string& prefix)
{
    if (target.size() < prefix.size())
        return false;

    for (unsigned int i = 0; i < prefix.size(); i++)
    {
        if (target[i] != prefix[i])
            return false;
    }

    return true;
}

PROGRAM_FOLDER常数只是argv[0]在main中返回的路径的父文件夹。我无法在此代码上运行调试器,因为这样做时路径会更改为奇怪的内容。

我知道此错误是由于std :: string的nullptr初始化而出现的,但我仍然不知道为什么会这样。

我尝试在配置文件中输入随机字符并获得相同的结果。令我感到困惑的是,第一个if语句可以正常工作,但第二个if语句不能正常工作(当我使用-delete命令时)。

任何建议都会有用,在此先感谢!

1 个答案:

答案 0 :(得分:0)

事实证明,该错误根本不是来自该代码块。发生的事情是我的游戏此后尝试加载数据,但是由于我没有编写load命令,因此无法读取任何内容。我解决了调试器的问题(无论出于何种原因,调试器运行时分配给char []的存储的数据都不同),并恢复为std :: strings。