关于如何读取和修改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);