WritePrivateProfileString等读写.ini配置文件 .

本文介绍了如何使用VC中的API函数来读写INI文件。通过示例展示了如何将配置信息存储到INI文件中,并从INI文件中读取这些信息。文章还提供了实际的代码片段来帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在我们写的程序当中,总有一些配置信息需要保存下来,以便完成程序的功能,最简单的办法就是将这些信息写入INI文件中,程序初始化时再读入。

 

配置文件中经常用到ini文件,在VC中其函数分别为:


写入.ini文件:

BOOL WritePrivateProfileString(
  LPCTSTR lpAppName,  // INI文件中的一个字段名[节名]可以有很多个节名

  LPCTSTR lpKeyName,  // lpAppName 下的一个键名,也就是里面具体的变量名

  LPCTSTR lpString,   // 键值,也就是数据

  LPCTSTR lpFileName  // INI文件的完整路径
);


 

读取.ini文件:

 

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文件的路径

);


读写INI文件时相对路径和绝对路径都可以,根据实际情况选择

"..\\IniFileName.ini"    // 这样的为相对路径

"D:\\IniFileName.ini"    // 这样的为绝对路径

 

MAX_PATH:是微软最大路径占的字节所设的宏

 

 

LPTSTR lpPath = new char[MAX_PATH];
 
strcpy(lpPath, "D:\\IniFileName.ini");

::WritePrivateProfileString("LiMing", "Sex", "Man", lpPath);
::WritePrivateProfileString("LiMing", "Age", "20", lpPath);
 
::WritePrivateProfileString("Fangfang", "Sex", "Woman", lpPath);
::WritePrivateProfileString("Fangfang", "Age", "21", lpPath);

 

delete [] lpPath;


INI文件如下:

[LiMing]
Sex=Man
Age=20
[Fangfang]
Sex=Woman
Age=21

读INI文件:

 

LPTSTR lpPath = new char[MAX_PATH];
LPTSTR LiMingSex = new char[6];
int LiMingAge;
LPTSTR FangfangSex = new char[6];
int FangfangAge;
 

strcpy(lpPath, "..\\IniFileName.ini");
 
::GetPrivateProfileString("LiMing", "Sex", "", LiMingSex, 6, lpPath);
LiMingAge = ::GetPrivateProfileInt("LiMing", "Age", 0, lpPath);
 
::GetPrivateProfileString("Fangfang", "Sex", "", FangfangSex, 6, lpPath);
FangfangAge = ::GetPrivateProfileInt("Fangfang", "Age", 0, lpPath);

 

delete [] lpPath;


 

 

 

<think>我们正在使用MFC进行.ini配置文件读写操作。根据引用,MFC提供了几个核心API函数来处理INI文件,包括WritePrivateProfileString(写字符串)、GetPrivateProfileString(读字符串)和GetPrivateProfileInt(读整数)。此外,引用中还提到了一个CIniFile类的封装示例,但用户要求的是直接使用MFC方法。步骤:1.写操作:使用WritePrivateProfileString函数写入键值对到指定节。2.读操作:使用GetPrivateProfileString读取字符串值,使用GetPrivateProfileInt读取整数值。3.注意:INI文件路径可以是绝对路径或相对路径(相对于应用程序的当前目录)。如果文件不存在,WritePrivateProfileString会自动创建它。示例代码说明:假设我们要在MFC对话框应用程序中读写INI文件。我们可以在对话框的初始化函数(如OnInitDialog)中读取配置,在关闭对话框时(如OnDestroy)保存配置。示例代码:首先,在对话框头文件中声明一些变量来存储配置数据(例如在CMyDialog类中):CStringm_strName;intm_nAge;然后在对话框的OnInitDialog函数中读取INI文件:```cppBOOLCMyDialog::OnInitDialog(){CDialogEx::OnInitDialog();CStringstrIniPath=_T(".\\config.ini");//当前目录下的config.ini文件//读取字符串TCHARszName[256]={0};GetPrivateProfileString(_T("UserInfo"),_T("Name"),_T("DefaultName"),szName,256,strIniPath);m_strName=szName;//读取整数m_nAge=GetPrivateProfileInt(_T("UserInfo"),_T("Age"),25,strIniPath);//默认值25//将读取到的值更新到对话框控件//...(例如:m_EditName.SetWindowText(m_strName);)returnTRUE;}```在对话框关闭时(例如OnOK或OnDestroy)保存配置:```cppvoidCMyDialog::OnOK(){//从对话框控件获取数据更新到变量//...(例如:m_EditName.GetWindowText(m_strName);)CStringstrIniPath=_T(".\\config.ini");//写入字符串WritePrivateProfileString(_T("UserInfo"),_T("Name"),m_strName,strIniPath);//写入整数(需要将整数转换为字符串)CStringstrAge;strAge.Format(_T("%d"),m_nAge);WritePrivateProfileString(_T("UserInfo"),_T("Age"),strAge,strIniPath);CDialogEx::OnOK();}```注意:如果INI文件中不存在指定的节或键,写操作会创建它们,读操作会返回默认值。另外,引用[4]提到INI文件本质是对文件和字符串的处理,所以也可以自己用标准C文件操作来实现,但使用WindowsAPI更为简便。相关问题:1.如何确保INI文件存在?如果不存在怎么办?答:使用WritePrivateProfileString函数时,如果文件不存在,它会自动创建。也可以先检查文件是否存在(如使用CFileFind),再决定是否创建(如引用[3]所示)。2.除了字符串和整数,如何读写其他类型的数据?答:其他类型(如浮点数)可以先转换为字符串,然后使用WritePrivateProfileString写入;读取时再转换回来。3.如何处理多个节(Section)的INI文件?答:在读写函数中指定不同的节名即可。4.如何删除INI文件中的某个键或节?答:删除键:使用WritePrivateProfileString,将键对应的值设置为NULL,则该键会被删除。删除节:将该节下的所有键都设置为NULL,或者将节名设置为NULL(但注意:将节名设置为NULL会删除整个节及其所有键)。5.读写INI文件时路径问题(绝对路径和相对路径)?答:可以使用绝对路径(如"C:\\MyApp\\config.ini")或相对路径(如".\\config.ini")。相对路径是相对于当前进程的当前目录。根据用户需求,我们提供了直接使用MFCAPI读写INI文件的方法和示例代码。</think>### MFC读写.ini配置文件的方法与示例 在MFC中进行.ini文件读写操作主要通过Windows API实现,核心函数如下: 1. **写操作** `WritePrivateProfileString()` - 写入字符串键值对 `WritePrivateProfileStruct()` - 写入二进制数据 2. **读操作** `GetPrivateProfileString()` - 读取字符串值 `GetPrivateProfileInt()` - 读取整数值 `GetPrivateProfileStruct()` - 读取二进制数据 #### 完整示例代码 ```cpp // 在对话框类头文件中声明 CString m_strConfigPath = _T(".\\AppConfig.ini"); // 配置文件路径 // 写入配置示例 void CMyDialog::SaveConfig() { // 写入字符串 WritePrivateProfileString(_T("UserSettings"), _T("Username"), m_strUsername, m_strConfigPath); // 写入整数 WritePrivateProfileString(_T("SystemSettings"), _T("RefreshRate"), CString(Format(_T("%d"), m_nRefreshRate)), m_strConfigPath); // 写入布尔值 WritePrivateProfileString(_T("SystemSettings"), _T("AutoSave"), m_bAutoSave ? _T("1") : _T("0"), m_strConfigPath); } // 读取配置示例 void CMyDialog::LoadConfig() { // 读取字符串(带默认值) TCHAR szBuffer[256]; GetPrivateProfileString(_T("UserSettings"), _T("Username"), _T("DefaultUser"), szBuffer, 256, m_strConfigPath); m_strUsername = szBuffer; // 读取整数(带默认值) m_nRefreshRate = GetPrivateProfileInt(_T("SystemSettings"), _T("RefreshRate"), 60, m_strConfigPath); // 读取布尔值 m_bAutoSave = (GetPrivateProfileInt(_T("SystemSettings"), _T("AutoSave"), 0, m_strConfigPath) != 0); } ``` #### 关键注意事项: 1. **文件路径** - 相对路径基于应用程序工作目录 - 绝对路径如:`_T("C:\\App\\Config.ini")` 2. **自动创建机制** 当目标.ini文件不存在时,`WritePrivateProfileString()`会自动创建新文件[^3] 3. **节(Section)与键(Key)规范** ```ini [SectionName] ; 节名用方括号包裹 KeyName=Value ; 键值对格式 ``` 4. **数据类型处理**: - 整型:直接读写 - 布尔型:转换为0/1存储 - 浮点型:转换为字符串存储 - 二进制数据:使用`WritePrivateProfileStruct()` #### 最佳实践建议: 1. **初始化检查** ```cpp if (PathFileExists(m_strConfigPath) == FALSE) { // 创建默认配置或提示用户 } ``` 2. **封装工具类** 参考`CIniFile`封装类可简化操作[^1]: ```cpp class CIniHelper { public: BOOL Open(LPCTSTR lpszPath); CString ReadString(LPCTSTR lpszSection, LPCTSTR lpszKey); int ReadInt(LPCTSTR lpszSection, LPCTSTR lpszKey); // 其他封装方法... }; ``` 3. **跨平台兼容** 如需跨平台,可用标准C文件操作实现类似功能[^4] ### 相关问题 1. **如何确保INI文件不存在时自动创建?** `WritePrivateProfileString()`在目标文件不存在时会自动创建新文件[^3]。首次写入前可检查文件存在性: ```cpp if (!PathFileExists(m_strConfigPath)) { HANDLE hFile = CreateFile(m_strConfigPath, ...); CloseHandle(hFile); } ``` 2. **读写浮点型数据的最佳方法是什么?** 推荐转换为字符串处理: ```cpp // 写浮点数 CString strVal; strVal.Format(_T("%f"), 3.14159); WritePrivateProfileString(_T("Math"), _T("Pi"), strVal, path); // 读浮点数 TCHAR buf[32]; GetPrivateProfileString(_T("Math"), _T("Pi"), _T("0"), buf, 32, path); double dVal = _ttof(buf); ``` 3. **如何删除INI文件中的特定条目?** 设置键值为`NULL`即可删除: ```cpp // 删除单个键 WritePrivateProfileString(_T("Section"), _T("KeyToDelete"), NULL, path); // 删除整个节 WritePrivateProfileString(_T("SectionToDelete"), NULL, NULL, path); ``` 4. **INI文件操作有性能瓶颈吗?如何优化?** 高频读写时建议: - 批量读写:缓存数据,减少文件操作次数 - 使用内存映射文件 - 关键配置加载到内存变量 - 避免在循环中执行INI操作 5. **UNICODE环境下的特殊处理?** 所有API使用宽字符版本: ```cpp // 显式使用W版本 WritePrivateProfileStringW(L"Section", L"Key", L"Value", L"path.ini"); // 或通过_T()宏自动适配 WritePrivateProfileString(_T("Section"), _T("Key"), _T("Value"), _T("path.ini")); ``` [^1]: MFC环境下INI文件操作实践指南 [^2]: MFC读写ini配置文件 [^3]: INI文件自动创建机制 [^4]: 跨平台INI文件处理方案
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值