您的位置:首页 > 其它

关于写文件(系统API函数&CFile类)

2008-10-15 10:19 281 查看
写文件是编程中很常用的手段。我们通常可以利用系统提供的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类也可以拿来用了。这个类很好很强大。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: