[问题] C++ 储存XML多笔资料的问题

楼主: jayzhuang (Jay)   2019-08-20 14:37:33
开发平台(Platform): (Ex: Win10, Linux, ...)
Win10
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
vs2019
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
问题(Question):
上次感谢大家提醒我透过secedit转档的格式,改成ini;
并使用ini parser,让我找到:GetPrivateProfileString/WritePrivateProfileString
目前我的Pwdword.ini,可透过这两个去做读取后,再存入到XML格式的档案中。
但是我一个奇怪状况,之前明明可以直接在显示多笔资料的,
现在显示却永远都显示最后一笔资料.....
喂入的资料(Input):
我将Pwdword.ini内,三个项目等号的资料透过GetPrivateProfileString,
取得之后,一个一个测试,确认有资料入:
(下图为Pwdword.ini的内容,红色框框圈起三个资料是我抓取的)
https://imgur.com/PALPOII
下列程式码是三笔资料的格式转档后,透过程式码给储存xml的Function
Sleep(10000);
//把要回传的LGPO_xml细项内容储存到这
string LGPO_XML_FilePath = GetFilePath() + "LGPO_Item.xml";
//写入LGPO项目的内容
Save_LGPO_Item LGPO_Item_Content;
LGPO_Item_Content.LGPO_class = 1;
char Pw01[] = "MinimumPasswordAge";
char Pw02[] = "MaximumPasswordAge";
char Pw03[] = "MinimumPasswordLength";
char Pw04[] = "PasswordComplexity";
char Pw05[] = "PasswordHistorySize";
char Pw06[] = "ClearTextPassword";
char Pw07[] = "LockoutBadCount";
char Pw08[] = "LockoutDuration";
char Pw09[] = "ResetLockoutCount";
char Pw10[] = "ForceLogoffWhenHourExpire";
char Pw11[] = "NewAdministratorName";
char Pw12[] = "NewGuestName";
//宣告要资料类型名称与,透过GetPrivateProfileString去抓取名称后面的资料
CString MinimumPasswordAge_value;
::GetPrivateProfileString(_T("System Access"), _T("MinimumPasswordAge"), 0, MinimumPasswordAge_value.GetBuffer(MAX_PATH), MAX_PATH, _T("C:\\LGPO\\Pwdword.ini"));
MinimumPasswordAge_value.ReleaseBuffer();
//之后要把CString 转成string的资料类型,方可回传。
std::string MinimumPasswordAge_string(CW2A(MinimumPasswordAge_value.GetString()));
CString MaximumPasswordAge_value;
::GetPrivateProfileString(_T("System Access"), _T("MaximumPasswordAge"), 0, MaximumPasswordAge_value.GetBuffer(MAX_PATH), MAX_PATH, _T("C:\\LGPO\\Pwdword.ini"));
MaximumPasswordAge_value.ReleaseBuffer();
std::string MaximumPasswordAge_string(CW2A(MaximumPasswordAge_value.GetString()));
CString NewAdministratorName_value;
::GetPrivateProfileString(_T("System Access"), _T("NewAdministratorName"), 0 , NewAdministratorName_value.GetBuffer(MAX_PATH),MAX_PATH, _T("C:\\LGPO\\Pwdword.ini"));
NewAdministratorName_value.ReleaseBuffer();
std::string NewAdministratorName_string(CW2A(NewAdministratorName_value.GetString()));
LGPO_Item_Content.Item_name = Pw01;
LGPO_Item_Content.Item_value = MinimumPasswordAge_string;
LGPO_Item_Content.Item_name = Pw02;
LGPO_Item_Content.Item_value = MaximumPasswordAge_string;
LGPO_Item_Content.Item_name = Pw11;
LGPO_Item_Content.Item_value = NewAdministratorName_string;
Save_LGPO_XML(&LGPO_Item_Content, LGPO_XML_FilePath);
预期的正确结果(Expected Output):
(下图是三笔资料的显示)
https://imgur.com/c6CvK5k
错误结果(Wrong Output):
(结果永远都只有一笔)
https://imgur.com/OvhZGsW
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
这是我把资料存入XML的Funcion,我把回传值得Function与Save_XML的Function分开两种
作者: firejox (Tangent)   2019-08-20 17:14:00
不宣告3个吗?你TiXmlElement("Item")只有1个,传入的也只有1个当然显示一个
作者: joechen1008 (:))   2019-08-20 23:45:00
伸手牌?
作者: firejox (Tangent)   2019-08-21 00:01:00
你要传多个,用阵列或stl container 都行

Links booklink

Contact Us: admin [ a t ] ucptt.com