分享

MFC文件读取2

 浮 生 2010-06-04
MFC文件读取技术(2)

//****************************

第二部分: INI 文件 
INI 文件的读写 
Windows 操作系统将 win.ini 作为记录当前系统状态,并根据其记录内容对系统进行配置的一种便捷的方法,且众多的应用软件也广泛的使用该类型的配置文件来对软件进行记录和配置。

配置设置文件( INI )文件是 windows 操作系统中的一种特殊的 ASCII 文件,以 ini 为文件扩展名。该文件也被称为初始化文件 initialization file 和概要文件 profile ,通常应用程序可以拥有自己的配置设置文件来存储状态信息。一般来说私有的配置设置文件比较小,这样可以减少程序在初始化时读取配置文件时的信息量,从而提高程序的启动速度、提高应用程序和系统的性能。

如果带存取的信息涉及到 windows 系统环境或是其他应用程序时,就必须在 windows 系统的配置文件 win.ini 中记录并在访问的同时发送 WM_WININICHANGE 消息给所有的顶层窗口,通知其他的程序系统配置文件已做了更改。但由于 win.ini 中不仅记录了系统的有关信息,也存储着许多其他应用软件的配置数据,所以访问的数据量要远比私有配置文件大的多。

掌握内容 :

了解 INI 文件的结构;能够正确灵活的应用 INI 文件存取信息;避免 INI 文件读写的常见误区。

INI 文件存储管理 
配置文件里的信息之所以能为系统和终生的软件所读取并识别,是由于其内部对数据的存取采用了预先约定的“项 - 值对( entry-value pairs )”存储结构,并对待存取的数据分门别类地进行调理清晰的存储。 INI 文件的结构如下:

;注释

[ 小节名 ]

关键字 = 值

INI 文件允许有多个小节,每个小节又允许有多个关键字,“ = ”后面是该关键字的值。值的类型有 3 种:字符串、整型数值和布尔值。其中字符串存储在 INI 文件中时没有引号,布尔值用 1 表示,布尔假值用 0 表示。

注释以分号“;”开头。

Windows 操作系统专门为此提供了 6 个 API 函数来对配置设置文件进行读、写:

GetPrivateProfileInt: 从私有初始化文件(即自定义的 INI 文件)获取整型数值。

GetPrivateProfileString: 从私有初始化文件获取字符串型值。

GetProfileInt :从 win.ini 获取整数值。

WritPrivateProfileString :写字符串到私有初始化文件。

WriteProfileString :写字符串到 win.ini 。

需要指出的是,当向配置文件存储信息时,不论是数据还是字符串都要先转换成字符串,然后再进行存储。

这里只介绍私有初始化文件,所以只涉及到 3 个函数 ---GetPrivateProfileString 、 GetPrivateProfileInt 和 WritePrivateProfileString 。

INI 文件读写过程

INI 文件的读和写操作是分开的,首先介绍写文件的方法。

1. INI 文件的写过程 
将信息写入 INI 文件中所用的函数为:

BOOL WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTR lpString,LPCTSTR lpFileName);

其中各参数的意义:

lpAppName :是 INI 文件中的一个字段名。

lpKeyName :是 lpAppName 下的一个键名,通俗讲就是变量名。

lpString :是键值,也就是变量的值,不过必须为 LPCTSTR 型或 CString 型的。

lpFileName :是完整的 INI 文件名。

实例 1 :将信息写入 INI 文件 
将一名学生的姓名和年龄写入 C:\student.ini 文件中。

步骤:创建基于对话框的 MFC 程序,删除所有自动生成的控件,然后添加按钮控件,并在相应的按钮事件处添加如下代码:

       CString strName,strTemp;

       int nAge;

       strName=" 张三 ";

       nAge=12;

       ::WritePrivateProfileString("Info","Name",strName,"C:\\student.ini");

       strTemp.Format("%d",nAge);

       ::WritePrivateProfileString("Info","Age",strTemp,"C:\\student.ini");

运行结果: C 盘下创建了 student.ini 文件,文件内容如下:

[Info]

Name= 张三

Age=12

2. INI 文件的读过程 
将信息从 INI 文件中读出到程序中所用的函数为 :

DWORD GetPrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefault,LPTSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName);

其中,各参数的意义如下:

前两个参数与 WritePrivateProfileString 中的意义一样。

lpDefault :如果 INI 文件中没有前两个参数指定的字段名或键名,则将此值赋给变量。

lpReturnedString :接收 INI 文件中没有前两个参数指定的字段名或键名,则将此值赋给变量。

lpReturnedString :接受 INI 文件中的值的 CString 对象,即目的缓存器。

nSize :目的缓存器的大小。

lpFileName :是完整的 INI 文件名。

实例 2 :从 INI 文件读出信息 
程序将 C:\student.ini 文件中的信息读出到程序中。

步骤:如前,在相应的 button 按钮响应事件函数处,添加如下代码:

       CString strStudName;

       int nStudAge;

       GetPrivateProfileString("Info","Name"," 默认姓名 ",strStudName.GetBuffer(MAX_PATH),MAX_PATH,"C:\\student.ini");

       // 读入整型值

       //UINT GetPrivateProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault,LPCTSTR lpFileName);

       nStudAge=GetPrivateProfileInt("Info","Age",10,"C:\\student.ini");

运行结果:可以通过设置断点,来查看 strStudName 和 nStudAge 的内容。

错误的 INI 文件读写 
1. 路径指示错误 
INI 文件的路径必须完整,文件名前面的各级目录必须存在,否则写入不成功,该函数返回 FALSE 值。

如下程序:

CString strName,strTemp;

int nAge;

strName=” 张三 ”;

nAge=12;

::WritePrivateProfileString(“Info”,”Name”,strName,”c:\\Info\student.ini”);

如果 C:\Info 目录不存在,那么写 INI 文件的操作就会失败。

解决办法是进行文件操作前通过以下代码检查目录是否存在:

WIN32_FIND_DATA fd;

HANDLE hFind=FindFirstFile(“C:\\Info”,&fd);

If((hFind!=INVALID_HANDLE_VALUE)&&(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY))

{

AfxMessageBox(“ 存在 ”) ;

}

else

{

AfxMessageBox(“ 不存在 ”) ;

}

FindClose(hFind);

2. 认识上的两个误区 
误区一:写文件路径的时候写成诸如 C:\Info 的形式,实际上在 visual C++ 中,文件名的路径中必须为 \\ ,因为在 visual C++ 中 \\ 才表示一个 \ ,所以正确的格式应改为 C:\\Info.

误区二:因为经常需要把 INI 文件放在程序所在目录,所以在写 INI 文件的函数中直接将 lpFileName 参数设置为文件名,如“ student.ini ”。这是不正确的做法,打开 INI 文件的时候,如果文件名没有指明路径的话,那么这个 INI 文件会存储在 windows 目录中,而不是在应用程序的当前目录中。

解决办法是 lpFileName 参数设置为“ .\\student.ini ”。

教你一招 ---- 如何循环读写多个值 
假设现在有一个程序,要将最近使用的几个文件名保存下来,写入的代码如下:

CString strTemp,strTempA;

int I;

int nCount=6;

for(i=0;i<nCount;i++)

{

strTemp.Format(“%d”,i);

strTemp.Format(“%s%d%s”,”File”,i,”.txt”);// 文件名

::WritePrivateProfileStirng(“UseFileName”,”FileName”+strTemp,strTempA,”c:\\usefile.ini”);

}

strTemp.Format(“%d”,nCount);

::WritePrivateProfileString(“FileCount”,”Count”,strTemp,”C:\\usefile.ini”);

// 将文件总数写入,以便读出。

以上代码运行后, C 盘下面 userfile.ini 文件内容。

实例 3 :将信息写入 INI 文件 
步骤:创建基于对话框的 MFC 程序,删除所有自动生成的控件,然后添加按钮控件,并在相应的按钮事件处添加如下代码:

       CString strTemp,strTempA;

       int i;

       int nCount=6;

       for(i=0;i<nCount;i++)

       {

              strTemp.Format("%d",i);

              strTempA.Format("%s%d%s","File",i,".txt"); // 文件名

              ::WritePrivateProfileString("UseFileName","FileName"+strTemp,strTempA,"c:\\usefile.ini");

       }

       strTemp.Format("%d",nCount);

       ::WritePrivateProfileString("FileCount","Count",strTemp,"C:\\usefile.ini");

运行结果: C 盘下创建了 usefile.ini 文件,文件内容如下:

[UseFileName]

FileName0=File0.txt

FileName1=File1.txt

FileName2=File2.txt

FileName3=File3.txt

FileName4=File4.txt

FileName5=File5.txt

[FileCount]

Count=6

实例 4 :从 INI 文件读出信息 
程序将 C:\student.ini 文件中的信息读出到程序中。

步骤:如前,在相应的 button 按钮响应事件函数处,添加如下代码:

       CString strTemp,strTempA;

       int i;

       int nCount;

       nCount=::GetPrivateProfileInt("FileCount","Count",0,"c:\\usefile.ini");

       for(i=0;i<nCount;i++)

       {

              strTemp.Format("%d",i);

              strTemp="FileName"+strTemp;

              ::GetPrivateProfileString("UseFileName",strTemp,"default.txt",strTempA.GetBuffer(MAX_PATH),MAX_PATH,"c:\\usefile.ini");

              //strTempA 中就存储了文件名

       }

运行结果:可以通过设置断点,来查看 strTemp 和 strTempA 的内容。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多