《VC++深入详解》学习笔记 第十二章 文件和注册表操作

来源:互联网 发布:mac系统大写键打不开 编辑:程序博客网 时间:2024/06/05 18:34

1.C语言对文件操作的支持

1)打开文件:fopen

   FILE* fopen(const char* filename,const char* mode);//mode文件打开模式(r+,w+,a+,b

2)文件写入:fwrite

size_t fwrite(const void* buffer,size_t size,size_t count,FILE* stream);

3fflush函数:将缓冲区中的数据立即写入文件

     C语言对文件的操作使用了缓冲文件系统,一般是缓冲区满才写入文件

4)文件定位指针:fseek

     int fseek(FILE* stream,long offset,int origin);//SEEK_CUR;SEEK_END;SEEK_SET

5)文件读取:fread

     size_t fread(void* buffer,size_t size,size_t count,FILE* stream);

6)得到当前文件指针位置:ftell

7)文件的关闭:fclose()

8)文本方式和二进制方式

2.C++对文件操作的支持

1)写入数据:ofstream

      ofstream(const char* szName,int nMode = ios::out,int nPort = filebuf::openprot);

//文件打开模式:ios::in, ios::out ,ios::app(末尾添加)ios::trunk(清空),ios::binary(二进制)…

// nPort指定文件保护规格说明(兼容,独占,共享等)

         ofstream类的write方法写入,写入完成后要调用close方法关闭

2)读取数据:ifstream

     Ifstream类的read方法读取,读取完毕后要调用close方法关闭

3.Win32 API对文件操作的支持

1)创建或打开文件:CreateFile(打开对象:文件,管道,邮槽,通信资源,磁盘文件,控制台,目录(仅打开))

函数原型:HANDLE CreateFile(

              LPCTSTR lpFileName,//指定用于创建或打开的对象名称

              DWORD dwDesiredAccess,//指定对对象的访问方式(读访问,写访问,读写访问,设备查询访问等)

              DWORD dwShareMode,//指定共享方式

 LPSECURITY_ATTRIBUTES  lpSecurityAttributes,//指向LPSECURITY_ATTRIBUTES结构的指针,用来确定返回的句柄是否能够被子进程继承

               DWORD dwCreationDisposition,//指定如何创建文件

               DWORD dwFlagsAndAttributes,//设置文件属性和标识

               HANDLE hTemplateFile//指定具有GENERIC_READ访问方式的模板文件的句柄(新文件使用该句柄相关联的文件的属性标识)

);

2)写入文件:WriteFile

    函数原型:BOOL WriteFile(

                HANDLE hFile,//要写入数据的文件的句柄

               LPCVOID lpBuffer,//包含将要写入文件的数据的缓冲区指针

               DWORD nNumberOfBytesToWrite,//写入的字节数

              LPDWORD lpNemberOfBytesWritten,//接受实际写入到文件中的字节数

          LPOVERLAPPED lpOverlapped//指向OVERLAPPED结构体的指针,这个参数要想起作用,CreateFile打开文件设置文件属性时要添加FILE_FLAG_OVERLAPPED标记,告诉系统需要异步访问这个文件。默认情况下是以同步IO方式访问文件

);

3)读取文件:ReadFile

函数原型:BOOL ReadFile

            HANDLE hFile,//文件句柄

            LPVOID lpBuffer,//缓冲区指针(接受读取的数据)

            DWORD nNumberOfBytesToRead,//读取的字节数

          LPDWORD lpNumberOfBytesRead,//接受实际读到的字节数

        LPOVERLAPPED lpOverlapped//异步,同WriteFile

);

4.MFC对文件操作的支持:CFile

1)该类提供了没有缓存的二进制格式的磁盘文件输入输出功能。

2)构造函数:CFileLPCTSTR lpszFileName,UINTnOpenFlags;//共享和访问方式

3)文件的写入:Write方法

4)文件的读取:Read方法

5CFileDialog

     1.CFileDialogCCommonDialogCDialog

     2.构造函数:CFileDialog(BOOL bOpenFileDialog,LPCTSTR lpszDefExt = NULL,LPCTSTR lpszFileName = NULL,DWORD dwFlags = OFN_HIDEREADONLY|DFN_OVERWRITEPROMPT,

LPCTSTR lpzeFilter = NULL,CWnd* pParentWnd = NULL);

// bOpenFileDialog TRUE:打开对话框;FALSE:保存为对话框

//lpseDefExt指定默认的文件扩展名

// lpszFileName指定显示在文件对话框中的初始文件名

// dwFlags定制文件对话框,取值与OPENFILENAME结构体中的Flags字段相同

// lpzeFilter 指定一个或一组文件过滤器,只有选择的文件才出现在文件列表框

// pParentWnd 一个CWnd指针,指定文件对话框的父窗口或拥有者窗口

6)通过CFileDialog类的数据成员m_ofn可以改变对话框的标题,过滤器等信息

fileDlg.m_ofn.lpstrFilter = “Text File(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0”;

7)为了获取用户输入的文件名,CFileDialog类提供了两个函数:GetPathNameGetFileName,其中GetPathName返回文件的完整路径;GetFileName返回文件的文件名

     If(IDOK == fileDlg.DoModal())

{

       CFile file(fileDlg.GetFileName(),CFile::modeCreate|CFile::modeWrite)’

       file.Write(“ aaa”);

       file.Close();

}

5.Win.ini文件的访问

1)将初始化信息写入配置文件中,当程序启动时从这个配置文件中读取初始化信息

现在大部分软件都将这些信息写入注册表,但早期一些程序时写入Win.ini文件中(现在基本不用)

2Win,ini文件的写入:Win32 API函数WriteProfileString,该函数的作用是将一个字符串复制到Win.ini文件的指定段中

3Win.ini文件的读取:Win32 API函数GetProfileString,该函数的作用时获取初始化文件Win.ini中的指定段下的一个字符串

4CWinApp中也有WriteProfileStringGetProfileString函数

     BOOL WriteProfileStringLPCTSTR lpszSection,LPCTSTR lpszEnter,LPCTSTR lpszValue;

//要写入的段名,项名,项的值

//Windows NT系统中,该函数是把信息存储到注册表中,而不是Win.ini文件

  CString GetProfileStringLPCTSTR lpszSection,LPCTSTR lpszEnter,LPCTSTR lpszDefault = NULL;

//要读取的段名,项名,项的默认值

6.注册表的编程(Win32 API

   1)创建键:RegCreateKey,该函数的作用是创建指定的注册表项,如果这个项已经存在,则该函数打开这个表象

        函数原型:LONG RegCreateKey

                    HKEY  hKey,//指向当前打开表项的句柄或预定义的保留句柄之一

                  LPCTSTR  lpSubKey,//字符串指针,指示这个函数将打开或创建的表项的名称,这个表项必须是由hKey参数所标识的项的子项

                    PHKEY  phkResult//返回值,指向一个变量的指针,用来接受创建或打开的表项的句柄,当不再需要此返回的注册表句柄时,调用RegCloseKey关闭这个句柄

);

   2)打开键:RegOpenKey,该函数将打开指定的注册表项

       函数原型:LONG RegOpenKey

                   HKEY hKey,

                LPCTSTR lpSubKey,

                  PHKEY phkResult//指向一个变量的指针,该变量保存此函数所打开的注册表项的句柄,当不再需要此返回的注册表项句柄时,调用RegCloseKey关闭这个句柄

);

   3)写入注册表:RegSetValue,设置指定注册表项的默认值或者未命名值的数据(在注册表中对值来说,包含三个部分:值名称、值类型和值本身

       函数原型:LONG RegSetValue

                   HKEY hKEY,

                LPCTSTR lpSubKey,//该函数为该参数指定的子项设置默认值,如果此参数是NULL,或指向一个空的字符串,那么此函数将为参数hKey所指定的注册表项设置默认值

                DWORD dwType,//指示将被存储的信息类型,该参数必须是REG_SZ类型,实际上就是字符串类型,如果要存储其他类型的数据,必须用另一个函数:RegSetValueEx

               LPCTSTR lpDate,//包含了要为指定项的默认值设置的数据(字符串)

                DWORD cbData//指示lpData参数所指向的字符串的大小,不包括最后的空终止符(以字节为单位)

);

       如果想要设置注册表项下不是默认值,即有名称值的数据和类型时,可以调用RegSetValueEx函数,该函数将在注册表项下设置指定值的数据和类型

      函数原型:LONG RegSetValueEx(

                 HKEY hKey,

              LPCTSTR lpValueName,//指向一个包含了欲设置值的值名称的字符串,若拥有该名称的值并不存在于指定的注册表项中,则此函数将其加入到该项中

              DWORD Reserved,//保留,必须为0

              DWORD dwTyoe,//指定将被存储的值的数据类型

        CONST BYTE* lpData,//指向一个缓冲区,包含了欲为指定值名称存储的数据

            DWORD cbData//指定由lpData参数所指数据的大小(字节)

);

   4)从注册表中读数据:RegQueryValue,该函数可以获得指定注册表项默认的值或未命名的值相关的数据

        函数原型:LONG RegQueryValue

                     HKEY hKey,

                  LPCTSTR lpSubKey,

                  LPTSTR lpValue,//是一个返回值,指向一个缓存区,用来获取与指定子项默认值相关的一个字符串

                  PLONG lpcbValue//指向一个变量,指定使用此参数指定的buffer的大小

);

        如果在调用该函数时,将其第三个参数设置为NULL,第四个参数设置为非NULL,那么该函数将返回存储数据的大小,若在调用RegQueryValue函数时还不知道将要获取的数据的大小,可以连续调用两此该函数,第一次调用该函数得到将要获取的数据的长度,然后动态分配内存,接着再调用该函数得到数据

        如果想要读取注册表项下不是默认值,即有名称值的数据和类型时,可以调用RegQueryValueEx函数,该函数将读取注册表项下指定值的数据和类型

       函数原型:LONG RegQueryValueEx

                  HKEY hKey,

                LPTSTR lpValueName,//指向一个字符串,包含想要查询的值的名称

             LPDWORD lpReserved,//保留,必须为NULL

             LPDWORD lpType,//指向一个变量的指针,该变量用于接受保存在指定值中的数据的类型代码

              LPBYTE  lpData,//指向缓冲区的指针,该缓冲区接受该值的数据

             LPDWORD lpcbData//指向一个变量的指针,该指针指示由参数lpData所指向的缓冲区的大小(字节),函数返回时,此参数所指向的变量包含了实际复制到缓冲区的字节数

);

7.在向注册表中写入软件信息时,通常都是在HKEY_LOCAL_MACHINE分支下写入的

原创粉丝点击