Ошибка M_construct при чтении содержимого файла - PullRequest
0 голосов
/ 11 июня 2019

Я создаю игру, которая требует много настроек.Я решил добавить файл конфигурации (.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;
}

The PROGRAM_FOLDER константа - это просто родительская папка пути, возвращаемого argv[0] в main.Я не могу запустить отладчик для этого кода, потому что когда я это делаю, путь меняется на что-то странное.

Я знаю, что эта ошибка появляется из-за инициализации nullptr std :: string, но у меня все еще нетИдея, почему это происходит.

Я попытался ввести случайные символы в конфигурационный файл и получить тот же результат.Меня сбивает с толку, что первый оператор if работает нормально, а второй - нет (когда я использую команду -delete).

Любые предложения будут полезны, заранее спасибо!

1 Ответ

0 голосов
/ 11 июня 2019

Оказывается, что ошибка вообще не исходила из этого блока кода.То, что происходило, было то, что моя игра пыталась загрузить данные впоследствии, но из-за того, что я не писал команду загрузки, было нечего читать.Я исправил проблему с отладчиком (по какой-то причине char [], который я выделил, хранил разные данные при запуске отладчика) и просто вернулся к std :: strings.

...