C ++ tinyxml2正在加载奇怪的值?

时间:2018-11-22 20:56:33

标签: c++ xml tinyxml tinyxml2

我要保存的值为1并加载44的值?!

我在C ++中使用TinyXML2。

查看书面文件:

<mapping>
    <msaa>8</msaa>
    <vsync>true</vsync>
    <safemode>false</safemode>
    <winmode>1</winmode>
<mapping>

保存文件:

string fpath = path + CONFIG_FILE_EXTENSION;
XmlDoc doc;
//win mode:
XMLElement* root = doc.NewElement("mapping");
XMLElement* win_mode = doc.NewElement("winmode");
win_mode->SetText(cfg.win_mode);
root->InsertFirstChild(win_mode);
//safe mode
XMLElement* safe_mode = doc.NewElement("safemode");
safe_mode->SetText(cfg.safe_mode);
root->InsertFirstChild(safe_mode);
//vsync
XMLElement* vsync = doc.NewElement("vsync");
vsync->SetText(cfg.vsync);
root->InsertFirstChild(vsync);
//msaa
XMLElement* msaa = doc.NewElement("msaa");
msaa->SetText(cfg.msaa);
root->InsertFirstChild(msaa);
doc.InsertFirstChild(root);
doc.SaveFile(fpath.c_str());

并加载它:

auto* cfg = new gsettings();
XmlDoc doc;
doc.LoadFile(fpath.c_str());
XMLElement* root = doc.FirstChildElement("__kestd.mapping");
if (root == nullptr)
    return cfg;
//winmode
XMLElement* win_mode = root->FirstChildElement("winmode");
cfg->win_mode = static_cast<kwindow_mode>(*win_mode->GetText());
//safemode:
XMLElement* safe_mode = root->FirstChildElement("safemode");
cfg->safe_mode = static_cast<bool>(*safe_mode->GetText());
//vsync:
XMLElement* vsync = root->FirstChildElement("vsync");
cfg->vsync = static_cast<bool>(*vsync->GetText());
//msaa:
XMLElement* msaa = root->FirstChildElement("msaa");
cfg->msaa = static_cast<char>(*msaa->GetText());
return cfg;

如果我打印cfg->winmode,我得到44?怎么样?枚举是:

enum window_mode : byte //<< byte is a typedef for char
{
    fullscreen = 1, //How can it read 44?!
    windowed = 0
};

有人可以看到问题吗?有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

=这不是您应该做的。您不能像这样简单地进行转换,必须将字符串转换为整数。尝试static_cast<kwindow_mode>。 顺便说一句,您不应获得44,而应获得49。此外,您可能无法正确编写xml,您必须将字符串传递给SetText,而不是整数或其他内容。