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.
我正在制作一款需要大量设置的游戏。我决定添加一个配置文件 (.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.