12.3C++对文件操作的支持

在C++中,向文件写入数据可以用ofstream类来实现
ofstream( const char* szName, int nMode = ios::out, int nProt = filebuf::openprot );
第一个参数是要打开的文件名;第二个参数指定文件打开的模式;第三个参数指定文件保护规格。

下面利用ofsream类实现文件的写入操作:

void CFileView::OnFileWrite() 
{
 // TODO: Add your command handler code here
 ofstream ofs("4.txt");
 ofs.write("vc++",strlen("vc++"));
 ofs.close();
}

首先构造一个ofstream对象,然后利用方法write写入数据,最后关闭对象。
同时在视类的头文件中包含:#include “fstream”,运行程序,File工程目录下就出现了相应的文件。

C++在读取文件的时候,用ifstream类:

void CFileView::OnFileRead() 
{
 // TODO: Add your command handler code here
 ifstream ifs("4.txt");
 char ch[100];
 memset(ch,0,100);
 ifs.read(ch,100);
 ifs.close();
 MessageBox(ch);
}

12.4Win32API对文件操作的支持

12.4.1文件的创建和打开

CreateFile函数将创建一个文件对象,并返回一个读取该对象的句柄。

HANDLE CreateFile(
  LPCTSTR lpFileName,        // 创建或打开的对象的名称
  DWORD dwDesiredAccess,     // 指定对象访问方式
  DWORD dwShareMode,         // 指定共享方式,为0表示不能共享
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  // 返回的句柄能否被子进程继承,为NULL表示不能被子进程继承
  DWORD dwCreationDisposition,  // 指定如何创建文件
  DWORD dwFlagsAndAttributes,  // 设定文件属性和标志
  HANDLE hTemplateFile  
  //指定具有GENERIC_READ访问方式的模板文件的句柄              
);

12.4.2文件的写入

Win32API提供WriteFile函数想文件中写入数据,并同时指定同步还是异步方式完成写入操作:

BOOL WriteFile(
  HANDLE hFile,                // 指定要写入文件的句柄
  LPCVOID lpBuffer,            // 要写入文件数据的指针(地址)
  DWORD nNumberOfBytesToWrite, // 要写入数据的字节数
  LPDWORD lpNumberOfBytesWritten,  //接收实际写入字节数
  LPOVERLAPPED lpOverlapped    //指定同步还是异步写入,若为NULL表示同步方式,如果CreateFile中将文件属性设置为FILE_ATTRIBUTE_NORMAL,那么就是异步方式。
);
void CFileView::OnFileWrite() 
{
 // TODO: Add your command handler code here
 //定义一个句柄变量
 HANDLE hFile;
hFile=CreateFile("5.txt",GENERIC_WRITE,0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL);
 //接收实际写入的字节数
 DWORD dwWrites;
 WriteFile(hFile,"vc++",strlen("vc++"),&dwWrites,NULL);
 CloseHandle(hFile);
}

运行,文件正常生成,数据已经写入。

12.4.3文件的读取

ReadFile函数可以从文件中读取函数:

BOOL ReadFile(
  HANDLE hFile,                // 要读取文件的句柄
  LPVOID lpBuffer,             // 接收数据缓冲区地址
  DWORD nNumberOfBytesToRead,  //要读取的字节数
  LPDWORD lpNumberOfBytesRead, // 实际读取字节数
  LPOVERLAPPED lpOverlapped    // 指定同步还是异步写入
);
void CFileView::OnFileRead() 
{
 // TODO: Add your command handler code here
 HANDLE hFile;
hFile=CreateFile("5.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
 //第五个参数为OPEN_EXISTING,打开一个已有的文件
 char ch[100];
 DWORD dwReads;
 ReadFile(hFile,ch,100,&dwReads,NULL);
 ch[dwReads]=0;
 CloseHandle(hFile);
 MessageBox(ch);
}

12.5MFC对文件操作的支持

MFC中支持文件操作的基类是CFile。
CFile( LPCTSTR lpszFileName, UINT nOpenFlags );
第一个参数是指定文件的名称;第二个参数是指定文件共享和访问方式。

12.5.1文件的写入

void CFileView::OnFileWrite() 
{
 // TODO: Add your command handler code here
 CFile file("6.txt",CFile::modeCreate|CFile::modeWrite);
 file.Write("vc++",strlen("vc++"));
 file.Close();
}

12.5.2文件的读取

void CFileView::OnFileRead() 
{
 // TODO: Add your command handler code here
 CFile file("6.txt",CFile::modeRead);
 char *pBuf;
 DWORD dwFileLen;
 dwFileLen=file.GetLength();
 pBuf=new char[dwFileLen+1];
 pBuf[dwFileLen]=0;
 file.Read(pBuf,dwFileLen);
 file.Close();
 MessageBox(pBuf);
}

12.5.3CFileDialog类

下面为File程序增加一个打开文件对话框和另存为对话框的功能,可以利用CFileDialog类来完成。该类间接派生于CDialog类,因此它也是一个吻对话框类。

CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );

第一个参数如果为TRUE,就构建一个打开对话框,为false就构建一个保存为对话框。
第二个参数指定默认文件的扩展名,为NULL表示不为文件添加扩展名。
第三个参数是显示对话框中初始文件名
第四个参数是标记的组合,允许定制对话框
第五个参数是一连串的字符串对,用来指定一个或者一组文件过滤器。
第六个参数指定对话框的父窗口。

1、另存为对话框
利用CFilDiaolog类创建一个另存为对话框。

void CFileView::OnFileWrite() 
{
 // TODO: Add your command handler code here
 CFileDialog fileDlg(FALSE);
 fileDlg.Domodal();
}

运行如图所示。
在这里插入图片描述
如果想改变另存为对话框的标题,可以利用CFilDiaolog类的数据成员:m_ofn来实现。该数据成员是OPENFILENAME结构体类型,该结构体中有一个LPCTSTR类型的成员:lpstrTile,用来指定CFileDialog对话框的标题。
因此在调用DoModal函数之前添加:
fileDlg.m_ofn.lpstrTitle=“文件保存对话框”;

如果读者想设置保存类型,也就是过滤器,可以利用m_ofn这个数据成员中的lpstrFilter来完成。两个字符串之间都以’\0’分隔,最后的过滤器字符串必须以两个’\0’字符结束。第一个字符串描述过滤器,第二个字符串表明过滤用的文件扩展名称。因此在上述代码后面添加:
fileDlg.m_ofn.lpstrFilter=“Text File(.txt)\0.txt\0All Files(.)\0*.*\0\0”;
运行结果如图。
在这里插入图片描述
另外可以利用m_ofn数据成员的lpstrDefExt字段设置保存文件的默认的扩展名,在上述代码后添加:
fileDlg.m_ofn.lpstrDefExt=“txt”;

现在实现当选择某个文件名单及保存按钮时,我们就将数据写入到选择保存的文件中。为了获取用户输入的用户名CFileDialog提供了两个函数:GetPathName和GetFileName。前者获取文件完整路径名,后者获取文件名。

void CFileView::OnFileWrite() 
{
 // TODO: Add your command handler code here
 CFileDialog fileDlg(FALSE);
 fileDlg.m_ofn.lpstrTitle="文件保存对话框";
 fileDlg.m_ofn.lpstrFilter="Text File(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0";
 fileDlg.m_ofn.lpstrDefExt="txt";
 if(IDOK==fileDlg.DoModal())
 {
  CFile file(fileDlg.GetFileName(),CFile::modeCreate|CFile::modeWrite);
  file.Write("深入详解",strlen("深入详解"));
  file.Close();
 }
}

运行,发现数据已经写入了文件中。

2、打开文件对话框
再利用CFileDialog类创建一个打开文件对话框。

void CFileView::OnFileRead() 
{
 // TODO: Add your command handler code here
 CFileDialog fileDlg(TRUE);
 fileDlg.m_ofn.lpstrTitle="文件打开对话框";
 fileDlg.m_ofn.lpstrFilter="Text File(*.txt)\0*.txt\0All Files(*.*)\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;
  file.Read(pBuf,dwFileLen);
  file.Close();
  MessageBox(pBuf);
 }
}

运行之后就可以读出写入的文件中的数据了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

身影王座

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值