Windows程序设计__孙鑫C++Lesson12《文件操作》
本节要点:
1.指向常量的指针和指针常量
2.二进制文件与文本文件区别
3.C语言文件操作
4.C++文件操作
5.Win32 API文件操作
6.MFC CFile类的文件操作
7.文件保存和打开对话框的操作
8.INI文件操作
9.注册表文件操作
//***********************************************************************************************
1.指向常量的指针和指针常量
指向常量的指针,指向的内容不可改变,本身的指针值可以修改,
不能利用该指针去改变其指向的内容,但可以利用数组本身改变其内容;如:
//************************************************
char ch[5]="lisi";
const char *pStr=ch;
*pStr='w';//错误
pStr="wangwu"//可以,指针值本身可改变
//************************************************
指针常量,指针值不可修改,但其指向内容可以修改。如:
//************************************************
char ch[5]="lisi";
char * const pStr=ch;//指针常量 定义的同时必须赋初值
pStr="zhangsan";//错误,指针值不可修改
*pStr='w';//指向的内容可以修改
//************************************************
2.二进制文件与文本文件区别
文本文件打开即可见到以ASCII码形式翻译的文件,二进制文件则是文件的二进制保存形式。
文件的读操作和写操操作应该遵循打开模式一致的原则(二进制写二进制读,文本形式写入文本形式打开),否则可能出现问题。
文本文件和二进制文件的理解如下图:
文本方式和二进制方式的理解如下图:
3.C语言文件操作
(1)文件操作
打开 FILE *fopen( const char *filename, const char *mode );
写入 size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
读取 size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
关闭 int fclose( FILE *stream );
文件指针获取 long ftell( FILE *stream );
文件读写指针移动 int fseek( FILE *stream, long offset, int origin );
文件指针重定位到文件头 void rewind( FILE *stream );
文件读写模式 默认文本模式 带b为二进制模式如rb
(2)文件的及时写入
C语言文件读写引入了缓冲机制,要实现文件的及时写入使用函数int fflush( FILE *stream );函数。使用关闭文件也可以,但需要频繁打开和关闭文件.
(3)文件结束符'\0'实现(否则可能引起乱码显示)
//********************************************************
//方法一 写入时多写入一个字节 这个多写入的字节将被自动填零
fwrite("Data to Wirte",sizeof(char),strlen("Data to Wirte")+1,StreamOut);
//********************************************************
//方法二 接受缓冲区使用memset函数
char chread[100];
memset(chread,0,sizeof(chread));//加上'\0'操作方式二
//********************************************************
//方法三 获取文件长度 动态分配内存
char *pBuf;
fseek(StreamIn,0,SEEK_END);
int len=ftell(StreamIn);
pBuf=new char[len+1];
C语言文件操作实验代码如下:
//********************************************************
//写入操作
void CFileView::OnWritefile()
{
// TODO: Add your command handler code here
FILE *StreamOut=fopen("1.txt","w");
if(StreamOut!=NULL)
{
//加'\0'操作是在文件末尾多写入一个字节 方式一
fwrite("Data to Wirte",sizeof(char),strlen("Data to Wirte")+1,StreamOut);
fclose(StreamOut);//关闭文件 下次需要重新打开
}
}
//读取操作
void CFileView::OnReadfile()
{
// TODO: Add your command handler code here
/*加上'\0'操作方式二
FILE *StreamIn=fopen("1.txt","r");
char chread[100];
memset(chread,0,sizeof(chread));//
if(StreamIn!=NULL)
{
fread(chread,sizeof(char),100,StreamIn);//缓冲机制 程序关闭后写入文件
MessageBox(chread);
}
/*加上'\0'操作方式三
FILE *StreamIn=fopen("1.txt","r");
char *pBuf;
fseek(StreamIn,0,SEEK_END);
int len=ftell(StreamIn);
pBuf=new char[len+1];
//fseek(StreamIn,0,SEEK_SET);//注意 再次移动文件指针到文件头
rewind(StreamIn);//放置开头
fread(pBuf,sizeof(char),len,StreamIn);
pBuf[len]='\0';
MessageBox(pBuf);
}
//********************************************************
4.C++文件操作
C++文件操作平时用的比较少,在这里稍作介绍。
C++文件操作代码如下: 包含头文件#include "fstream.h"
//********************************************************
//写入操作
void CFileView::OnWritefile()
{
ofstream ofs("4.txt");
ofs.write("File Experiment",strlen("File Experiment"));
ofs.close();
}
//读取操作
void CFileView::OnReadfile()
{
ifstream ifs("4.txt");
char szread[100];
memset(szread,0,100);
ifs.read(szread,100);
MessageBox(szread);
}
//********************************************************
5.Win32 API文件操作
利用SDK平台提供的Win32函数进行操作,
文件操作代码如下:
//***********************************************************************************************
//写入文件
void CFileView::OnWritefile()
{
HANDLE hFile=CreateFile("5.txt",GENERIC_WRITE,0,NULL,CREATE_NEW,
FILE_ATTRIBUTE_NORMAL,NULL);
DWORD dwWrite;
if(hFile)
{
WriteFile(hFile,"File Experiment",strlen("File Experiment"),&dwWrite,NULL);
CloseHandle(hFile);
}
}
//读取文件
void CFileView::OnReadfile()
{
HANDLE hFile=CreateFile("5.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,NULL);
DWORD dwRead;
char szread[100];
memset(szread,0,100);
if(hFile)
{
ReadFile(hFile,szread,100,&dwRead,NULL);
CloseHandle(hFile);
MessageBox(szread);
}
}
//***********************************************************************************************
6.MFC CFile类的文件操作
//***********************************************************************************************
实验操作代码如下:
//写入文件
void CFileView::OnWritefile()
{
CFile File("6.txt",CFile::modeCreate|CFile::modeWrite);
File.Write("File Experiment",strlen("File Experiment"));
File.Close();
}
//读取文件
void CFileView::OnReadfile()
{
CFile File("6.txt",CFile::modeRead);
char* pBuf;
DWORD len=File.GetLength();
pBuf=new char[len+1];
pBuf[len]='\0';
File.Read (pBuf,len);
File.Close();
MessageBox(pBuf);
}
//***********************************************************************************************
7.文件保存和打开对话框的操作
利用系统生成的类CFileDialog来进行操作,设置对话框的一些参数主要是通过该类的m_ofn成员变量来实现,这是一个OPENFILENAME类型的结构体,可通过设置其中的值来设置对话框的一些特性。
实验操作代码如下:
//***************************************************************************
//利用保存对话框获得文件名 并写入文件
void CFileView::OnWritefile()
{
CFileDialog FileDlg(FALSE);
FileDlg.m_ofn.lpstrTitle="我的保存对话框";//标题设置
FileDlg.m_ofn.lpstrFilter="Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*";
FileDlg.m_ofn.lpstrDefExt ="txt";//默认后缀
if(IDOK==FileDlg.DoModal())
{
CFile File(FileDlg.GetPathName(),CFile::modeCreate|CFile::modeWrite);//获取完整路径名
File.Write("File Experiment",strlen("File Experiment"));
File.Close();
}
}
//利用打开对话框 打开文件
void CFileView::OnReadfile()
{
CFileDialog FileDlg(TRUE);
FileDlg.m_ofn.lpstrTitle="我的打开对话框";
FileDlg.m_ofn.lpstrFilter="Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*";//文件类型过滤设置
FileDlg.m_ofn.lpstrDefExt ="txt";//默认后缀
if(IDOK==FileDlg.DoModal())
{
CFile File(FileDlg.GetPathName(),CFile::modeRead);
char* pBuf;
DWORD len=File.GetLength();
pBuf=new char[len+1];
pBuf[len]='\0';
File.Read (pBuf,len);
File.Close();
MessageBox(pBuf);
}
}
//***************************************************************************
8.INI文件操作
(1)利用Win32全局函数
实验代码如下:
//***************************************************************************
::WriteProfileString("profiles","Location","China");
CString msg;
::GetProfileString("profiles","Location","Not Found",msg.GetBuffer(100),100);
AfxMessageBox(msg);
//***************************************************************************
(2)利用CWinApp类的函数
//***************************************************************************
WriteProfileString("profiles","Location","China");
//CString msg=GetProfileString("profiles","Location","Not Found");
//AfxMessageBox(msg);
//***************************************************************************
9.注册表文件操作
注册表操作注意依靠 Registry Functions实现。注意注册表函数的参数比较多,要注意弄清楚。
实验代码如下:
//***********************************************************************************************
//写入注册表
void CFileView::OnWritereg()
{
// TODO: Add your command handler code here
HKEY hKey=NULL;
DWORD dwAge=23;
RegCreateKey(HKEY_CURRENT_USER,"Software\\MFCFileEx\\profiles",&hKey);//创建键
RegSetValue(hKey,NULL,REG_SZ,"wangdingqiao",strlen("wangdingqiao"));//设置默认键键值
RegSetValueEx(hKey,"Age",0,REG_DWORD,(CONST BYTE *)&dwAge,sizeof(DWORD));//设置[Age]键的键值
RegCloseKey(hKey);//关闭键
}
//读取注册表
void CFileView::OnReadreg()
{
// TODO: Add your command handler code here
LONG Len;
DWORD dwAge,dwType,dwValue;
RegQueryValue(HKEY_CURRENT_USER,"Software\\MFCFileEx\\profiles",NULL,&Len);//获取其长度
char *pBuf=new char[Len+1];
RegQueryValue(HKEY_CURRENT_USER,"Software\\MFCFileEx\\profiles",pBuf,&Len);
MessageBox(pBuf);
HKEY hKey;
RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\MFCFileEx\\profiles",&hKey);//打开注册表项
RegQueryValueEx(hKey,"Age",NULL,&dwType,(LPBYTE)&dwAge,&dwValue);//查询其值
RegCloseKey(hKey);
CString msg;
msg.Format("Age=%d",dwAge);
MessageBox(msg);
}
//***********************************************************************************************
注册表操作操作效果如下图所示:
//***********************************************************************************************
本节小结:
1.掌握C++中指向常量的指针和指针常量的区别
2.认识二进制文件和文本文件的区别
3.全面认识文件操作,熟悉C语言、C++语言以及Win32 文件操作API,重点掌握MFC 中的CFile类的文件操作。
4.熟悉ini文件和注册表文件的操作