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

写文件是编程中很常用的手段。我们通常可以利用系统提供的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类也可以拿来用了。这个类很好很强大。

你可能感兴趣的:(File类)