前言
大家好! 这是我第一次写博客。此间内容为我实际编程和网上资料进行的总结笔记,所以表述有可能不严谨。
正文
打开文件
此处使用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函数说明.