计算机是如何管理自身所存放着大量的信息的呢?windows 的磁盘管理程序为我们提供
了一套严密而又高效的信息组织开工--- 硬盘上的信息是以文件的形式被管理的。
面向存储的文件技术
什么是文件?计算机中,一篇文章、一幅图画、一个程序、一首歌曲等都是以文件的形式存储在磁盘上的,每个文件都有一个文件名。计算机就是对文件按名存取的。文件名的格式如下:主文件名 . 扩展名
文件名由主文件名和扩展名两部分组成,中间用小圆点隔开,其中扩展名可以省略。而扩展名是用来区分文件类型的。Windows 为了区分文件的类型,一些软件系统会自动给文件加上“ .wps ”扩展名;画图程序画的图像文件一般为“ .bmp ”等。
在windows 中,主文件名可以由英文字符、汉字、数字以及一些符号等组成,但不能使用+<>*?\ 等符号。
什么是文件夹?
在计算机中存放着数以万计的文件,为了便于管理这些文件,就像我们把文件分类放到不同的抽屉中便于查阅一样,在计算机中也有像抽屉的东西,它就是文件夹。文件夹也要有一个名字,取名的原则与文
件的取名类似,只是不用再区分文件夹的类型,当文件夹多了以后,还可以把某些文件夹归到一个大文件夹中去。久而久之,就构成了计算机中庞大的磁盘文件结构。
为什么要在程序中使用文件?
通常,程序中的数据在程序运行结束后,就会从内存中清除,再次运行程序时不会自动出现。在编制程序的过程中不可避免地会遇到将某些数据永久保存的问题,当关闭程序后,依然可以使用这些数据,这时就需要进行文件操作。
文件类型
Visual c++ 处理的文件通常分为两种:
文本文件:只可被任意文本编辑器读取ASCII 文本。
二进制文件:指对包含任意格式或无格式数据的文件的统称。
这里只介绍文本文件的读写,INI 文件也属于文本文件的范畴,且INI 文件的结构和用途与普通的文本文件不同,所以会单独介绍。
第一部分:文本文件
文本文件的读写
认识CFile 类;认识文本文件;能够正确灵活应用文本文件存取信息;避免文本文件读写的常见误区。
CFile 是MFC 的文件操作基本类,它直接支持无缓冲的二进制磁盘I/O 操作,并通过其派生类支持文本文件、内存文件和socket 文件。
客户操作记录实例功能预览及关键知识点
许多系统,出于安全或其他原因,常常要求随时对键盘进行监控,利用Hook (钩子)技
术编写的应用程序能够很好地达到这个目的。本软件就制作了一个客户操作记录软件,即在软件运行过程中,用户在键盘上的按键操作会被记录下来,这样对维护软件的正常运行非常有利。
只要启动客户操作记录软件后,不管输入焦点是否在本软件上,按键都会被记录下来。我们需要的是键盘的系统监控,只要本软件在运行,无论当前计算机在做什么,都能监测到用户按键的行为并做出反应,这就要用到Hook 技术。
Hook 技术在很多特殊软件中广泛应用,如,金山词霸的“取词”功能,就用到了Hook 计技术。
钩子的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入系统。钩子的种类很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对此消息的控制权。此时在钩子函数中就可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。
从钩子的本质来看,可以优先截获操作系统的各种消息进行处理,所以它几乎无所不能,因为windows 的应用程序都是基于消息驱动的,应用程序的操作都依赖于它所得到的消息的类型及内容。
如果Hook 过程在应用程序中实现,若应用程序不是当前窗口时,该Hook 就补齐作用;如果Hook 在DLL 中实现,程序在运行中动态调用它,它能实时对系统进行监控。根据
需要,我们采用的是在DLL 中实现Hook 的方式。
(应用程序exe? 和DLL 的区别所在)
文本文件存储原理
字符被计算机处理时都是以二进制代码的形式出现的,即一个字符对应一个8 位二进制数,这种二进制码的集合就是所谓的ASCII 码。
基本的ASCII 码有128 个,最高位都是0 ,对应的十进制数是0-127 。键盘上的字符,如英文字母、数字和一些常用符号,使用基本ASCII 部分。如数字“ 0 ”的ASCII 码用二进制数表示就是00110000 (即十进制数48 )。
扩展的ASCII 码有128 个,最高位是1 ,对应的十进制数是128-255 。一些制表符和其他符号使用扩展的ASCII 码部分。
为解决汉字的存储和显示问题,我国制定了国际GB2312 。据此规定,一个汉字由2 个
扩展的ASCII 码组成,这种高位为1 的双字节汉字编码就是汉字的机内码,简称为内码。例如,汉字“学”的机内码用二进制数表示就是11010001 10100111 (即十进制数206 和167 ),用十进制表示就是53671 (206*256+167 )。对于字符,文本文件存储的是它的ASCII 码,对于汉字,文本文件存储的是它的内码,即两位ASCII 码,如字符串“ 0 学
0 ”,在文本文件中存储的内容是00110000 11010001 10100111 00110000
正确的文本文件读写过程
1. 定义文件变量;
2. 打开指定的文件;
3. 向从文本文件中写入信息;
4. 从文本文件中读取信息;
5. 关闭文件
下面具体介绍如何实现这些过程。
1. 定义文件变量
定义文件变量格式:CStdioFile 文件变量;
例如,定义一个名称为f1 的文件变量,语句如下:CStdioFile f1;
2. 打开指定文件
可以直接通过CStdioFile 的构造函数来打开磁盘文件,同时可以用标志位指定打开方式(只读、只写、读写等):
CStdioFile(LPCTSTR lpszFileName,UINT nOpenFlags);
其中,lpszFileName 表示要打开的文件名,可以是相对路径或绝对路径
nOpenFlags 设置文件打开方式标志位,可以指定用“ | ”连接多个标志位。下面是常用的打开标志:
CFile::typeText :以文本文件的形式打开文件
CFile::typeBinary :以二进制文件的形式打开文件
CFile::modeCreate :如果指定文件名的文件不存在,则新建文件;如果文件存在并且没有设置CFile::modeNoTruncate 标志,则清空文件。
write的返回值CFile::modeNoTruncate :如果文件存在,不把它的长度删除为0 (即不清空文件中的数据)。
CFile::modeRead :以只读方式打开文件
CFile::modeReadWrite :以可读可写方式打开文件
CFile::modeWrite :以只写方式打开文件
CFile::shareDenyNone :文件打开后,不禁止其他进程对文件的读写操作
CFile::shareExclusive :文件打开后,禁止其他进程对文件的读写操作
CFile::shareDenyRead :文件打开后,禁止其他进程对文件的读操作
CFile::shareDenyWrite :文件打开后,禁止其他进程对文件的写操作
此外,可以不在构造函数中打开文件,而仅仅调用空的构造函数CStidoFile (),然后用CStdioFile::Open() 打开文件。Open 函数的前两个参数和非空构造函数的参数相同,其声明如下:
BOOL Open(LPCTSTR lpszFileName,UINT nOpenFlags,CFileException* pError=NULL); 第3 个参数与打开失败时的异常处理有关。
实例  1 :以只读方式打开一个文件
步骤:
使用AppWizard 创建一个对话框应用程序,删除其自动产生的所有控件,添加一个Button 控件。双击控件,在相应的函数里添加代码:
char * pszFileName="C:\\";
CStdioFile myFile;
CFileException fileException;
if(!myFile.Open(pszFileName,CFile::modeCreate|CFile::typeText|CFile::modeRead), &fileException)
{
TRACE("Can't open file %s, error = %u\n",pszFileName,fileException.m_cause);
}
运行结果:如果C:\ 下没有 文件,则新生成该文件。
3. 向从文本文件中写入信息
CStdioFile 提供了函数WriteString 来向文本文件中写入文本,WriteString 函数的格式如下:
void WriteString(LPCTSTR lpsz);
WriteString 的参数lpsz 是一个以”\0” 字符结束的字符串,要把这个字符串的内容写入文件。
提示:使用WriteString 函数时,如果希望每执行一次WriteString ,文本文件中的内容就会自动换行一次,那么就需要在需要换行的地方输出“ \n ”:
myFile.WriteStri ng(“ 第1 行\n”) ;
实例  2 :向文件中写入文本
建立MFC 基于对话框的程序,删除自动添加的所有控件,添加一个“确定”按钮,双击按钮,按默认添加事件函数,双击按钮,在相应的函数处添加如下代码:
char* pszFileName="C:\\";
CStdioFile myFile;
CFileException fileException;
if(myFile.Open(pszFileName,CFile::typeText|CFile::modeCreate|CFile::modeReadW rite),&fileException)
{
myFile.WriteString(" 第1 行\n");
CString strOrder;
strOrder.Format("%d,%.3f",66,88.88);
myFile.WriteString(strOrder);
}
else
{
TRACE("Can't open file %s,error=%u\n",pszFileName,fileException.m_cause);
}
程序运行结果:C:\ 文件中内容如下:
第1 行
66,88.880
4. 从文本文件中读取信息
CStidoFile 提供了函数ReadString 来读取文本,ReadString 有两种形式,一种为:virtual LPTSTR ReadString(LPTSTR lpsz, UINIT nMax);
ReadString 函数的参数如下:
lpsz :是用户提供的一个指向字符串的指针,它用来接受从文件读出的文本,以”\0” 结束。
nMax 是本次所允许读入的文本字符个数,不计“ \0” 字符,也就是说最多能读入nMax-1 个文本字符。
ReadString 的返回值是一个LPTSTR 类型的指针,它指向从文件读出的文本字符串,如果到达文件尾,则返回NULL 。
ReadString 的另一种形式为:
BOOL ReadString(CString& rString);
参数rString 用来容纳从文件读出的文本。
CString 版本忽略回车换行符,返回值是一个布尔值。如果返回值为FALSE ,表示因到达文件尾而没有读到任何字符。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。