看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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