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