MFC-txt文件读写.docx
文本文件的读写正确的文本文件读写过程1.定义文件变&2.打开指定的文件:3.向从文本文件中3人信息:4.从文本文件中也取信息:5.关闭文件1、定义文件交定义文件变出格式:CStdioFiIe文件变1ft:例如,定义一个名称为fl的文件变量,语句如下:CStdioFiIefl:2、打开指定文件可以干脆通过CStdioFile的构造函数来打开磁盘文件,同时UJ以用标记位指定打开方式(只读、只写、读写等):CStdioFile(1.PCTSTRIpszAIeName1UINTnOpenFlags):其中,IPSZFMName表示要打开的文件名,可以是相对路径或肯定路径nOpenFlags设置文件打开方式标记位,可以指定用T连接多个标记位.下面是常用的打开标记:CFileirtypeText:以文本文件的形式打开文件CFiIerlypeBinary:以二进制文件的形式打开文件CFiIeumodeCreate:假如指定文件名的文件不存在,则新隹文件:便如文件存在并且没有设置CFiIerimodeNoTruncatG标记.则清空文件.CFiIeimodeNOTrUnCate:假如文件存在,不把它的长度删除为0即不清空文件中的数据).:以只读方式打开文件CFile:mod0ReadWritG:以可读可写方式打开文件CFile:modeWrite:以只写方式打开文件CFile-ShareDenyNone:文件打开后,不禁止其他进程对文件的读写操作CFileirshareExclusive:文件打开后,禁止其他进程对文件的读写操作CFileiishareDenyRead:文件打开后,禁止其他进程对文件的读操作CFiIe:ShareDenyWrite:文件打开后,禁止其他进程对文件的写操作此外,可以不在构造函数中打开文件,而仅仅调用空的构造函数CStid。印e().然后用CStdiOFile:0Peno打开文件Open函数的前两个参数和非空构造函数的参数相同.其声明如下:BOO1.Open(1.PCTSTRIpszFilGName1UINTnOpenFlags.CFileException*pEaor=NU1.1.);第3个参数与打开失败时的异样处理有关.实例1,以只读方式打开一个文件步骤:运用APPWiZard创建一个对话框应用程序,捌除其自动产生的全部控件,添加一个BUtton控件。双击控件,在相应的函数里添加代码:charPSZFiIeName="C"myfile.txt"CStdioFiIemyFile;CFiIeExceptionfileException;if(!myFile.Open(pszFileName,CFile:modeCreate|CFile:typeText|CFile:modeRead),&fileException)(TRACE("Can'topenfile%s,error=%un",pszFileName,fileExcepiion.m_cause);)运行结果:假如C八卜.没有myle.txt文件,则新生成该文件。3 .向从文本文件中写入信息CStdioFile供应了函数WmeSmng来向文本文件中写入文本.WriieString函数的格式如下:voidWnteSIring(1.PeTSTRIpsz);WriteString的拿数Ipsz是一个以,0”字符结束的字符中,要把这个字符串的内容写入文件Z提示:运用WriteString函数时,假如希望班执行fXWriteString,文本文件中的内容就会自动换行一次,那么就须要在须要换行的地方输出V:myFile.WriteString("第1行Vr):实例2,向文件中写入文本建立MFC基于对话框的程序,删除自动添加的全部控件.浑加一个“确定”按仙双击按钮,按默认添加事务函数,双击按钮,在相应的函数处添加如下代码:char,PszFiIeName="C:myfile.txt"CStdioFitemyFile;CFiIeExceptionfieExcepion;if(myFile.Open(pszFileName,CFile:typeText|CFile:modeCreate|CFile:modeReadWrite),fileException)(myFile.WritString(-,1行俏;CStringStrOrder;strOrder.Format(%d.%.3,66.88.88);myFie.WriteString(strOrder);else(TRACE("Can'topenfile%s,error=%un",pS2FileName,fileException.m-cause);)程序运行结果:C:myfile.txt文件中内容如卜:笫1行66,88.8804 .从文本文件中读取信息CStidoFiIe供应/函数ReadSIring来读取文本.ReadString行两种形式,一种为:virtual1.PTSTRReadString(1.PTSTRIpsz1UINITnMax);ReadString函数的参数如下:Ipsz:是用户供应的一个指向字符中的指针,它用来接受从文件读出的文本,以“0”结束.nMax是本次所允许读入的文本字符个数.不计30"字符,也就是说股多能读入nMax1个文本字符ReadSmng的返回值是一个1.PTSTR类型的指针.它指向从文件读出的文本字符串,假如到达文件尾,则返I可NU1.1.-ReadSmng的另种形式为:BOO1.ReadString(CString&rString);参数rString用来容纳从文件读出的文本。CStrin9版本忽视I可车换行符,返I可值是一个布尔值.假如返I可值为FA1.SE,表示因到达文件尾而没有读到任何字符。示:每执行一次ReadStrIng,就会自动从文本文件中读取一行敷福,同时文件绛作指针会自动跳转到下一行实例3,从文件中读取文本信息步联:创建基于对话框的MFC程序,刷除全部自动添加的控件,添加按钮控件,为按铀添加货务,并在相应的函数处,添加如下代码;char*PszFiIeName="CAmyfile.t×t"CStdioFiIemyFile;CFiIeExceptionfileException;if(myFile.Open(pszFileName.CFile:typeText|CFile::modeReadWrite),&fileException)(myFile.SeekToBeginf);CStringstrl;myFile.ReadString(str1);CStringStr2;myFile.ReadString(str2):AfxMessageBoxfstrI+str2):)elseTRACE("Can'topenfile%s,error=%un",pszFiteName.fileException.m-cause);myFile.Cose();5 .关闭文件对文件的操作完成后,届用CIoseFile关闭文件.函数CStdiOFile:CIoSe关闭一个文件,一般一个文件运用完毕就应当关闭它:myFile.Cose();错提的文本文件读写过程在读写文本文件的时候,鼠常见的错误是一操作文件不存在,这种错误产生的典型缘由彳r:1.路径错误char,PszFiIeName=nCiWWindowsWMyFile.txf;CStdioFiIemyFile;CFiIeExceptionfileException;if(!myFile.Open(pszFileName.CFile:modeCreate|CFile:typeText|CFile:modeRea<iWrite).SfiIeException)(文件操作代码else(TRACE("Can'topenfile%s,error=%un,',pszFileName,fileException.m.cause);myFile.Close();由于将文件变盘与一个肯定路径的文件名关联,而程序的数据通常存储在相对路径下,所以一旦相对路径和相对路径不,样时,就会出错。举例而言,上一段程序本意是想从windows的安装书目下面的MyTextFile.txt文件中篌取一行数据,但是合如操作系统安装的路径不是C:Windwos.而是CAWinnl,那么这段程序就会出错。解决方法是在程序中运用相对路径,改正后的程序如下:获得windows路径1.PTSTRlpBuffer=newcharMAX_PATH;:GetWir>dowsDirectory(lpBuffer,MAX_PATH);strcat(lpBuffer,"VMyFile.txt"):CStdioFiIemyFile;CFiIeExceptionfileException;if(myFile.Open(lpBuffer,CFile:typeText|CFile:modeCreate|CFile:modeReadWrite),&tileException)文件操作代码else(TRACE("Can'topenfile%s,error=%un,',pszFileName,fileException.m.cause);myFile.Close();由于将文件变盘马一个肯定路径的文件名为联,而程序的数据通常存储在相时路径下,所以一旦相对路径和相劝路径不一样时,就会出忸.举例而言,上一段程序本意是想从windows的安装书目下面的MyTextFiIelxt文件中读取一行数据,但是黄如操作系统安装的路径不是C:Windwos,11j½C:Winnt,那么这段程序就会出怫.解决方法是在程序中运用相对路径,改正后的程序如F:获得windows路径1.PTSTRIPBUffer=newcharMA×PATH;:GetWindowsDirectory(lpBuffer.MAX_PATH);strcat(lpBuffer,"MyRle.txt");CStdioFifemyFie;CFiIeExceptionIiIeException;if(myFile.Open(lpBuffer,CFile:typeText|CFile:modeCreate|CFile:modeReadWrite),&fileEcetion)文件操作代码else(TRACE("Can'topentile%s.error=%un",pszFileName.fileException.m_cause);)CStringStrFiIeTitIe='MyFiIe.txt";CStdioFiIemyFile;CFiIeExceptionfileException;if(myFile.Open(strFileTitle,CFile:typeText|CFile:modeReadWrite),&*ileException)("文件操作代码myFile.WriteStringff测试!"):1else(TRACE("Can'topentile%s.error=%un",pszFileName,fileException.m_cause);myFie.Cose();2 .掾作文件不存在假如应用程序全部路径卜面不存在MyAle.txt文件,那么在WriteString写入信息时就会出错.解决方法就是在程序中打开文件前要检变是否存在此文件,如下程序:CStringstrFileTrtle="MyFile.txt":CFiIeFindfinder;if(finder.FindFile(strFilTitle)(CStdioFifemyFie;CFileExceptionfileExcepion;if(myFile.Open(lpBuffer.CFile:typeTGxt|CFile:modeCreate|CFile:modeReadWrite).&fileEceion)(文件操作代码1else(TRACE("Can'topenfile%s,error=%un",pszFileName,fileException.m_cause);Ielse(TRACE("Can'tfindfile%sn",strFieTitle):ImyFi.Cose();3.超越文件权限进行读写操作在打开文件的过程中,通过参数指定了文件的读写权限假如读写的操作没有和相应的权限对应,就会出现错误.下面的程序就是典型的忽视了文件操作权限的例子:CStringstrFileTrtle=MyFile.tx;CStdioFifemyFie;CFiIeExceptionfileExceplion;if(myFile.Open(strFileTitle.CFile:typeText|CFile:modeCreate|CFile:NoTruncat0|CFile:mOdeRea(J)1SfileException)(文件操作代码myFile.W11teString11K!i);elseTRACE("Can'topenfile%s,error-%un",strFieTitle1fileException.m-cause);)myFil.Clos();支招儿,1.精确定位文件的路径操作文件的过程中,常常须要将文本文件放在程序自身的书目中,但是假如仅仅在程序中运用不指定仟何路径信息的相对路径,如:myAle.OpenCMyFite.txr,CFile:modeCreate|CAIe:typeText|CFile:modeReadWrite);那么就有可能出现不能正确定位的状况,精确定位文件位比的方法是狭得可执行程序力身的肯定路径,如:TCHARFiIePathMAX_PATH);GetModuteFilName(NU1.1.,FiePath.MAX-PATH);Ctcstchr(FilePath,)11J=O;lstrcat(FilePath,-T("MyFil.t×);CStdioFiIemyFile;CFiIeExceptionfieExceplon;if(myFile.Open(FilePath,CFile:modeCreate|CFile:typeText|CFile::modeReadWrite),&fileException)(文件操作代码else(TRACE("Can'topenfile%s,error=%un",FilePath.fileException.m-cause);1myFile.Cose();2 .读文本文件指定的一行,并得到文本文件的总行皴.读文本文件指定的一行,并得到文本文件的总行数要统计文本文件的总行数,可以从头逐行读,宜到文件尾,程序:CStdioFitemyFile;CFiIeExceptionfieExcepton;if(myFile.Open("MyFile.txf,CFile:mo<JeCreate|CFile:modeNoTruncate|CFile:ypeText|CFile:modeReadWrite),&WeException)(CStringStrContent;intorder=1;whe(myFie.ReadString(strContent)if(2=order)A仅MeSSageBOX(StrContenD:(Xder=(Xder+1;1else(TRACE(,'Can'topenfile");1myFile.Cose();3带动文件指针file.Seek(1OOCFiIeibegin);/从文件头起先往卜,移动100字节«le.Seekk50,CFile:end);/从文件末尾往上移动50字节fileSeek.30,CFiIe:CUrrenDW/从当前便置往上移动30字节file.SeekToBegin();/格到文件头file.SeekToEnd()W移到文件尾4读写文件读文件ICharbuffenloO0);file.Read(buffr,1000);