在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);
}
}
运行之后就可以读出写入的文件中的数据了。