M_construct 读取文件内容时出错

M_construct error when reading file contents

我正在制作一款需要大量设置的游戏。我决定添加一个配置文件 (.ini) 和一个 reader 来获取信息。我的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常量就是main中argv[0]返回路径的父文件夹。我无法 运行 调试器对此代码进行调试,因为当我这样做时路径会发生一些奇怪的变化。

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

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

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

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