写文件是编程中很常用的手段。我们通常可以利用系统提供的API函数CreateFile去创建或打开一个文件(是创建还是打开在参数中可以设置)
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
然后如果返回的句柄不是INVALID_HANDLE_VALUE时就代表打开或创建成功了。然后利用可以写文件和读文件了
BOOL WriteFile(
HANDLE hFile, //CreateFile反回的句柄
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
);
BOOL ReadFile(
HANDLE hFile, ////CreateFile反回的句柄
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
其中还有几个很有用的函数比如
BOOL SetEndOfFile( //把文件目前的Pointer挪到文件尾
HANDLE hFile
);
DWORD SetFilePointer( //设置文件目前的Pointer
HANDLE hFile,
LONG lDistanceToMove,
PLONG lpDistanceToMoveHigh,
DWORD dwMoveMethod
);
此外还有系统几个函数比如:
BOOL SetFileAttributes( //设置文件属性
LPCTSTR lpFileName,
DWORD dwFileAttributes
);
BOOL GetFileTime( //取得文件时间
HANDLE hFile,
LPFILETIME lpCreationTime,
LPFILETIME lpLastAccessTime,
LPFILETIME lpLastWriteTime
);
BOOL SetFileTime( //设置文件时间
HANDLE hFile,
const FILETIME* lpCreationTime,
const FILETIME* lpLastAccessTime,
const FILETIME* lpLastWriteTime
);
以上是利用系统的API函数来实现读写文件的方法
MFC中有一个封装了以上这些API函数操作的类叫做CFile类。一般对文件操作方法都有。而且更加简单易用。下面举一个小例子
//创建一个结构体记录,定义学生基本信息结构
typedef struct _CStudentData
{
TCHAR xsbh[20]; //学生编号
TCHAR xsxm[20]; //学生姓名
TCHAR xb[20]; //学生性别
}CStudentData;
//定一个该结构体的一个实例
CStudentData studentsdata;
//给这个结构体实例附值
CString m_xsbh = L"01";
CString x_sxm = L"李楠";
CString x_b = L"男";
wcscpy(studentsdata.xsbh,m_xsbh);
wcscpy(studentsdata.xsxm,x_sxm);
wcscpy(studentsdata.xb,x_b);
const LPCTSTR STUDENTFILEPATH = _T("\\Storage Card\\student.dat");
//创建数据库
CFile stuFile;
if (!stuFile.Open(STUDENTFILEPATH,CFile::modeCreate|CFile::modeWrite))
{
AfxMessageBox(_T("创建数据库失败"));
}
stuFile.Close();
//写入文件
stuFile.Open(STUDENTFILEPATH,CFile::modeRead | CFile::modeWrite);
stuFile.SeekToEnd();
stuFile.Write(&studentsdata,sizeof(studentsdata));
stuFile.Close();
//试着读取出来
if (stuFile.Open(STUDENTFILEPATH,CFile::modeRead))
{
do
{
dwRead = stuFile.Read(&studentsdata,sizeof(studentsdata));//每次读出一条记录。
if (dwRead != 0 )
{
//循环读出每条记录
//m_lstStudent.AddTail(studentData);
AfxMessageBox(studentsdata.xsbh);
AfxMessageBox(studentsdata.xsxm);
AfxMessageBox(studentsdata.xb);
}
}while(dwRead > 0);
//关闭数据文件
stuFile.Close();
}
//关于CFile类的用法可以看《EVC高级编程及其应用开发》源代码中FileExam那个例子。此外北京那边封装的那个SpFile类也可以拿来用了。这个类很好很强大。