MFC中文件操作、查找与选择总结_第1页
MFC中文件操作、查找与选择总结_第2页
MFC中文件操作、查找与选择总结_第3页
MFC中文件操作、查找与选择总结_第4页
MFC中文件操作、查找与选择总结_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、MFC总结(一):MFC中文件操作、查找与选择总结(1) 本文主要涉及以下几个方面,均为在MFC编程中较为常用的:CFile操作、CArchive操作、如何选择文件和文件夹、如何查找文件、获取当前目录、_access函数等。     (一)使用CFile类操作文件       CFile类在MFC的文件操作中应该是最常用的了。主要的成员函数有Open、Close、Write、Read、Seek、SeekToEnd、GetLength、GetPosition,具体用法见MSDN。

2、0;      (1)文件打开操作:        文件打开有两种方式,一种是先定义类对象,在用Open函数打开;一种是在定义类对象时传入文件名和打开方式。分别如下        CFile file;        if(!file.Open(lpszFileName, nOpenFlags )     &

3、#160;        return;       或       CFile file(lpszFileName, nOpenFlags);      (2)文件打开方式:       文件打开方式,即上述nOpenFlags的值主要由一些宏定义的值组合而成,具体见MSDN,常用的有如下几种:   

4、60;   A. CFile:modeCreate |  CFile:modeNoTruncate |CFile:modeWrite ,以写文件的方式打开,如果文件不存在,则新建文件,否则打开已有文件进行写入操作,此时不会清空原有文件;       B. 将上述CFile:modeWrite更换为CFile:modeRead 或者CFile:modeReadWrite 可实现读操作或者同时读写。    (3

5、)判断文件结束     判断文件是否结束,没有结束则继续读取,否则关闭退出。这点在编程时常用。对于CFile常用的判断文件结束的方法是:    while(file.GetPosition() < file.GetLength()       /文件未结束           /Add code .        (4)值得注意的几点:  &

6、#160;  A. 当文件名中包含路径时,要注意使用,如C:MyFile.DAT,在Unicode下时,需要使用_T("C:MyFile.DAT");     B. 采用(2)中A方式写文件时,注意使用file.SeekToEnd()将文件指针移至文件尾,再写入,否则会覆盖已有的数据,这点经常被很多初学者忽视;     C. 在打开文件后就要紧接着写下Close,养成这样的习惯,避免忘记关闭文件。特别是在对某个读出的数据进行判断,如何符合条件则函数返回,此时一定要切记返回前关闭文件;&

7、#160;    D. CFile读写文件都是按照字节来实现的。        未完,待续。 MFC总结(一):MFC中文件操作、查找与选择总结(2)(二)CArchive类操作     CArchive类实现数据的缓冲区读写,同时定义了类对象的存储与读取方案。 在文档视图编程,结合CList和CArray等可很方便的实现数据读写。     (1)基本数据读写-显示创建CArchive对象  &#

8、160;  A.  使用CArhive类之前,必须要有一个CFile文件对象,同时必须保证CArchive的操作必须是在CFile处于打开状态,且操作期间文件状态不会发生变化。     B. 然后定义CArchive对象,将其与CFile对象关联,并指定其模式是用于缓冲区读还是写:      CArchive ar (pFile,             /目标文件,CFile对象指针   

9、60;                          nMode,        /操作方式, 读/写             

10、0;                nBufSize,    /指定缓冲区大小,默认为4096                          &#

11、160;   lpBuf           /缓冲指针,默认为NULL,即从本地堆中取出一块内存空间,操作结束后自动释放                            );  &#

12、160;   C.对于基本数据类型,可直接使用operator >>和operator <<进行数据读出和写入。这些数据类型BYTE、WORD、LONG、DWORD、float、double、int、short、char、unsigned u等。 对于CString对象也可使用。       对于自定义的结构体数据类型,我们自己可以重载这两个运算符,一个示例如下。cpp view plaincopy1. typedef struct test_st &

13、#160;2.   3.      float valueX;  4.      float valueY;  5.   6.      /重载<<和>>运算符  7.     friend CArchive& AFXAPI o

14、perator <<(CArchive& ar, const test_st& info)  8.     9.         /保存  10.        ar<<info.valueX<<info.valueY;  11.  &#

15、160;     return ar;  12.     13.    friend CArchive& AFXAPI operator >>(CArchive& ar, test_st& info)  14.      15.    

16、0;    /读取  16.         ar>>info.valueX>>info.valueY;  17.         return ar;  18.      19. TEST;     &#

17、160; D. 使用Read和Write可实现指定数据长度的数据写入/读取,这里的数据长度指的是字节数。         使用WriteString可写入字符串,ReadString可读出一行字符。注意这里WriteString并不是写入一行字符串,WriteString写入的字符串时不会写入'0',也不会自动写入'n'。下面是来自MSDN的一个例子,相信能说明问题。cpp view plaincopy1. CFile myFile("myfile&qu

18、ot;, CFile:modeCreate | CFile:modeReadWrite);  2. CString str1="String1", str2="String2", str;  3.   4. / Create a storing archive.  5. CArchive arStore(&myFile, CArchive:store

19、);  6.   7. / Write str1 and str2 to the archive  8. arStore.WriteString( str1 );  9. arStore.WriteString( "n" );  10. arStore.WriteString( str2 );  11. arStore.Writ

20、eString( "n" );  12.   13. / Close the storing archive  14. arStore.Close();  15.   16. / Create a loading archive.  17. myFile.SeekToBegin();  18. CArchive arLoad(&

21、amp;myFile, CArchive:load);  19.   20. / Verify the two strings are in the archive.  21. arLoad.ReadString( str );  22. ASSERT( str = str1 );  23. arLoad.ReadString( str&

22、#160;);  24. ASSERT( str = str2 );        E. IsLoading 和 IsStoring函数常用来判断是读取还是写入。          Close函数用于切断与CFile对象的关联,在这之前会自动调用Flush将缓冲区数据写入存储媒质中。     F. 在程序中,如果没有调用函数Flush()

23、,那么真正将数据写入到物理磁盘是在调用函数Close()关闭时。因此,一些重要的数据需要使用Flush()函数立即写入文件,以防丢失。      (2)类对象的读写       A. 利用CArchive保存/加载一个类对象,则此类必须支持串行化。      B. 自定义串行化类的五个步骤:          继承CObject类; &#

24、160;        重载CObject类的Serialize成员函数;          在类的.h文件中,进行串行化的声明:DECLARE_SERIAL(类名);          定义一个无参数的构造函数;          在类的.cpp文件中,进行

25、声明:IMPLEMENT_SERIAL(类名, CObject, 版本号)      C. 在自定义的类的Serialize成员函数下,使用上述(1)中的方法,保存/加载基本数据类型。如下。在需要文件操作的地方,直接调用该函数即可。cpp view plaincopy1. void CXXXX:Serialize(CArchive &ar)  2.   3.      if (ar.IsStoring()&#

26、160; 4.          /保存  5.           /Add code.  6.        7.      else  8.      &

27、#160;  /读取  9.   10.         /Add code.  11.        12.          D. 利用此方法,可实现数据的分布式保存。通常在文档视图编程时,我们在文档类下定义数据对象,然后在其Serialize函数下实现数据的保存/加载即可。

28、通常我们会定义一个容器,用来存放数据。例如,在我的项目中,我使用了CTypedPtrList<CObList, CObject*> m_DataList;这是一个链表,里面元素为CObject类对象的指针,当我们自定义了支持串行化的类后,就可以把数据加入到这个链表中,很方便的实现数据管理和存储。MFC总结(一):MFC中文件操作、查找与选择总结(3)(三)为保存文件选择路径    A. 使用SHBrowseForFolder函数创建一个对话框,用于选择路径。其原型为           

29、60;        LPITEMIDLIST SHBrowseForFolder(LPBROWSEINFO lpbi)其中,返回值是一个指针,一个项目标识符列表,如果用户选择了取消的话,则返回NULL。输入参数lpbi为BROWSEINFO结构体指针,用于设置对话框的一些属性,其结构分析如下。cpp view plaincopy1. typedef struct _browseinfo   2.     HWND hwndOwner; 

30、;        /路径选择对话框的父窗口句柄,可设为this->m_hWnd  3.     LPCITEMIDLIST pidlRoot; /浏览时的初始根目录,设为NULL时为桌面目录  4.     LPTSTR pszDisplayName;  /用于保存用户选中的路径  5.    

31、; LPCTSTR lpszTitle;      /对话框标题  6.     UINT ulFlags;           /指定对话框的一些特性,为一些值的组合  7.     BFFCALLBACK lpfn;    &

32、#160;  /处理事件的回调函数,一般设为NULL  8.     LPARAM lParam;          /应用程序传给回调函数的参数,一般设为NULL  9.     int iImage;           &#

33、160; /保存被选取的文件夾的图片索引,一般设为NULL  10.  BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;   B. 当选择了一个路径后,使用函数SHGetPathFromIDList提取出选择的路径。其原型为        BOOL SHGetPathFromIDList(LPCITEMIDLIST pidl,LPTSTR pszPath)其中,输入

34、参数pidl为上述SHBrowseForFolder的返回值,输出参数pszPath为所选择路径。调用成功则返回TRUE。    C. 应用示例。cpp view plaincopy1. /更改文件保存路径  2. void CTestDlg:OnPathselect()   3.   4.      /调用两个函数SHBrowseForFolder,SHGetPathFromIDList  5. 

35、0;    LPITEMIDLIST pID;   /定义第一个函数的返回值  6.      BROWSEINFO lpbi;    /定义其输入值  7.      char pathMAX_PATH;  /保存路径  8.     &

36、#160;/为lpbi赋值  9.      memset(&lpbi,0,sizeof(BROWSEINFO);  10.      lpbi.hwndOwner=this->m_hWnd;    / 父窗口句柄  11.      lpbi.lpszTitle="请选择保存路径"  

37、;/ 显示位于对话框左上部的标题  12.      lpbi.ulFlags=BIF_EDITBOX      / 指定对话框的外观和功能的标志  13.      pID=SHBrowseForFolder(&lpbi);      /选择路径,获取ID  14.   

38、;   if(pID!=NULL)      15.        /如果成功得到  16.         SHGetPathFromIDList(pID,path);  /获取路径  17.         GetD

39、lgItem(IDC_PATH)->SetWindowText(path);   /显示路径   18.        19.   (四)选择文件    A. 使用CFileDialog类,定义一个对象。其构造函数如下。cpp view plaincopy1. CFileDialog(  2.    BOOL bOpenFileDialog,

40、          /为TRUE表示“打开”对话框,为FALSE表示“保存”对话框  3.    LPCTSTR lpszDefExt = NULL,     /指定默认的文件扩展名  4.    LPCTSTR lpszFileName = NULL,   

41、/指定默认的文件名  5.    DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,   /指定一些风格  6.    LPCTSTR lpszFilter = NULL,     /指定可供选择的文件类型和相应的扩展名  7.   

42、60;CWnd* pParentWnd = NULL,       /父窗口指针  8.    DWORD dwSize = 0  9. );     B. 文件类型和扩展名的书写格式(参数lpszFilter)    文件类型说明和扩展名之间用 | 分割;    同种文件类型的扩展名之间用;分割;

43、    每种文件类型之间用 | 分割;    末尾用 | 指明 例如,“Data Files(*.xlc;*xls)|*.xlc;*.xls|All Files(*.*)|*.*|”。其中,蓝色表示文件类型说明,粉色表示扩展名。   C. 定义CFileDialog类对象后,可使用DoModal函数来产生对话框,选择文件。在对话框“确定”返回后,可使用下列函数获取路径和文件名。    主要函数为:GetPathName,GetFileName,GetExtName, GetF

44、ileTile等。   D. 应用该类成员变量m_ofn可设置初始目录。如 dlg.m_ofn.lpstrInitialDir=_T("C:")。   E. 应用函数GetStartPosition和GetNextPathName可实现选择多个文件的情况。   F. 一个示例,用于选择单个文件。cpp view plaincopy1. /选择发送的文件  2. void CTestDlg:OnSelectfile()   3.  

45、60;4.     CString str;  5.     CFileDialog dlg(TRUE,NULL,NULL,NULL,  6.         "DATA Files(*.dat;*.txt)|*.dat;*.txt|All Files(*.*)|*.*|",this);/定义对象  7.  

46、   if(dlg.DoModal()=IDOK)  8.       9.     str=dlg.GetPathName();    /获取文件名  10.       11.   12.     UpdateData(TRUE);  13. &

47、#160;   m_nFilePath=str;  /显示路径  14.     UpdateData(FALSE);  15.   (五)在指定目录下查找文件    A. 使用CFileFind类可查找指定目录下的文件,涉及的函数有查找函数FindFile和FindNextFile,获取文件属性函数和判断文件属性函数,详见MSDN。    B. 对于查找函数,cpp view

48、 plaincopy1. BOOL FindFile(  2.    LPCTSTR pstrName = NULL,  /查找的文件说明  3.    DWORD dwUnused = 0        /必须为0  4. );  5. virtual BOOL Fi

49、ndNextFile(); /返回非0表示还有符合条件的文件,返回0表示是最后一个符合条件的文件   需要查找的文件名pstrName可设为以下几种:                               "E:VC+example.txt"   “E:VC+ex*.txt”   &

50、quot;E:VC+*.*"     C.一个示例。cpp view plaincopy1. CFileFind finder;  2. BOOL bResult = finder.FindFile(_T("C:te*.dat");  3. while(bResult)  4.   5.     bResult = finder.Find

51、NextFile();  6.     cout<<(LPCTSTR)finder.GetFileName()<<endl;  7.    (六)获取可执行程序所在的目录   A. 对于API函数GetCurrentDirectory虽然从字面意思上看是获取当前目录,其实获取的并不是.exe执行文件所在的目录,而是其上一级目录。例如,程序安装在桌面上,我们通过该函数获取的路径是C:Documents and SettingsAdministrator,而不是C:Documents and SettingsAdministrator桌面。   B. 如需获取程序执行时所在的目录,可使用另外一个API函数:GetModuleFileName。采用该函数可获取程序当前执行的文件名(包含完整的路径),然后结合_tsplitpath函数可分解出路径、文件名、扩展名,再根据需要进行组合。   C. 下面是本人在程序中常使用的一个函数:cpp view plaincopy1. /获取当前程序运行目录  2. CString GetCurrentDi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论