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);
(3)fflush函数:将缓冲区中的数据立即写入文件
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)构造函数:CFile(LPCTSTR lpszFileName,UINT nOpenFlags);//共享和访问方式
(3)文件的写入:Write方法
(4)文件的读取:Read方法
(5)CFileDialog类
1.CFileDialog—CCommonDialog—CDialog
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类提供了两个函数:GetPathName和GetFileName,其中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文件中(现在基本不用)
(2)Win,ini文件的写入:Win32 API函数WriteProfileString,该函数的作用是将一个字符串复制到Win.ini文件的指定段中
(3)Win.ini文件的读取:Win32 API函数GetProfileString,该函数的作用时获取初始化文件Win.ini中的指定段下的一个字符串
(4)CWinApp中也有WriteProfileString和GetProfileString函数
BOOL WriteProfileString(LPCTSTR lpszSection,LPCTSTR lpszEnter,LPCTSTR lpszValue);
//要写入的段名,项名,项的值
//在Windows NT系统中,该函数是把信息存储到注册表中,而不是Win.ini文件
CString GetProfileString(LPCTSTR 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分支下写入的