MFC VC++ 读写、遍历 ini 配置文件

参考

VC遍历INI文件

其实是利用GetPrivateProfileString 函数传递不同参数读到的数据不同,从而实现功能

DWORD 实际缓冲区数据长度 = GetPrivateProfileString(“字段名”, “变量名”, “读不到时缓冲区的值”, 提供缓冲区, 提供缓冲区长度, “ini文件全路径”);

GetPrivateProfileString(NULL, NULL, NULL, 提供缓冲区, 提供缓冲区长度, “ini文件全路径”);

此时读到缓冲区的数据是ini文件所有字段的名字

GetPrivateProfileString(“字段名”, NULL, NULL, 提供缓冲区, 提供缓冲区长度, “ini文件全路径”);

此时读到缓冲区的数据是该字段所有变量名

GetPrivateProfileString(“字段名”, “变量名”, NULL, 提供缓冲区, 提供缓冲区长度, “ini文件全路径”);

此时读到缓冲区的数据是该字段该变量名的变量值

根据上面的特点可以有代码

 1 void xxxDlg::EnumIniFile(LPCTSTR pFilePath)
 2 {
 3     CString strTemp;
 4     TCHAR strReturn[100];
 5     //字段名 变量名 默认值 字符串缓冲区 长度 文件名和完整路径名
 6     DWORD dwAppNameSize = GetPrivateProfileString(NULL, NULL, NULL, strReturn, 100, pFilePath);
 7     if (dwAppNameSize > 0)
 8     {
 9         //此时strReturn的值是字段1 + '\0' 字段2 + '\0' 字段3 + '\0'  ...
10         CString strTempAppName('@', dwAppNameSize);//分配100字节空间,用@填充
11         for (DWORD i = 0; i < dwAppNameSize; i++)
12         {
13             if (strReturn[i] == '\0')
14             {
15                 strTempAppName.SetAt(i, '@');//CString 动态空间的话不能用SetAt增加空间
16             }
17             else
18             {
19                 strTempAppName.SetAt(i, strReturn[i]);
20             }
21         }
22         int i_appPos = 1;
23         CString strAppName;
24         while (i_appPos)
25         {
26             i_appPos = strTempAppName.Find('@');
27             if (i_appPos > 0)
28             {
29                 strAppName = strTempAppName.Left(i_appPos);
30                 strTempAppName = strTempAppName.Right(strTempAppName.GetLength() - (i_appPos + 1));//把找过的截断                
31                 //MessageBox(strAppName);//这里找到字段名
32                 DWORD dwKeyNameSize = GetPrivateProfileString(strAppName, NULL, NULL, strReturn, 100, pFilePath);
33                 if (dwKeyNameSize > 0)
34                 {
35                     //此时strReturn的值是变量名 + '\0' 变量名 + '\0' 变量名 + '\0'  ...
36                     CString strKeyAppName('#', dwKeyNameSize);//分配xx字节空间,用#填充
37                     for (DWORD i = 0; i < dwKeyNameSize; i++)
38                     {
39                         if (strReturn[i] == '\0')
40                         {
41                             strKeyAppName.SetAt(i, '#');//CString 动态空间的话不能用SetAt增加空间
42                         }
43                         else
44                         {
45                             strKeyAppName.SetAt(i, strReturn[i]);
46                         }
47                     }
48                     int i_keyPos = 1;
49                     CString strkeyName;
50                     while (i_keyPos)
51                     {
52                         i_keyPos = strKeyAppName.Find('#');
53                         if (i_keyPos > 0)
54                         {
55                             strkeyName = strKeyAppName.Left(i_keyPos);
56                             strKeyAppName = strKeyAppName.Right(strKeyAppName.GetLength() - (i_keyPos + 1));//把找过的截断                
57                             //MessageBox(strkeyName);//这里找到变量名
58                             DWORD dwValueNameSize = GetPrivateProfileString(strAppName, strkeyName, NULL, strReturn, 100, pFilePath);
59                             CString strValue;
60                             if (dwValueNameSize > 0)
61                             {
62                                 //此时strReturn的值变量的值
63                                 strValue = strReturn;
64                             }
65                             else
66                             {
67                                 strValue.Empty();
68                             }
69                             CString strMsg;
70                             strMsg.Format(_T("%s = %s"), strkeyName, strValue);
71                             MessageBox(strMsg);
72                         }
73                         else
74                         {
75                             break;
76                         }
77                     }
78 
79                 }
80             }
81             else
82             {
83                 break;
84             }
85         }
86     }
87 }

如果读ini文件遇到中文乱码问题,先排除一下编码格式的问题

一般用新建txt,改后缀名的方式建一个ini文件,这时编码格式不是ANSI 或 Unicode(我也不知道默认格式是啥)

用另存为的方式修改ini文件的编码格式,改为ANSI或Unicode,我试过改成ANSI就可以了,Unicode我电脑没这个选项,不知道为啥

这里和程序使用字符集 Unicode或多字节应该是没关系的,实际情况各自测试一下

posted @ 2020-12-14 20:05  ckrgd  阅读(984)  评论(0编辑  收藏  举报