作者jayzhuang (Jay)
看板C_and_CPP
標題[問題] txt檔案內,等號(=)後面的數值/資料取得
時間Fri Aug 16 16:22:09 2019
開發平台(Platform): (Ex: Win10, Linux, ...)
Win10
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
vs2019
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
問題(Question):
上次那個文字檔案轉檔問題解析完畢之後,我取得到我要的資料為:
https://imgur.com/vIsWHng
餵入的資料(Input):
我需要額外再做一個功能,回傳一個XML格式檔案出來(寫入的資料與上面的一致)
預期的正確結果(Expected Output):
如下圖(這是我自己做的,不是透過程式碼轉的)
https://imgur.com/qRzFDE7
錯誤結果(Wrong Output):
等號(=) 的問題,讓我不知道該怎麼下手
有試過strcpy,但我無法取得=後面的值
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
//停個10秒開始
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;
//回傳的12條項目
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";
//自動新增Pwd_Check.txt檔案<--- 就是第一張圖的資料顯示
ofstream Write_Pwd_xml(GetFilePath() + "Pwd_Check.txt");
//要讀取的檔案
ifstream Read_Pwd_txt(GetFilePath() + "Pwd.txt");
string Pwd_txt; //讀入的東西
while (!Read_Pwd_txt.eof())
{
//一行一行讀取
getline(Read_Pwd_txt, Pwd_txt); //讀取檔案 >>讀入的東西
if(!strncmp(Pwd_txt.c_str(), Pw01, 16)) //比較字串,如果前16個字相同,則通過
{
Write_Pwd_xml << Pwd_txt << endl; //把 讀入的檔案寫入到新增的Pwd_xml
//字串解析,把=前面的文字都消除
char st01[] = "MinimumPasswordAge =";
strcpy(Pwd_txt.c_str, st01);
//設法在寫入到Pwd_Check.txt檔案的時候,也把每個項目寫入到LGPO_Item.xml檔案
LGPO_Item_Content.Item_name = Pw01; //項目的名稱
LGPO_Item_Content.Item_value = Pwd_txt;
}
else if(!strncmp(Pwd_txt.c_str(), Pw02, 16))
{
Write_Pwd_xml << Pwd_txt << endl;
}
else if (!strncmp(Pwd_txt.c_str(), Pw03, 16))
{
Write_Pwd_xml << Pwd_txt << endl;
}
else
{
continue;
}
}
Read_Pwd_txt.close(); //讀取完關閉
補充說明(Supplement):
我先測試拿前面三個項目來測試,但都不能過,想詢問各位大大有更好的方法嗎?
PS:我自己額外寫的直接把資料丟入到我寫的Save_XML 的Function
確認是可行的。
//把要寫入的LGPO_xml細項內容儲存到這
string LGPO_XML_FilePath = GetFilePath() + "LGPO_Item.xml";
//寫入LGPO項目的內容
Save_LGPO_Item LGPO_Item_Content;
LGPO_Item_Content.LGPO_class = 1;
LGPO_Item_Content.Item_name = "MinimumPasswordAge";
LGPO_Item_Content.Item_value = 1;
LGPO_Item_Content.Item_name = "MinimumPasswordAge";
LGPO_Item_Content.Item_value = 90;
https://imgur.com/CQ4BMVS
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.161.102.123 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1565943733.A.17D.html
推 Schottky: 一般會用 strtok() 去切斷字串,看情況需要一次或多次 08/16 16:31
→ Schottky: 我比較喜歡 strsep() 但不知 VS2019 有沒有 08/16 16:35
推 ctrlbreak: google ini parser c 看看人家怎麼寫的, 或者找順眼 08/16 17:40
→ ctrlbreak: 的來用. 08/16 17:40
推 achicn3: fscanf 08/16 18:14
→ tsaiminghan: strtok切字串,fscanf自動幫你切,strstr找= 08/16 21:50
推 boss0405: 用ini檔的話,win有提供API可以直接使用 08/16 23:30
→ firejox: sscanf 08/17 01:55
感謝各位大大,我找到了,可以透過:
GetPrivateProfileString / WritePrivateProfileString
去抓取內容。
※ 編輯: jayzhuang (218.161.102.123 臺灣), 08/20/2019 18:08:11
※ 編輯: jayzhuang (218.161.102.123 臺灣), 08/21/2019 15:36:05