關於如何讀取和修改ini配置文件的文章挺多的,而且讀寫操作也簡單,記錄一下,再補充一點邊緣的東西留一篇以後備用。
一、 如何讀取和修改ini配置文件
1. 頭文件:#include <Shlwapi.h>
2. 讀寫的三個函數
/******************************************************************************************
獲取鍵值
DWORD GetPrivateProfileString(
LPCTSTR lpAppName, // INI文件中的一個字段名[節名]可以有很多個節名
LPCTSTR lpKeyName, // lpAppName 下的一個鍵名,也就是裏面具體的變量名
LPCTSTR lpDefault, // 如果lpReturnedString爲空,則把個變量賦給lpReturnedString
LPTSTR lpReturnedString, // 存放鍵值的指針變量,用於接收INI文件中鍵值(數據)的接收緩衝區
DWORD nSize, // lpReturnedString的緩衝區大小
LPCTSTR lpFileName // INI文件的路徑
);
UINT GetPrivateProfileInt(
LPCTSTR lpAppName, // INI文件中的一個字段名[節名]可以有很多個節名
LPCTSTR lpKeyName, // lpAppName 下的一個鍵名,也就是裏面具體的變量名
INT nDefault, // 如果沒有找到指定的數據返回,則把個變量值賦給返回值
LPCTSTR lpFileName // INI文件的路徑
);
******************************************************************************************
修改鍵值或添加節點與鍵值
BOOL WritePrivateProfileString(
LPCTSTR lpAppName, // INI文件中的一個字段名[節名]可以有很多個節名
LPCTSTR lpKeyName, // lpAppName 下的一個鍵名,也就是裏面具體的變量名
LPCTSTR lpString, // 鍵值,也就是數據
LPCTSTR lpFileName // INI文件的路徑
);
******************************************************************************************/
其實只要這麼多你基本就可以完成對ini配置參數文件進行讀寫和添加了。
3. 代碼示例(VS2015的C++空項目)。
#include <iostream>
#include <io.h>
#include <Shlwapi.h>
using namespace std;
int main(int argc, char *argv[])
{
//讀取內容
char fileSrc[_MAX_DIR];
memset(fileSrc, 0, _MAX_DIR);
strcpy_s(fileSrc, "./Param.ini");
if (_access(fileSrc, 0))
{//判斷文件是否存在
cout << " File Path Error !" << endl;
system("PAUSE");
return 0;
}
char strbuf[255];
memset(strbuf, 0, sizeof(strbuf));
GetPrivateProfileString("USER_INFO", "UserName", "", strbuf, sizeof(strbuf) - 1, fileSrc);
cout << strbuf << endl;
memset(strbuf, 0, sizeof(strbuf));
GetPrivateProfileString("USER_INFO", "Password", "", strbuf, sizeof(strbuf) - 1, fileSrc);
cout << strbuf << endl;
int MemberNumber = GetPrivateProfileInt("USER_INFO", "MemberNumber", 0, fileSrc);
cout << MemberNumber << endl;
//修改內容
WritePrivateProfileString("USER_INFO", "Password", "join54321", fileSrc);
//添加加內容(無論數字還是字符串修改寫入都用一個函數)
WritePrivateProfileString("USER_MACHINE", "MachineNumber", "151221001", fileSrc);
WritePrivateProfileString("USER_MACHINE", "LicenseNumber", "A5B7LV30MO", fileSrc);
system("PAUSE");
return 0;
}
- 修改前的文件
- 運行輸出
- 文件最終狀態
4. 使用不同版本VS時可能出現的問題
- 在包含了頭文件後,雖然語法上沒有任何錯誤提示,但是編譯時卻報錯。
在文件頂部加上#pragma comment(lib,"Shlwapi.lib")試試。
- 在使用讀寫函數時,使用字符串作爲參數時提示:參數不兼容。
使用#include <afxconv.h>中的USES_CONVERSION;和A2T、T2A將字符串轉換寬字節類型。值得注意的是使用時不要定義字符數組通過A2T轉換傳遞給函數以存儲數據,這樣會導致存儲進的內容亂碼,你可以先定義WCHAR去傳給函數存儲數據,然後再通過T2A轉換成你要的字符串。
二、程序後臺運行命令行指令(避免閃黑框)
ShellExecute(NULL, NULL, _T("cmd"), _T("/C ipconfig /all > record"), NULL, SW_HIDE);