Queen-fly

预备知识——MFC文件操作

1.计算机是如何管理自身所存放着的大量的信息的呢?

硬盘上的信息是以文件的形式被管理的。

2.为什么要在程序中使用文件?

通常,程序中的数据在程序运行结束之后,就会从内存中清除,再次运行程序时不会自动出现。在编制程序的过程中不可避免的会遇到将某些数据永久保存的问题,当程序关闭后,依然可以使用这些数据,这时就需要进行文件操作。

3.文件类型(Visual C++处理的文件通常分为两种)

文本文件:只可被任意文本编辑器读取ASCII文本。

二进制文件:指对包含任意格式或无格式数据的文件的统称。

这里只介绍文本文件的读写,INI文件也属于文本文件的范畴,且INI文件的结构和用途与普通的文本文件不同,所以会单独介绍。

4.实例预关键知识点:客户操作记录功能

许多系统,出于安全或其他原因,常常要求随时对键盘进行监控,利用Hook(钩子)技术编写的应用程序能够很好地达到这个目的。即在软件运行过程中,用户在键盘上的按键操作会被记录下来,这样对维护软件的正常运行非常有利。

Hook技术在很多特殊软件中广泛应用,如,金山词霸的“取词”功能,就用到了Hook计技术。

钩子的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入系统。钩子的种类很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对此消息的控制权。此时在钩子函数中就可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。

从钩子的本质来看,可以优先截获操作系统的各种消息进行处理,所以它几乎无所不能,因为windows的应用程序都是基于消息驱动的,应用程序的操作都依赖于它所得到的消息的类型及内容。

如果Hook过程在应用程序中实现,若应用程序不是当前窗口时,该Hook就补齐作用;如果Hook在DLL中实现,程序在运行中动态调用它,它能实时对系统进行监控。根据需要,我们采用的是在DLL中实现Hook的方式。(应用程序exe和DLL的区别所在)

5.文本文件存储管理

字符被计算机处理时都是以二进制代码的形式出现的,即一个字符对应一个8位二进制数,这种二进制码的集合就是所谓的ASCII码。

     基本的ASCII码有128个,最高位都是0,对应的十进制数是0-127。键盘上的字符,如英文字母、数字和一些常用符号,使用基本ASCII部分。

      扩展的ASCII码有128个,最高位是1,对应的十进制数是128-255。一些制表符和其他符号使用扩展的ASCII码部分。

6.正确的文本文件读写过程

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

7.错误的文本文件读写过程

在读写文本文件的时候,最常见的错误是---操作文件不存在。这种错误产生的典型原因有:

1).路径错误

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

2).操作文件不存在

如果应用程序所有路径下面不存在MyFile.txt文件,那么在WriteString写入信息时就会出错。

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

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

8.INI文件INI文件的读写

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

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

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

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

 

正文——MFC:文件和ini文件操作

1.文件的读取与写入

新建一个MFC单文档应用程序(工程名取:File),打开菜单资源新建一个文件菜单,并在其下添加以下菜单项(ID:IDM_FILE_READ,Caption:读取)(ID:IDM_FILE_WRITE,Caption:写入),并分别给它们添加CFileView类上的命令响应,编辑:

void CFileView::OnFileWrite() 
{    
    CFile file("6.txt",CFile::modeCreate|CFile::modeWrite);//定义一个CFile对象
    file.Write("http://www.du.com",strlen("http://www.du.com"));//写入文件
}
void CFileView::OnFileRead() 
{     CFile file("6.txt",CFile::modeRead);//以读模式创建一个文件
     char *pBuf;
    DWORD dwFileLen;
    dwFileLen=file.GetLength();//获取文件长度
    pBuf=new char[dwFileLen+1];
    pBuf[dwFileLen]=0;//pBuf中文件最后一字节的下一个字节置0
    file.Read(pBuf,dwFileLen);
    file.Close();
    MessageBox(pBuf);
}

2.添加打开和另存为文件对话框

void CFileView::OnFileWrite() 
{
    CFileDialog fileDlg(FALSE);
    //Set to TRUE to construct a File Open dialog box or FALSE to construct a File Save As dialog box
    fileDlg.m_ofn.lpstrTitle="文件保存对话框";
    fileDlg.m_ofn.lpstrFilter="Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0";//设置过滤器,\0表示字符串的结尾,过滤器的结尾要以\0\0结尾
    fileDlg.m_ofn.lpstrDefExt="txt";//设置默认的扩展名
    if(fileDlg.DoModal())
    {
        CFile file(fileDlg.GetFileName(),CFile::modeCreate|CFile::modeWrite);         file.Write("http://www.baidu.com",strlen("http://www.baidu.com"));//写入文件
        file.Close();
    }
}
void CFileView::OnFileRead() 
{    
CFileDialog fileDlg(TRUE);     //Set to TRUE to construct a File Open dialog box or FALSE to construct a File Save As dialog box
     fileDlg.m_ofn.lpstrTitle="文件打开对话框";
    fileDlg.m_ofn.lpstrFilter="Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0";//设置过滤器,\0表示字符串的结尾,过滤器的结尾要以\0\0结尾
    if(IDOK==fileDlg.DoModal())
    {
        CFile file(fileDlg.GetFileName(),CFile::modeRead);
        char *pBuf;
        DWORD dwFileLen;
        dwFileLen=file.GetLength();//获取文件长度
        pBuf=new char[dwFileLen+1];
        pBuf[dwFileLen]=0;//pBuf中文件最后一字节的下一个字节置0
         file.Read(pBuf,dwFileLen);
        file.Close();
        MessageBox(pBuf);
    }
}

 

3.将初始化信息写到ini文件中

CFileApp::InitInstance()添加:
    SetRegistryKey(_T("Local AppWizard-Generated Applications"));
    WriteProfileString("http://www.baidu.com","admin","luowei");//写入win.ini当中
    LoadStdProfileSettings(); // Load standard INI file options (including MRU)

9.读出ini文件中的信息

CFileApp::InitInstance()编辑:
SetRegistryKey(_T("Local AppWizard-Generated Applications"));
 //::WriteProfileString("http://www.baidu.com","admin","luowei");//写入win.ini当中
    CString str;
    ::GetProfileString("http://www.baidu.com","admin","win_ini",str.GetBuffer(100),100);
    AfxMessageBox(str);
    LoadStdProfileSettings(); // Load standard INI file options (including MRU)
 

 

 

 

 

分类:

技术点:

相关文章: