Windows程序设计__孙鑫C++Lesson12《文件操作》

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文件和注册表文件的操作

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值