ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:21.49KB ,
资源ID:11018196      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11018196.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(MFC中文件操纵查找与选择归纳.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

MFC中文件操纵查找与选择归纳.docx

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

2、文件名和打开方式。分别如下 CFile file; if(!file.Open(lpszFileName,nOpenFlags) return; 或 CFile file(lpszFileName,nOpenFlags); (2)文件打开方式: 文件打开方式,即上述nOpenFlags的值主要由一些宏定义的值组合而成,具体见MSDN,常用的有如下几种: A.CFile:modeCreate|CFile:modeNoTruncate|CFile:modeWrite,以写文件的方式打开,如果文件不存在,则新建文件,否则打开已有文件进行写入操作,此时不会清空原有文件; B. 将上述CFile:mod

3、eWrite更换为CFile:modeRead或者CFile:modeReadWrite可实现读操作或者同时读写。 (3)判断文件结束 判断文件是否结束,没有结束则继续读取,否则关闭退出。这点在编程时常用。对于CFile常用的判断文件结束的方法是: while(file.GetPosition() 和operator 进行数据读出和写入。这些数据类型BYTE、WORD、LONG、DWORD、float、double、int、short、char、unsigned u等。 对于CString对象也可使用。 对于自定义的结构体数据类型,我们自己可以重载这两个运算符,一个示例如下。cppview p

4、laincopy1. typedefstructtest_st2. 3. floatvalueX;4. floatvalueY;5. 6. /重载运算符7. friendCArchive&AFXAPIoperator(CArchive&ar,consttest_st&info)8. 9. /保存10. arinfo.valueX(CArchive&ar,test_st&info)14. 15. /读取16. arinfo.valueXinfo.valueY;17. returnar;18. 19. TEST; D. 使用Read和Write可实现指定数据长度的数据写入/读取,这里的数据长度指的

5、是字节数。 使用WriteString可写入字符串,ReadString可读出一行字符。注意这里WriteString并不是写入一行字符串,WriteString写入的字符串时不会写入0,也不会自动写入n。下面是来自MSDN的一个例子,相信能说明问题。cppview plaincopy1. CFilemyFile(myfile,CFile:modeCreate|CFile:modeReadWrite);2. CStringstr1=String1,str2=String2,str;3. 4. /Createastoringarchive.5. CArchivearStore(&myFile,C

6、Archive:store);6. 7. /Writestr1andstr2tothearchive8. arStore.WriteString(str1);9. arStore.WriteString(n);10. arStore.WriteString(str2);11. arStore.WriteString(n);12. 13. /Closethestoringarchive14. arStore.Close();15. 16. /Createaloadingarchive.17. myFile.SeekToBegin();18. CArchivearLoad(&myFile,CArc

7、hive:load);19. 20. /Verifythetwostringsareinthearchive.21. arLoad.ReadString(str);22. ASSERT(str=str1);23. arLoad.ReadString(str);24. ASSERT(str=str2); E. IsLoading 和 IsStoring函数常用来判断是读取还是写入。 Close函数用于切断与CFile对象的关联,在这之前会自动调用Flush将缓冲区数据写入存储媒质中。 F. 在程序中,如果没有调用函数Flush(),那么真正将数据写入到物理磁盘是在调用函数Close()关闭时。因

8、此,一些重要的数据需要使用Flush()函数立即写入文件,以防丢失。 (2)类对象的读写 A. 利用CArchive保存/加载一个类对象,则此类必须支持串行化。 B. 自定义串行化类的五个步骤: 继承CObject类; 重载CObject类的Serialize成员函数; 在类的.h文件中,进行串行化的声明:DECLARE_SERIAL(类名); 定义一个无参数的构造函数; 在类的.cpp文件中,进行声明:IMPLEMENT_SERIAL(类名, CObject, 版本号) C. 在自定义的类的Serialize成员函数下,使用上述(1)中的方法,保存/加载基本数据类型。如下。在需要文件操作的地

9、方,直接调用该函数即可。cppview plaincopy1. voidCXXXX:Serialize(CArchive&ar)2. 3. if(ar.IsStoring()4. /保存5. /Addcode.6. 7. else8. /读取9. 10. /Addcode.11. 12. D. 利用此方法,可实现数据的分布式保存。通常在文档视图编程时,我们在文档类下定义数据对象,然后在其Serialize函数下实现数据的保存/加载即可。通常我们会定义一个容器,用来存放数据。例如,在我的项目中,我使用了CTypedPtrList m_DataList;这是一个链表,里面元素为CObject类对象

10、的指针,当我们自定义了支持串行化的类后,就可以把数据加入到这个链表中,很方便的实现数据管理和存储。MFC总结(一):MFC中文件操作、查找与选择总结(3)(三)为保存文件选择路径 A. 使用SHBrowseForFolder函数创建一个对话框,用于选择路径。其原型为 LPITEMIDLIST SHBrowseForFolder(LPBROWSEINFO lpbi)其中,返回值是一个指针,一个项目标识符列表,如果用户选择了取消的话,则返回NULL。输入参数lpbi为BROWSEINFO结构体指针,用于设置对话框的一些属性,其结构分析如下。cppview plaincopy1. typedefst

11、ruct_browseinfo2. HWNDhwndOwner;/路径选择对话框的父窗口句柄,可设为this-m_hWnd3. LPCITEMIDLISTpidlRoot;/浏览时的初始根目录,设为NULL时为桌面目录4. LPTSTRpszDisplayName;/用于保存用户选中的路径5. LPCTSTRlpszTitle;/对话框标题6. UINTulFlags;/指定对话框的一些特性,为一些值的组合7. BFFCALLBACKlpfn;/处理事件的回调函数,一般设为NULL8. LPARAMlParam;/应用程序传给回调函数的参数,一般设为NULL9. intiImage;/保存被选

12、取的文件夾的图片索引,一般设为NULL10. BROWSEINFO,*PBROWSEINFO,*LPBROWSEINFO;B. 当选择了一个路径后,使用函数SHGetPathFromIDList提取出选择的路径。其原型为BOOLSHGetPathFromIDList(LPCITEMIDLISTpidl,LPTSTRpszPath)其中,输入参数pidl为上述SHBrowseForFolder的返回值,输出参数pszPath为所选择路径。调用成功则返回TRUE。 C. 应用示例。cppview plaincopy1. /更改文件保存路径2. voidCTestDlg:OnPathselect()

13、3. 4. /调用两个函数SHBrowseForFolder,SHGetPathFromIDList5. LPITEMIDLISTpID;/定义第一个函数的返回值6. BROWSEINFOlpbi;/定义其输入值7. charpathMAX_PATH;/保存路径8. /为lpbi赋值9. memset(&lpbi,0,sizeof(BROWSEINFO);10. lpbi.hwndOwner=this-m_hWnd;/父窗口句柄11. lpbi.lpszTitle=请选择保存路径;/显示位于对话框左上部的标题12. lpbi.ulFlags=BIF_EDITBOX;/指定对话框的外观和功能的标

14、志13. pID=SHBrowseForFolder(&lpbi);/选择路径,获取ID14. if(pID!=NULL)15. /如果成功得到16. SHGetPathFromIDList(pID,path);/获取路径17. GetDlgItem(IDC_PATH)-SetWindowText(path);/显示路径18. 19. (四)选择文件 A. 使用CFileDialog类,定义一个对象。其构造函数如下。cppview plaincopy1. CFileDialog(2. BOOLbOpenFileDialog,/为TRUE表示“打开”对话框,为FALSE表示“保存”对话框3. L

15、PCTSTRlpszDefExt=NULL,/指定默认的文件扩展名4. LPCTSTRlpszFileName=NULL,/指定默认的文件名5. DWORDdwFlags=OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,/指定一些风格6. LPCTSTRlpszFilter=NULL,/指定可供选择的文件类型和相应的扩展名7. CWnd*pParentWnd=NULL,/父窗口指针8. DWORDdwSize=09. ); B. 文件类型和扩展名的书写格式(参数lpszFilter) 文件类型说明和扩展名之间用 | 分割; 同种文件类型的扩展名之间用;分割; 每种文件

16、类型之间用 | 分割; 末尾用 | 指明例如,“Data Files(*.xlc;*xls)|*.xlc;*.xls|All Files(*.*)|*.*|”。其中,蓝色表示文件类型说明,粉色表示扩展名。 C. 定义CFileDialog类对象后,可使用DoModal函数来产生对话框,选择文件。在对话框“确定”返回后,可使用下列函数获取路径和文件名。 主要函数为:GetPathName,GetFileName,GetExtName, GetFileTile等。 D. 应用该类成员变量m_ofn可设置初始目录。如 dlg.m_ofn.lpstrInitialDir=_T(C:)。 E. 应用函数

17、GetStartPosition和GetNextPathName可实现选择多个文件的情况。 F. 一个示例,用于选择单个文件。cppview plaincopy1. /选择发送的文件2. voidCTestDlg:OnSelectfile()3. 4. CStringstr;5. CFileDialogdlg(TRUE,NULL,NULL,NULL,6. DATAFiles(*.dat;*.txt)|*.dat;*.txt|AllFiles(*.*)|*.*|,this);/定义对象7. if(dlg.DoModal()=IDOK)8. 9. str=dlg.GetPathName();/获取

18、文件名10. 11. 12. UpdateData(TRUE);13. m_nFilePath=str;/显示路径14. UpdateData(FALSE);15. (五)在指定目录下查找文件 A. 使用CFileFind类可查找指定目录下的文件,涉及的函数有查找函数FindFile和FindNextFile,获取文件属性函数和判断文件属性函数,详见MSDN。 B. 对于查找函数,cppview plaincopy1. BOOLFindFile(2. LPCTSTRpstrName=NULL,/查找的文件说明3. DWORDdwUnused=0/必须为04. );5. virtualBOOLF

19、indNextFile();/返回非0表示还有符合条件的文件,返回0表示是最后一个符合条件的文件需要查找的文件名pstrName可设为以下几种: E:VC+example.txt“E:VC+ex*.txt”E:VC+*.* C.一个示例。cppview plaincopy1. CFileFindfinder;2. BOOLbResult=finder.FindFile(_T(C:te*.dat);3. while(bResult)4. 5. bResult=finder.FindNextFile();6. cout(LPCTSTR)finder.GetFileName()endl;7. (六)

20、获取可执行程序所在的目录 A. 对于API函数GetCurrentDirectory虽然从字面意思上看是获取当前目录,其实获取的并不是.exe执行文件所在的目录,而是其上一级目录。例如,程序安装在桌面上,我们通过该函数获取的路径是C:Documents and SettingsAdministrator,而不是C:Documents and SettingsAdministrator桌面。 B. 如需获取程序执行时所在的目录,可使用另外一个API函数:GetModuleFileName。采用该函数可获取程序当前执行的文件名(包含完整的路径),然后结合_tsplitpath函数可分解出路径、文件

21、名、扩展名,再根据需要进行组合。 C. 下面是本人在程序中常使用的一个函数:cppview plaincopy1. /获取当前程序运行目录2. CStringGetCurrentDir()3. 4. TCHARszFull_MAX_PATH;/完整路径5. TCHARszDrive_MAX_DRIVE;/盘符6. TCHARszDir_MAX_DIR;/路径7. 8. /获取程序当前执行文件名(包含完整路径)9. GetModuleFileName(NULL,szFull,_MAX_PATH);10. _tsplitpath(szFull,szDrive,szDir,NULL,NULL);11

22、. 12. _tcscpy(szFull,szDrive);/盘符13. _tcscat(szFull,szDir);/路径14. 15. returnCString(szFull);/返回路径16. (七)关于access函数的应用 A. 对于access函数知道的人不多,这个函数主要可以用来确定文件或文件夹的访问权限或是否存在。其原型如下:htmlview plaincopy1. int_access(2. constchar*path,3. intmode4. ); B. 参数path用于指定文件或文件夹路径, mode用于指定模式,其有如下四种:mode值要判断的模式00判断是否存在02判断是否有只写权限04判断是否有只读权限06判断是否有读和写权限 当path指定为文件时,mode可设置上述四个任意的值;当path指定为文件夹时,只能判断其是否存在。 C. 使用时,必须包含io.h头文件。 D. 本人曾经使用该函数来判断某文件夹下的某文件是否存在,以确定作相应的处理。全文完。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1