MFC文件的读取详细有效.docx

上传人:b****7 文档编号:10207085 上传时间:2023-02-09 格式:DOCX 页数:20 大小:22.46KB
下载 相关 举报
MFC文件的读取详细有效.docx_第1页
第1页 / 共20页
MFC文件的读取详细有效.docx_第2页
第2页 / 共20页
MFC文件的读取详细有效.docx_第3页
第3页 / 共20页
MFC文件的读取详细有效.docx_第4页
第4页 / 共20页
MFC文件的读取详细有效.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

MFC文件的读取详细有效.docx

《MFC文件的读取详细有效.docx》由会员分享,可在线阅读,更多相关《MFC文件的读取详细有效.docx(20页珍藏版)》请在冰豆网上搜索。

MFC文件的读取详细有效.docx

MFC文件的读取详细有效

运算机是如何治理自身所寄存着大量的信息的呢?

windows的磁盘治理程序为咱们提供了一套周密而又高效的信息组织动工---硬盘上的信息是以文件的形式被治理的。

面向存储的文件技术 

什么是文件?

运算机中,一篇文章、一幅图画、一个程序、一首歌曲等都是以文件的形式存储在磁盘上的,每一个文件都有一个文件名。

运算机确实是对文件按名存取的。

文件名的格式如下:

主文件名.扩展名

文件名由主文件名和扩展名两部份组成,中间用小圆点隔开,其中扩展名能够省略。

而扩展名是用来区分文件类型的。

Windows为了区分文件的类型,一些软件系统会自动给文件加上“.wps”扩展名;画图程序画的图像文件一样为“.bmp”等。

在windows中,主文件名能够由英文字符、汉字、数字和一些符号等组成,但不能利用+<>*?

\等符号。

什么是文件夹?

 

在运算机中寄存着数以万计的文件,为了便于治理这些文件,就像咱们把文件分类放到不同的抽屉中便于查阅一样,在运算机中也有像抽屉的东西,它确实是文件夹。

文件夹也要有一个名字,取名的原那么与文件的取名类似,只是不用再区分文件夹的类型,当文件夹多了以后,还能够把某些文件夹归到一个大文件夹中去。

久而久之,就组成了运算机中庞大的磁盘文件结构。

什么缘故要在程序中利用文件?

 

通常,程序中的数据在程序运行终止后,就会从内存中清除,再次运行程序时可不能自动显现。

在编制程序的进程中不可幸免地会碰到将某些数据永久保留的问题,当关闭程序后,仍然能够利用这些数据,这时就需要进行文件操作。

文件类型 

Visualc++处置的文件通常分为两种:

文本文件:

只可被任意文本编辑器读取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的双字节汉字编码确实是汉字的机内码,简称为内码。

例如,汉字“学”的机内码用二进制数表示确实是1101000110100111(即十进制数206和167),用十进制表示确实是53671(206*256+167)。

关于字符,文本文件存储的是它的ASCII码,关于汉字,文本文件存储的是它的内码,即两位ASCII码,如字符串“0学0”,在文本文件中存储的内容是00110000110100011010011100110000

正确的文本文件读写进程 

1.概念文件变量;2.打开指定的文件;3.向从文本文件中写入信息;4.从文本文件中读取信息;5.关闭文件

下面具体介绍如何实现这些进程。

1.概念文件变量 

概念文件变量格式:

CStdioFile文件变量;

例如,概念一个名称为f1的文件变量,语句如下:

CStdioFilef1;

2.打开指定文件 

能够直接通过CStdioFile的构造函数来打开磁盘文件,同时能够用标志位指定打开方式(只读、只写、读写等):

CStdioFile(LPCTSTRlpszFileName,UINTnOpenFlags);

其中,lpszFileName表示要打开的文件名,能够是相对途径或绝对途径

nOpenFlags设置文件打开方式标志位,能够指定用“|”连接多个标志位。

下面是经常使用的打开标志:

CFile:

:

typeText:

以文本文件的形式打开文件

CFile:

:

typeBinary:

以二进制文件的形式打开文件

CFile:

:

modeCreate:

若是指定文件名的文件不存在,那么新建文件;若是文件存在而且没有设置CFile:

:

modeNoTruncate标志,那么清空文件。

CFile:

:

modeNoTruncate:

若是文件存在,不把它的长度删除为0(即不清空文件中的数据)。

CFile:

:

modeRead:

以只读方式打开文件

CFile:

:

modeReadWrite:

以可读可写方式打开文件

CFile:

:

modeWrite:

以只写方式打开文件

CFile:

:

shareDenyNone:

文件打开后,不由止其他进程对文件的读写操作

CFile:

:

shareExclusive:

文件打开后,禁止其他进程对文件的读写操作

CFile:

:

shareDenyRead:

文件打开后,禁止其他进程对文件的读操作

CFile:

:

shareDenyWrite:

文件打开后,禁止其他进程对文件的写操作

另外,能够不在构造函数中打开文件,而仅仅挪用空的构造函数CStidoFile(),然后用CStdioFile:

:

Open()打开文件。

Open函数的前两个参数和非空构造函数的参数相同,其声明如下:

BOOLOpen(LPCTSTRlpszFileName,UINTnOpenFlags,CFileException*pError=NULL);

第3个参数与打开失败时的异样处置有关。

实例1:

以只读方式打开一个文件 

步骤:

利用AppWizard创建一个对话框应用程序,删除其自动产生的所有控件,添加一个Button控件。

双击控件,在相应的函数里添加代码:

      char*pszFileName="C:

\\myfile.txt";

      CStdioFilemyFile;

      CFileExceptionfileException;

      if(!

myFile.Open(pszFileName,CFile:

:

modeCreate|CFile:

:

typeText|CFile:

:

modeRead),&fileException)

      {

             TRACE("Can'topenfile%s,error=%u\n",pszFileName,fileException.m_cause);

      }

运行结果:

若是C:

\下没有myfile.txt文件,那么新生成该文件。

3.向从文本文件中写入信息 

CStdioFile提供了函数WriteString来向文本文件中写入文本,WriteString函数的格式如下:

voidWriteString(LPCTSTRlpsz);

WriteString的参数lpsz是一个以”\0”字符终止的字符串,要把那个字符串的内容写入文件。

提示:

利用WriteString函数时,若是希望每执行一次WriteString,文本文件中的内容就会自动换行一次,那么就需要在需要换行的地址输出“\n”:

myFile.WriteString(“第1行\n”);

实例2:

向文件中写入文本 

成立MFC基于对话框的程序,删除自动添加的所有控件,添加一个“确信”按钮,双击按钮,按默许添加事件函数,双击按钮,在相应的函数处添加如下代码:

      char*pszFileName="C:

\\myfile.txt";

      CStdioFilemyFile;

      CFileExceptionfileException;

      if(myFile.Open(pszFileName,CFile:

:

typeText|CFile:

:

modeCreate|CFile:

:

modeReadWrite),&fileException)

      {

             myFile.WriteString("第1行\n");

             CStringstrOrder;

             strOrder.Format("%d,%.3f",66,88.88);

             myFile.WriteString(strOrder);

      }

      else

      {

             TRACE("Can'topenfile%s,error=%u\n",pszFileName,fileException.m_cause);

      }

程序运行结果:

C:

\myfile.txt文件中内容如下:

第1行

66,88.880

4.从文本文件中读取信息 

CStidoFile提供了函数ReadString来读取文本,ReadString有两种形式,一种为:

virtualLPTSTRReadString(LPTSTRlpsz,UINITnMax);

ReadString函数的参数如下:

lpsz:

是用户提供的一个指向字符串的指针,它用来同意从文件读出的文本,以”\0”终止。

nMax是本次所许诺读入的文本字符个数,不计“\0”字符,也确实是说最多能读入nMax-1个文本字符。

ReadString的返回值是一个LPTSTR类型的指针,它指向从文件读出的文本字符串,若是抵达文件尾,那么返回NULL。

ReadString的另一种形式为:

BOOLReadString(CString&rString);

参数rString用来容纳从文件读出的文本。

CString版本忽略回车换行符,返回值是一个布尔值。

若是返回值为FALSE,表示因抵达文件尾而没有读到任何字符。

提示:

每执行一次ReadString,就会自动从文本文件中读取一行数据,同时文件操作指针会自动跳转到下一行。

实例3:

从文件中读取文本信息 

步骤:

创建基于对话框的MFC程序,删除所有自动添加的控件,添加按钮控件,为按钮添加事件,并在相应的函数处,添加如下代码:

      char*pszFileName="C:

\\myfile.txt";

      CStdioFilemyFile;

      CFileExceptionfileException;

      if(myFile.Open(pszFileName,CFile:

:

typeText|CFile:

:

modeReadWrite),&fileException)

      {

             myFile.SeekToBegin();

             CStringstr1;

             myFile.ReadString(str1);

             CStringstr2;

             myFile.ReadString(str2);

             AfxMessageBox(str1+str2);

      }

      else

      {

             TRACE("Can'topenfile%s,error=%u\n",pszFileName,fileException.m_cause);

      }

      myFile.Close();

程序运行结果:

为程序F9设置断点,然后F5单步执行,结果如下:

5.关闭文件 

对文件的操作完成后,利用CloseFile关闭文件。

函数CStdioFile:

:

Close关闭一个文件,一样一个文件利用完毕就应该关闭它:

myFile.Close();

错误的文本文件读写进程 

在读写文本文件的时候,最多见的错误是---操作文件不存在。

这种错误产生的典型缘故有:

1.途径错误 

      char*pszFileName="C:

\\Windows\\MyFile.txt";

      CStdioFilemyFile;

      CFileExceptionfileException;

      if(!

myFile.Open(pszFileName,CFile:

:

modeCreate|CFile:

:

typeText|CFile:

:

modeReadWrite),&fileException)

      {

             //文件操作代码

      }

      else

      {

             TRACE("Can'topenfile%s,error=%u\n",pszFileName,fileException.m_cause);

      }

      myFile.Close();

      由于将文件变量与一个绝对途径的文件名关联,而程序的数据通常存储在相对途径下,因此一旦相对途径和相对途径不一致时,就会犯错。

      举例而言,上一段程序本意是想从windows的安装目录下面的MyTextFile.txt文件中读取一行数据,可是若是操作系统安装的途径不是C:

\Windwos,而是C:

\Winnt,那么这段程序就会犯错。

             解决方式是在程序中利用相对途径,更正后的程序如下:

             //获取windows途径

      LPTSTRlpBuffer=newchar[MAX_PATH];

      :

:

GetWindowsDirectory(lpBuffer,MAX_PATH);

      strcat(lpBuffer,"");

      CStdioFilemyFile;

      CFileExceptionfileException;

      if(myFile.Open(lpBuffer,CFile:

:

typeText|CFile:

:

modeCreate|CFile:

:

modeReadWrite),&fileException)

      {

             //文件操作代码

      }

      else

      {

             TRACE("Can'topenfile%s,error=%u\n",pszFileName,fileException.m_cause);

      }

      CStringstrFileTitle="MyFile.txt";

      CStdioFilemyFile;

      CFileExceptionfileException;

      if(myFile.Open(strFileTitle,CFile:

:

typeText|CFile:

:

modeReadWrite),&fileException)

      {

             //文件操作代码

             myFile.WriteString("测试!

");

      }

      else

      {

             TRACE("Can'topenfile%s,error=%u\n",pszFileName,fileException.m_cause);

      }

      myFile.Close();

2.操作文件不存在 

若是应用程序所有途径下面不存在MyFile.txt文件,那么在WriteString写入信息时就会犯错。

      解决方法确实是在程序中打开文件前要检查是不是存在此文件。

如下程序:

      CStringstrFileTitle="MyFile.txt";

      CFileFindfinder;

      if(finder.FindFile(strFileTitle))

      {

             CStdioFilemyFile;

             CFileExceptionfileException;

             if(myFile.Open(lpBuffer,CFile:

:

typeText|CFile:

:

modeCreate|CFile:

:

modeReadWrite),&fileException)

             {

                    //文件操作代码

             }

             else

             {

             TRACE("Can'topenfile%s,error=%u\n",pszFileName,fileException.m_cause);

             }

      }

      else

      {

             TRACE("Can'tfindfile%s\n",strFileTitle);

      }

      myFile.Close();

3.超越文件权限进行读写操作 

      在打开文件的进程中,通过参数指定了文件的读写权限,若是读写的操作没有和相应的权限对应,就会显现错误。

      下面的程序确实是典型的忽略了文件操作权限的例子:

      CStringstrFileTitle="MyFile.txt";

      CStdioFilemyFile;

      CFileExceptionfileException;

      if(myFile.Open(strFileTitle,CFile:

:

typeText|CFile:

:

modeCreate|CFile:

:

NoTruncate|CFile:

:

modeRead),&fileException)

      {

             //文件操作代码

             myFile.WriteString("测试!

");

      }

      else

      {

             TRACE("Can'topenfile%s,error=%u\n",strFileTitle,fileException.m_cause);

      }

      myFile.Close();

支招儿:

 

1.准确信位文件的途径 

操作文件的进程中,常常需要将文本文件放在程序自身的目录中,可是若是仅仅在程序中利用不指定任何途径信息的相对途径,如:

   myFile.Open("MyFile.txt",CFile:

:

modeCreate|CFile:

:

typeText|CFile:

:

modeReadWrite);

那么就有可能显现不能正确信位的情形,准确信位文件位置的方式是取得可执行程序自身的绝对途径,如:

   TCHARFilePath[MAX_PATH];

   GetModuleFileName(NULL,FilePath,MAX_PATH);

      (_tcstchr(FilePath,'\\'))[1]=0;

      lstrcat(FilePath,_T("MyFile.txt"));

      CStdioFilemyFile;

      CFileExceptionfileException;

      if(myFile.Open(FilePath,CFile:

:

modeCreate|CFile:

:

typeText|CFile:

:

modeReadWrite),&fileException)

      {

             //文件操作代码

      }

      else

      {

             TRACE("Can'topenfile%s,error=%u\n",FilePath,fileException.m_cause);

      }

      myFile.Close();

2.读文本文件指定的一行,并取得文本文件的总行数。

 

读文本文件指定的一行,并取得文本文件的总行数

要统计文本文件的总行数,能够从头逐行读,直到文件尾,程序:

      CStdioFilemyFile;

      CFileExceptionfileException;

      if(myFi

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1