【MFC】MFC如何对ini配置文件进行读取和写入

【MFC】MFC如何对ini配置文件进行读取和写入

前言

大家好! 这是我第一次写博客。此间内容为我实际编程和网上资料进行的总结笔记,所以表述有可能不严谨。

正文

打开文件

此处使用CStdioFile类来进行文档的操作。
CStdioFile类 继承自CFile类,一个CStdioFile对象可以再程序运行时,通过函数fopen 打开的C 运行时流式文件。流式文件是被缓冲的,而且可以以文本方式(缺省)或二进制方式打开。
此处用到的函数为cstdiofile::open()
cstdiofile::open()
函数结构为

virtual BOOL Open(
   LPCTSTR 			lpszFileName,
   UINT 			nOpenFlags,
   CFileException* 	pError = NULL
);

参数

lpszFileName 是路径所需文件的字符串。该路径可以是相对路径,也可以是绝对路径。
nOpenFlags 共享和访问模式。因此,在打开文件时,指定该操作。您可以合并选项使用按位或(|)运算符。需要一种访问权限和一个股票选择;modeCreate和modeNoInherit模式是可选的。
pError 要接收失败的操作状态的现有文件异常对象的指针。

返回值
TRUE,如果成功;否则 FALSE。

代码举例

CStdioFile			StdioFile;
CString				strPath
CString				strFileName;
CString				strFilePath;
strFileName = _T("Config.ini");
strPath = _T("C:\\Users\\Microsoft\\Desktop\\");	//设置文件默认路径
strFilePath.Format(_T("%s%s"), strPath , strFileName ));	//组合路径和文件名

if (!StdioFile.Open(strFilePath, CFile::modeCreate | CFile::modeWrite | CFile::modeNoTruncate, NULL))
{
	return false;
}

CFile::modeCreate 表示: 如果不存在文件,则创建一个新文件。 否则,如果文件已经存在,它将附加到CFile对象,并被截断为0长度。
CFile::modeWrite 表示:请求写访问权限。
CFile::modeNoTruncate 表示:因为modeCreate创建文件时,文件大小会被清除为0,这时候将modeNoTruncate与其组合使用,那么已存在的文件将不会被清零。所以为了打开或者合理创建一个文件,最好使用modeNoTruncate与modeCreate组合的方式使用。

在此,我们即可通过open函数来打开指定路径下的ini文件,同时若指定路径下不存在该文件,系统也会自动创建。

补充:
若是想获取.exe文件运行路径下的文件,可以用GetModuleFileName()函数来获取。
GetModuleFileName() 获取当前进程已加载模块的文件的完整路径,该模块必须由当前进程加载。

DWORD WINAPI GetModuleFileName(
    _In_opt_  HMODULE hModule,
    _Out_     LPTSTR lpFilename,
    _In_      DWORD nSize
);

参数

hModule Long 一个模块的句柄。可以是一个DLL模块,或者是一个应用程序的实例句柄。如果该参数为NULL, 该函数返回该应用程序全路径。
lpFileName String 指定一个字串缓冲区,要在其中容纳文件的用NULL字符中止的路径名,hModule模块就是从这个文件装载进来的 。
nSize Long 装载到缓冲区lpFileName的最大字符数量

返回值
Long,如执行成功,返回复制到lpFileName的实际字符数量;零表示失败。使用GetLastError可以打印错误信息。

TCHAR			sPath[MAX_PATH];
GetModuleFileName(NULL, sPath, MAX_PATH);

sPath 即为当前应用程序的执行路径

文件的读取

(1) GetPrivateProfileString(lpAppName , lpKeyName , lpDefaut, lpReturnedString, nSize, lpFileName)

功能是为初始化文件中指定的条目取得字串,获取的是字符串格式的数据。
参数表

lpAppName LPCTSTR类型 ,ini文件中的一个字段名
lpKeyName LPCTSTR类型 ,lpAppName 下的一个键名,也就是里面具体的变量名
lpDefaut LPCTSTR类型 ,指定的条目没有找到时返回的默认值
lpReturnedString LPSTR 类型,接收INI文件中指定条目对应的值,为CString对象,即接收缓冲区
nSize DWORD 类型,接收缓冲区的大小
lpFileName LPCTSTR类型 ,完整的INI文件路径名,包含路径和文件名

返回值
Long,复制到 lpReturnedString 缓冲区的字节数量,其中不包括那些NULL中止字符;如指定的条目未找到,就返回lpDefaut。
若未找到文件,则再lpFileName路径下创建文件。

(2) GetPrivateProfileInt(lpAppName, lpKeyName, nDefault, lpFileName)
功能是为初始化文件中指定的条目获取它的整数值
参数表

lpAppName String,指定在其中查找条目的小节。注意这个字串是不区分大小写的
lpKeyName String,欲获取的设置项或条目。这个支持不区分大小写
nDefault Long,指定条目未找到时返回的默认值
lpFileName String,初始化文件的名字。如果没有指定完整的路径名,windows就会在Windows目录中搜索文件

返回值
Long,找到的条目的值;如指定的条目未找到,就返回nDefault。

代码块

CString			strReceive;
TCHAR			szResult[255];
int				nResult;

memset(szResult, 0x00, 255);
//获取指定路径下的ini配置文件某一行的字符串内容
GetPrivateProfileString(_T("Main"), _T("string "), szResult, 255, strPath );	
strReceive.Format(szResult);
//获取ini文件某一行的整型内容
//若无法获取到内容,则返回默认值6
nResult	= GetPrivateProfileInt(_T("Main"), _T("intnum "), 6, strPath); 

文件的写入

WritePrivateProfileString(lpAppName, lpKeyName , lpString, lpFileName)
将字符串内容写入ini配置文件内的某一位置,若写入的内容为整型、布尔型等其他类型数据,需要转成CString字符串格式。
参数表

lpAppName 是INI文件中的一个字段名.
lpKeyName 是lpAppName下的一个键名,通俗讲就是变量名.
lpString 是键值,也就是变量的值,不过必须为LPCTSTR型或CString型的.
lpFileName 是完整的INI文件名,如果没有指定完整路径名,则会在windows目录(默认)查找文件。如果文件没有找到,则函数会在windows目录创建它。

CString		strWrite = _T("写入的字符串");
int			nValue;
CString		strWriteVal;
//写字符串
WritePrivateProfileString(_T("Main"), _T("string "), strWrite, strPath);
//写整型
nValue = 666;
strWriteVal.Format(_T("%d"), nValue); 
WritePrivateProfileString(_T("Main"), _T("intnum "), strWriteVal, strPath); 

配置文件:
在这里插入图片描述
文章的最后
上述提到的读取和写入的方法,建议封装到一个类中,建立一个模块,方便以后的统一调用。

引用

GetModuleFileName 函数说明.
GetPrivateProfileString函数说明.
GetPrivateProfileInt函数说明.
WritePrivateProfileString函数说明.

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值