我正在创建一个需要大量设置的游戏。我决定添加一个配置文件(.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命令时)。
任何建议都会有用,在此先感谢!
答案 0 :(得分:0)
事实证明,该错误根本不是来自该代码块。发生的事情是我的游戏此后尝试加载数据,但是由于我没有编写load命令,因此无法读取任何内容。我解决了调试器的问题(无论出于何种原因,调试器运行时分配给char []的存储的数据都不同),并恢复为std :: strings。