MFC-txt文件读写
MFC读写.txt文件时进度条显示实时进度
MFC读写.txt⽂件时进度条显⽰实时进度 整体实现⽅式:先获得⽂件长度,然后⽤每次读取的长度,计算出完成的百分⽐,⽤百分⽐的值设置进度条。
⼀、MFC进度条 Progress Control 相关函数1. create() ——创建Progress Control 针对不是通过资源⽂件上拖拉进度条控件⽣成的进度条,需要⽤此函数创建⼀个。
2. SetRange() —— 设置进度条范围 设置进度条的起始值和终⽌值。
(不管拖拽还是创建都要设置此,在初始化中)3. SetPos() —— 设置当前值 设置进度条的当前位置(值)。
4. OffSetPos() —— 偏移⼀段位置 移动进度条⼀段距离(动态移动,如果不做延时,默认速度移动)5. SetStep() —— 设置步长 设置进度条偏移⼀次的长度,⼀般与StepIt搭配使⽤6. StepIt() —— 更新步长位置 按照步长来更新位置。
7.GetPos() —— 得到当前值 获得进度条当前值。
⼆、⽰例 1. ⾸先在初始化函数中设置范围和当前初始值CProgressCtrl* pProg = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS);pProg->SetRange(0, 100);pProg->SetPos(0); 2. 获取⽬标txt⽂件的总⾏数while(!feof(fOpenFile)) {if(fgets(szBuf, sizeof(szBuf) - 1, fOpenFile)) {nRowOfTotalNum++;}}nRowOfTotalNum++;fseek(fOpenFile, 0, SEEK_SET); 这⾥,读取完总⾏数后,要将⽂件指针指向⽂件头。
3. 获取当前读取进度的⾏数,计算出完成的百分⽐,⽤百分⽐的值设置进度条。
fRowOfCurrentNum = nRowOfCurrentNum;fRowOfTotalNum = nRowOfTotalNum;fProPos = (fRowOfCurrentNum / fRowOfTotalNum) * 100.00;nProPos = fProPos;cProFileCtl.SetPos(nProPos); PS:SetPos()只能接受int型变量,⽽计算后的进度⼜要使⽤Float类型进⾏保存计算,所以这⾥要特别注意各个变量之间计算时的类型转换问题,否则会⼀直出现Pos为0⽽进度条始终没有反应的情况。
mfc文件操作个人总结
MFC文件操作一,打开文件对话框CString szFilters=_T("txt Files (*.txt)");CFileDialog fileDlg(TRUE, _T("txt"), _T("*.txt"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilters, NULL);if(fileDlg.DoModal() == IDOK){CString filestr;filestr = fileDlg.GetPathName(); //得到打开的文件的全路径+后缀};二,打开文件CFile::CFile( LPCTSTR lpszFileName, UINT nOpenFlags ); //CFile构造lpszFileName文件名nOpenFlags 打开方式,有:CFile::modeCreate:以新建方式打开,如果文件不存在,新建;如果文件已存在,把该文件长度置零,即清除文件原有内容。
CFile::modeRead:只读。
CFile::modeWrite:只写。
CFile::modeReadWrite:以读写方式打开文件。
CFile::modeNoTruncate:以追加方式打开,如果文件存在,打开并且不将文件长度置零,如果文件不存在,会抛出异常。
一般与CFile::modeCreate一起使用,则文件不存在时,新建一个文件;存在就进行追加操作(其追加是从起始位置进行覆盖式追加的,所以要与定位配合操作)。
例:1,利用CFile的构造函数打开文件filestr = _T("C:\\Users\\zktw\\Desktop\\new.txt");//或用一中获得的路径CFile RWFile(filestr,CFile::modeCreate | CFile::modeReadWrite | CFile::modeNoTruncate); 例2:利用CFile的成员函数CFile myfile;Myfile.open(_T(“路径”), CFile::modeCreate | CFile::modeReadWrite | CFile::modeNoTruncate);三,文件读写操作读操作CFile::Read( void* lpBuf, UINT nCount ); 从lpBuf指向的地址开始读取nCount 个字节,指针也自动下移nCount写操作CFile::Write( const void* lpBuf, UINT nCount ); 向lpBuf指向的内存地址写入nCount 个字节,指针也自动下移nCount四,定位CFile::Seek( LONG lOff, UINT nFrom );从指定位nFrom置偏移lOff字节.nFrom 有三种方式,如:CFile::begin 从文件开始移动CFile::current从当前位置移动CFile::end 从文件末位移动,此时lOff为负值. 例:CFile::Seek(0, CFile::end); //定位文件尾五,关闭打开的文件CFile::Close(); //关闭文件,删除对象,再次对文件读写时必须重新定义对象六,查找文件是否存在(CFileFind的成员函数)CString strFileTitle;CFileFind finder;BOOL bWorking = finder.FindFile(_T("C:\\Users\\zktw\\Desktop\\new.txt"));if(bWorking){AfxMessageBox(_T(“文件已存在”);}elseAfxMessageBox(_T(“文件不存在”));finder.close(); //结束查找请求释放资源,但是再次发出查找请求时不需要重新定义//CFileFind对象如下:bWorking = finder.FindFile(_T("C:\\Users\\zktw\\Desktop\\new1.txt"));。
MFC-txt文件读写
文本文件的读写正确的文本文件读写过程1.定义文件变量;2.打开指定的文件;3.向从文本文件中写入信息;4.从文本文件中读取信息;5.关闭文件1、定义文件变量定义文件变量格式:CStdioFile 文件变量;例如,定义一个名称为f1的文件变量,语句如下:CStdioFile f1;2、打开指定文件可以直接通过CStdioFile的构造函数来打开磁盘文件,同时可以用标志位指定打开方式(只读、只写、读写等):CStdioFile(LPCTSTR lpszFileName,UINT nOpenFlags);其中,lpszFileName表示要打开的文件名,可以是相对路径或绝对路径nOpenFlags设置文件打开方式标志位,可以指定用“|”连接多个标志位。
下面是常用的打开标志:CFile::typeText:以文本文件的形式打开文件CFile::typeBinary:以二进制文件的形式打开文件CFile::modeCreate:如果指定文件名的文件不存在,则新建文件;如果文件存在并且没有设置CFile::modeNoTruncate标志,则清空文件。
CFile::modeNoTruncate:如果文件存在,不把它的长度删除为0(即不清空文件中的数据)。
:以只读方式打开文件CFile::modeReadWrite:以可读可写方式打开文件CFile::modeWrite:以只写方式打开文件CFile::shareDenyNone:文件打开后,不禁止其他进程对文件的读写操作CFile::shareExclusive:文件打开后,禁止其他进程对文件的读写操作CFile::shareDenyRead:文件打开后,禁止其他进程对文件的读操作CFile::shareDenyWrite:文件打开后,禁止其他进程对文件的写操作此外,可以不在构造函数中打开文件,而仅仅调用空的构造函数CStidoFile(),然后用CStdioFile::Open()打开文件。
C、C++和MFC中文件的读写方法
C、C++和MFC中文件的读写方法对文件读写的三种方法1.C中FILE *pFile=fopen("1.txt","w");fwrite("",1,strlen(""),pFile");//fseek(pFile,0,SEEK_SET);//fwrite("ftp:",1,strlen("ftp:"),pFile);//fwrite("",1,strlen(""),pFile");fclose(pFile);*///fflush(pFile);表头文件 #include<stdio.h>获取文件长度的方法:FILE *fp = fopen(filePath, "r");fseek(fp, 0, SEEK_END);//先移动到文件结尾处n = ftell(fp);fclose(fp);各个函数说明:FILE * fopen(const char * path,const char * mode);函数说明参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。
mode有下列几种形态字符串:int fseek( FILE *stream, long offset, int origin );第一个参数stream为文件指针第二个参数offset为偏移量,整数表示正向偏移,负数表示负向偏移第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SETSEEK_CUR:当前位置SEEK_END:文件结尾SEEK_SET:文件开头其中SEEK_CUR,SEEK_END和SEEK_SET依次为1,2和0int fwrite(buffer,size,count,fp);(1)buffer:是一个指针,对fwrite来说,是要输出数据的地址。
使用MFC读取大文件
使用MFC读取大文件VC读取大文件VC++中使用内存映射文件处理大文件摘要:本文给出了一种方便实用的解决大文件的读取、存储等处理的方法,并结合相关程序代码对具体的实现过程进行了介绍。
引言文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类,常用的有Win32 API的CreateFile()、WriteFile()、ReadFile()和MFC提供的CFile类等。
一般来说,以上这些函数可以满足大多数场合的要求,但是对于某些特殊应用领域所需要的动辄几十GB、几百GB、乃至几TB的海量存储,再以通常的文件处理方法进行处理显然是行不通的。
目前,对于上述这种大文件的操作一般是以内存映射文件的方式来加以处理的,本文下面将针对这种Windows核心编程技术展开讨论。
内存映射文件内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,只是内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而非系统的页文件,而且在对该文件进行操作之前必须首先对文件进行映射,就如同将整个文件从磁盘加载到内存。
由此可以看出,使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,这意味着在对文件进行处理时将不必再为文件申请并分配缓存,所有的文件缓存操作均由系统直接管理,由于取消了将文件数据加载到内存、数据从内存到文件的回写以及释放内存块等步骤,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。
另外,实际工程中的系统往往需要在多个进程之间共享数据,如果数据量小,处理方法是灵活多变的,如果共享数据容量巨大,那么就需要借助于内存映射文件来进行。
实际上,内存映射文件正是解决本地多个进程间数据共享的最有效方法。
内存映射文件并不是简单的文件I/O操作,实际用到了Windows 的核心编程技术--内存管理。
所以,如果想对内存映射文件有更深刻的认识,必须对Windows操作系统的内存管理机制有清楚的认识,内存管理的相关知识非常复杂,超出了本文的讨论范畴,在此就不再赘述,感兴趣的读者可以参阅其他相关书籍。
MFC文件读取
MFC文件读取MFC文件读取技术(1)计算机是如何管理自身所存放着大量的信息的呢?windows 的磁盘管理程序为我们提供了一套严密而又高效的信息组织开工--- 硬盘上的信息是以文件的形式被管理的。
面向存储的文件技术什么是文件?计算机中,一篇文章、一幅图画、一个程序、一首歌曲等都是以文件的形式存储在磁盘上的,每个文件都有一个文件名。
计算机就是对文件按名存取的。
文件名的格式如下:主文件名 . 扩展名文件名由主文件名和扩展名两部分组成,中间用小圆点隔开,其中扩展名可以省略。
而扩展名是用来区分文件类型的。
Windows 为了区分文件的类型,一些软件系统会自动给文件加上“ .wps ”扩展名;画图程序画的图像文件一般为“ .bmp ”等。
在windows 中,主文件名可以由英文字符、汉字、数字以及一些符号等组成,但不能使用+<>*?\ 等符号。
什么是文件夹?在计算机中存放着数以万计的文件,为了便于管理这些文件,就像我们把文件分类放到不同的抽屉中便于查阅一样,在计算机中也有像抽屉的东西,它就是文件夹。
文件夹也要有一个名字,取名的原则与文件的取名类似,只是不用再区分文件夹的类型,当文件夹多了以后,还可以把某些文件夹归到一个大文件夹中去。
久而久之,就构成了计算机中庞大的磁盘文件结构。
为什么要在程序中使用文件?通常,程序中的数据在程序运行结束后,就会从内存中清除,再次运行程序时不会自动出现。
在编制程序的过程中不可避免地会遇到将某些数据永久保存的问题,当关闭程序后,依然可以使用这些数据,这时就需要进行文件操作。
文件类型Visual c++ 处理的文件通常分为两种:文本文件:只可被任意文本编辑器读取ASCII 文本。
二进制文件:指对包含任意格式或无格式数据的文件的统称。
这里只介绍文本文件的读写,INI 文件也属于文本文件的范畴,且INI 文件的结构和用途与普通的文本文件不同,所以会单独介绍。
VC读写txt文件
C++读写文本文件#include <iostream>#include <fstream>using namespace std;int main(){const char filename[] = "mytext.txt";ofstream o_file;ifstream i_file;string out_text;//写o_file.open(filename);for (int i = 1; i <= 10; i++){o_file << "第" << i << "行\n"; //将内容写入到文本文件中}o_file.close();//读i_file.open(filename);if (i_file.is_open()){while (i_file.good()){i_file >> out_text; //将读取的内容存储到变量out_text中cout << out_text << endl; //在控制台输出读取的内容。
为什么最后一行的内容会出现两次}}elsecout << "打开文件:" << filename << " 时出错!";i_file.close();system("PAUSE");return 0;}为什么总会将最后一行显示两遍?我的循环似乎没错呀。
笔记:C++文件的读取和写入exit(1);// terminate with error}if(!outfile){cout<<"Unable to open otfile";exit(1);// terminate with error}int a,b;int i=0,j=0;int data[6][2];while(! myfile.eof()){myfile.getline(buffer,10);sscanf(buffer,"%d %d",&a,&b);cout<<a<<" "<<b<<endl;data[i][0]=a;data[i][1]=b;i++;}myfile.close();for(int k=0;k<i;k++){outfile<<data[k][0]<<" "<<data[k][1]<<endl;cout<<data[k][0]<<" "<<data[k][1]<<endl; }outfile.close();return 0;}无论读写都要包含<fstream>头文件读:从外部文件中将数据读到程序中来处理对于程序来说,是从外部读入数据,因此定义输入流,即定义输入流对象:ifsteam infile,infile就是输入流对象。
MFC和C++关于文件的读写操作以及文件的打开和保存
MFC和C++关于文件的读写操作以及文件的打开和保存通过近来的学习,总结一下关于C++开发中文件的读写操作以及文件的打开和保存的方法。
一、文件的读写操作:(1)C语言对文件的读写操作在C语言中,对文件的读写操作是用FILE结构体和常用的对文件操作的函数实现的,下面总结一下C语言中对文件操作的常用函数:fopen() 打开以文件名指定的文件fwrite() 写文件fread() 读文件fseek() 移动文件的指针到新的位置通过该函数的参数设定的偏移量和初始位置rewind() 移动文件的指针到文件流的开始位置,在通常情况下可用fseek()实现相同的功能,但二者有区别ftell() 获得当前文件指针的位置,常用该函数获得文件的文件流的长度fflush() 刷新缓冲区中的内容,当文件写入时直接将文件流的内容从缓冲区写入磁盘,当读取文件时直接将磁盘文件写入缓冲区,而不必等程序运行结束或关闭程序。
fclose() 关闭文件memset() 在一段内存块中填充某个给定的值示例代码如下:/*********************************************************** C语言实现文件写操作 ************************************************************/FILE *pFile=fopen("CLanguage.txt","w");fwrite("CLanguage",1,strlen("CLanguage"),pFile);//fseek(pFile,0,SEEK_SET);//fwrite("实现文件写操作",1,strlen("实现文件写操作"),pFile);fclose(pFile);/*********************************************************** C语言实现文件读操作 ************************************************************/FILE *pFile=fopen("CLanguage.txt","r");//char ch[100];//memset(ch,0,100);//fread(ch,1,100,pFile);//MessageBox(ch);char* pBuf;int length;fseek(pFile,0,SEEK_END);length=ftell(pFile);pBuf=new char[length+1];//fseek(pFile,0,SEEK_SET);rewind(pFile);fread(pBuf,1,length,pFile);pBuf[length]=0;MessageBox(pBuf);fclose(pFile);注意:在用C语言实现文件的读操作时,要注意文件的指针位置。
MFC文件读写操作
MFC⽂件读写操作1、相关类 CFile类 -封装了⽂件句柄以及操作⽂件的API函数 CFileFind类 -封装了⽂件搜索功能2、CFile类的使⽤ 2.1⽂件读写 1)创建或者打开⽂件 CFile::Open virtual BOOL Open( LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL ); lpszFileName:指定⽂件的名称; nOpenFlags:指定⽂件共享和访问的⽅式,包括: CFile::modeCreate --创建新⽂件,如果该⽂件已存在,则将它的长度截断为0; CFile::modeNoTruncate --与CFile::modeCreate合⽤,如果要创建的⽂件已存在,它的长度不会被截断; CFile::modeRead --打开⽂件,仅⽤于读操作; CFile::modeReadWrite --打开⽂件,可读可写; CFile::modeWrite --打开⽂件,仅⽤于写操作; CFile::modeNoInherit --禁⽌⼦进程继承该⽂件; CFile::shareDenyNone --打开⽂件,同时并不拒绝其他进程对该⽂件的读取和写⼊访问;如果该⽂件已经被其他进程以兼容模式打开,则函数调⽤失败; CFile::shareDenyRead --打开⽂件,并拒绝其他进程对该⽂件的读取访问; CFile::shareDenyWrite --打开⽂件,并拒绝其他进程对该⽂件的写⼊访问; CFile::shareExclusive --以独占模式打开,拒绝其他进程对该⽂件的读取和写⼊访问; CFile::typeText --设置⽂本模式,带有⼀对回车换⾏字符; CFile::typeBinary --设置⼆进制模式; 2)⽂件读写 CFile::Read virtual UINT Read( void* lpBuf, UINT nCount ); lpBuf:指向⽤来接收从⽂件中读取的数据的缓冲区的指针; nCount:要从⽂件中读取的最⼤字节数; CFile::Write virtual void Write( const void* lpBuf, UINT nCount ); lpBuf:指向将要被写⼊⽂件的数据; nCount:将要写⼊的数据的字节数; CFile::Flush --刷新缓冲区中的数据并将其写⼊磁盘⽂件中 virtual void Flush(); 3)关闭⽂件 CFile::Close() virtual void Close(); 2.2⽂件长度的获取和设置 CFile::GetLength() CFile::SetLength(ULONGLONG dwLen) //⽂件会响应地被扩展或截取 2.3⽂件的指针 CFile::GetPosition() --获得当前⽂件指针的位置 virtual DWORD GetPosition( ) const; CFile::Seek virtual LONG Seek( LONG lOff, UINT nFrom ); lOff:将移动⽂件指针多少个字节数; nFrom:移动⽂件指针的起始位置,包括: CFile::begin CFile::current CFile::end CFile::SeekToBegin() //将⽂件指针移到⽂件开头 CFile::SeekToEnd() //将⽂件指针移到⽂件末尾 2.4⽂件相关属性的读取和设置 1)CFile::GetStatus //获取⽂件的属性信息,成功返回⾮0,失败返回0 Bool GetStatus([LPCTSTR strFileName,]CFileStatus& Status) CFileStatus结构有以下字段: CTime m_ctime --⽂件创建的时间 CTime m_mtime --⽂件最后⼀次修改的时间 CTime m_atime --最后⼀次访问⽂件并读取的时间 LONG m_size --⽂件逻辑长度,以字节数表⽰ BYTE m_attribute --⽂件属性 m_attribute的值包括:normal=0x00 | readOnly=0x01 | hidden=0x02 | system=0x04 | volume=0x08 | directory=0x10 | archive=0x20 Char m_szFullName[_MAX_PATH] --Windows字符集表⽰的全⽂件名 2)CFile::SetStatus //设置⽂件属性信息 SetStatus(LPCTSTR strFileName,CFileStatus& Status) 3)CFile::GetFileName() //获取⽂件名称,包含扩展名(即使被隐藏) 4)CFile::GetFileTitle() //获取⽂件显⽰名称(若系统默认隐藏⽂件扩展名,则不包含扩展名) 5)CFile::GetFilePath() //获取⽂件绝对路径 6)CFile::SetFilePath(strNewFilePathName) 7)CFile::Rename(strOldFileName,strNewFileName) //重命名⽂件,可以利⽤此函数移动⽂件到新的路径下并重命名 8)CFile::Remove(strFileName) //删除指定路径⽂件,可以是相对路径、绝对路径 注意:1、⽂件读写需要异常处理 2、注意⽂件的指针位置 例: if (GetFileAttributes("./1.txt") != INVALID_FILE_ATTRIBUTES) //检测⽂件是否存在{ CFile file; file.Open("1.txt", CFile::modeCreate | CFile::modeWrite);//file.Write("hello world!", strlen("hello world!"));CString str="hello world!";int strLen=str.GetLength(); file.Write(str, strLen); file.Close();}CFile file;if(file.Open("1.txt", CFile::modeRead)){ char *pBuf; DWORD dwFileLen; dwFileLen = file.GetLength(); pBuf = new char[dwFileLen + 1]; pBuf[dwFileLen] = 0; file.Read(pBuf, dwFileLen); file.Close(); MessageBox(pBuf); delete[] pBuf; }3、CFileFind类的使⽤ 3.1开始查找(指定查找的⽬录) CFileFind::FindFile(strFileName,0); //strName为要查找的⽂件名,为NULL表⽰查找“*.*” 成功返回⾮0,失败返回0 3.2查找下⼀个(获取当前⽂件信息,返回下⼀个⽂件是否存在) CFileFind::FindNextFile(); //返回⾮0表⽰还有符合条件的下⼀个⽂件,返回0表⽰已是最后⼀个⽂件 3.3获取/判断⽂件信息 CFileFind::GetCreationTime(); //获取⽂件的创建时间,成功返回⾮0,失败返回0 virtual BOOL GetCreationTime(FILETIME *pFileTime) const; //FILETIME*:容纳时间的结构指针 virtual BOOL GetCreationTime(CTime& refTime) const; //CTime&:容纳时间的对象地址 FILETIME和CTime的相互转换: FILETIME转CTime: 1、CTime对象在初始化时可以传递FILETIME结构 FILETIME ft; CTime time(ft); 2、将FILETIME转换为SYSTEMTIME,然后CTime对象在初始化时可以传递SYSTEMTIME结构 FILETIME ft; SYSTEMTIME st; BOOL bSuccess=::FileTimeToSystemTime(&ft , &st); CTime time(st); CTime转FILETIME: CTime time(CTime::GetCurrentTime()); SYSTEMTIME st; time.GetAsSystemTime(st); FILETIME ft; ::SystemTimeToFileTime(&st,&ft); CFileFind::GetLastAccessTime(); //获取⽂件最后被访问的时间,成功返回⾮0,失败返回0 virtual BOOL GetLastAccessTime(FILETIME *pFileTime) const; virtual BOOL GetLastAccessTime(CTime& refTime) const; CFileFind::GetLastWriteTime(); //获取⽂件最后被修改的时间,成功返回⾮0,失败返回0 virtual BOOL GetLastWriteTime(FILETIME *pFileTime) const; virtual BOOL GetLastWriteTime(CTime& refTime) const; CFileFind::GetRoot(); //获取查找到的⽂件的根⽬录,必须在执⾏FindNextFile()后执⾏该函数,返回CString对象 CFileFind::GetFileName(); //获取查找到的⽂件的全名(包含扩展名),必须在执⾏FindNextFile()后执⾏该函数,返回CString对象 CFileFind::GetFilePath(); //获取查找到的⽂件的绝对路径,必须在执⾏FindNextFile()后执⾏该函数,返回CString对象 CFileFind::GetFileTitle(); //获取查找到的⽂件的名称(若系统默认隐藏⽂件扩展名则不显⽰),必须在执⾏FindNextFile()后执⾏该函数,返回CString对象 CFileFind::GetFileURL(); //获取查找到的⽂件的URL路径,必须在执⾏FindNextFile()后执⾏该函数,返回CString对象 CFileFind::GetLength(); //获取查找到的⽂件的长度DWORD CFileFind::IsArchived(); //判断查找的⽂件属性是否是档案⽂件,必须在执⾏FindNextFile()后执⾏该函数,⾮0表⽰是,0表⽰不是 CFileFind::IsCompressed(); //判断查找的⽂件属性是否是压缩⽂件,必须在执⾏FindNextFile()后执⾏该函数 CFileFind::IsDirectory(); //判断查找的⽂件属性是否为路径⽂件(⽂件夹),必须在执⾏FindNextFile()后执⾏该函数 CFileFind::IsDots(); //判断查找的⽂件属性是否是“.”、“..”,必须在执⾏FindNextFile()后执⾏该函数 CFileFind::IsHidden(); //判断查找的⽂件属性是否为隐藏⽂件,必须在执⾏FindNextFile()后执⾏该函数 CFileFind::IsNormal(); //判断查找的⽂件属性是否为正常⽂件,必须在执⾏FindNextFile()后执⾏该函数 CFileFind::IsReadOnly(); //判断查找的⽂件属性是否为只读⽂件,必须在执⾏FindNextFile()后执⾏该函数 CFileFind::IsSystem(); //判断查找的⽂件属性是否为系统⽂件,必须在执⾏FindNextFile()后执⾏该函数 CFileFind::IsTemporary(); //判断查找的⽂件属性是否为临时⽂件,必须在执⾏FindNextFile()后执⾏该函数 CFileFind::MatchesMask(DWORD dwMask); //判断查找的⽂件的综合属性,必须在执⾏FindNextFile()后执⾏该函数 dwMask参数包括: FILE_ATTRIBUTE_ARCHIVE:档案⽂件 FILE_ATTRIBUTE_COMPRESSED:压缩⽂件 FILE_ATTRIBUTE_DIRECTORY:路径⽂件 FILE_ATTRIBUTE_NORMAL:正常⽂件 FILE_ATTRIBUTE_READONLY:只读⽂件 FILE_ATTRIBUTE_SYSTEM:系统⽂件 FILE_ATTRIBUTE_TEMPORARY:临时⽂件 FILE_ATTRIBUTE_HIDDEN:隐藏⽂件 3.4结束查找 CFileFind::Close();CFileFind fFinder;BOOL bFind = fFinder.FindFile(TEXT("D:/*.*"));while (bFind){bFind = fFinder.FindNextFile();//当前⽂件夹及上层⽂件夹(名称分别为..)-----------------if (fFinder.IsDots()){continue;}//⼦⽂件夹---------------------------------------------if(fFinder.IsDirectory()){CString cstrDirName = fFinder.GetFileName(); //directory nameCString cstrDirPath = fFinder.GetFilePath(); //directory pathcontinue;}//⽂件-------------------------------------------------CString cstrFileName = fFinder.GetFileName(); //file nameCString cstrFilePath = fFinder.GetFilePath(); //file path}fFinder.Close(); 相关问题: CFileFind 类中返回的⽂件顺序与⽂件系统有关,如果是NTFS和CDFS⽂件系统,是以⽂件的字母顺序排列的,FAT⽂件系统下,是以⽂件增加的先后顺序排列的,⽽不是按字母顺序。
c++ MFC中的文件读写操作
由于要写个游戏工具方便编程,要用到文件类的操作,看到这篇文章不错,特转载计算机室如何管理自身所存放着的大量的信息的呢?windows的磁盘管理程序为我们提供了一套严密而又高效的信息组织形式--硬盘上的信息是以文件的形式被管理的。
面向存储的文件技术什么是文件?计算机中,一篇文章、一幅图片、一个程序等都是以文件的形式存储在磁盘上的,每个文件都有一个文件名。
计算机就是对文件按名存取的。
文件名的格式如下:主文件名.扩展名。
为什么要在程序中使用文件?通常,程序中的数据在程序运行结束之后,就会从内存中清除,再次运行程序时不会自动出现。
在编制程序的过程中不可避免的会遇到将某些数据永久保存的问题,当程序关闭后,依然可以使用这些数据,这时就需要进行文件操作。
文件类型Visual C++处理的文件通常分为两种:文本文件:只可被任意文本编辑器读取ASCII文本。
二进制文件:指对包含任意格式或无格式数据的文件的统称。
这里只介绍文本文件的读写,INI文件也属于文本文件的范畴,且INI文件的结构和用途与普通的文本文件不同,所以会单独介绍。
第一部分:文本文件文本文件的读写认识CFile类;认识文本文件;能够正确灵活应用文本文件存取信息;避免文本文件读写的常见误区。
CFile是MFC的文件操作基本类,它直接支持无缓冲的二进制磁盘I/O操作,并通过其派生类支持文本文件、内存文件和socket文件。
客户操作记录实例功能预览及关键知识点许多系统,出于安全或其他原因,常常要求随时对键盘进行监控,利用Hook(钩子)技术编写的应用程序能够很好地达到这个目的。
本软件就制作了一个客户操作记录软件,即在软件运行过程中,用户在键盘上的按键操作会被记录下来,这样对维护软件的正常运行非常有利。
只要启动客户操作记录软件后,不管输入焦点是否在本软件上,按键都会被记录下来。
我们需要的是键盘的系统监控,只要本软件在运行,无论当前计算机在做什么,都能监测到用户按键的行为并做出反应,这就要用到Hook技术。
VC6.0编的“文件读写”的详细操作步骤(两种方式:MFC和基于对话框)
VC6.0编的“文件读写”的两种方式(MFC和基于对话框)软件实验三:基于对话框的MFC程序实现文件读写操作实例一:操作步骤:1、新建“MFC APPWIZARD(EXE)”,选择文件路径,输入文件名,选择应用程序类型为“基本对话框”,按上图添加各控件2、按下表修改各控件的ID号,添加成员函数和消息函数控件的ID号,选择mumber variables面板,单击add variable按钮,添加成员变量,并选择变量类型。
3、写入文件1)在“基于对话框的文件读写Dlg.h”文件中定义变量(粗体字为此处添加的代码)class CMyDlg : public CDialog{// Constructionpublic://定义变量CString strFileName;//文件名CString strFilePath;//文件路径BOOL IsTextFile(CString& rFile);//判断文件类型是否正确CMyDlg(CWnd* pParent = NULL); // standard constructor………}2)双击下压按钮“写入文件”,编写“写入文件”的消息处理函数void CMyDlg::OnButtonWrite() //单击“写入到文件”按钮{// TODO: Add your control notification handler code hereUpdateData(true);CFile file;CFileDialog filedlg(0,//1-文件打开,0-文件另存为".txt|*.*",NULL,OFN_OVERWRITEPROMPT,"文本文件(*.txt)|*.txt|All Files(*.*)|*.*||",NULL);if(filedlg.DoModal()==IDOK)strFileName=filedlg.GetFileName();//获得文件名if(strFileName==""){AfxMessageBox("请输入文件名");return;}file.Open(strFileName,CFile::modeCreate|CFile::modeWrite);//将数据写入文件int length=m_WriteString.GetLength();//获取文件长度file.Write((LPCTSTR)m_WriteString,length);//获取有关文件的信息CString AfxMessageBox("已保存到文件:"+strFileName+"!");//保存结束提示strFilePath=file.GetFilePath();//获得文件的路径file.Close();//关闭文件}4、查看文件路径双击下压按钮“查看文件路径”,编写“查看文件路径”的消息处理函数void CMyDlg::OnButtonFilepath() //查看文件路径{// TODO: Add your control notification handler code herem_FilePath=strFilePath;UpdateData(false);}5、读入文件1)定义判断文件类型是否正确的函数(粗体字为此处添加的代码)class CMyDlg : public CDialog{// Constructionpublic://定义变量CString strFileName;//文件名CString strFilePath;//文件路径BOOL IsT extFile(CString& rFile);//判断文件类型是否正确CMyDlg(CWnd* pParent = NULL); // standard constructor………}2)编写IsTextFile函数BOOL CMyDlg::IsTextFile(CString &rFile)//判断文件类型是否正确{CStringList strList;CString str(rFile);strList.AddHead(".TXT");strList.AddHead(".SYS");strList.AddHead(".BA T");strList.AddHead(".DA T");str=str.Right(4);//文件名的右边四位字符str.MakeUpper();//转换成大写return(strList.Find(str))?TRUE:FALSE;}3)在“基于对话框的文件读写Dlg.cpp”文件开头添加头文件#include "fstream.h"//添加的头文件4)单击下压按钮“读入文件”,编写下压按钮“读入文件”的消息函数void CMyDlg::OnButtonRead(){// TODO: Add your control notification handler code herefstream f1;//定义文件流对象char s[200];CFileDialog filedlg(1,//1-文件打开,0-文件另存为".txt|*.*",NULL,OFN_OVERWRITEPROMPT,"文本文件(*.txt)|*.txt|All Files(*.*)|*.*||",NULL);if(filedlg.DoModal()==IDOK){UpdateData(true);strFileName=filedlg.GetFileName();//获得文件名if(!IsTextFile(strFileName))//判断文件类型是否正确{AfxMessageBox("文件类型不正确");return;}f1.open(strFileName,ios::in|ios::nocreate);while(!f1.eof()){f1.getline(s,255);m_strRead=m_strRead+"\r\n"+s;//添加文件中的文本到编辑框UpdateData(false);}AfxMessageBox(strFileName+"文件读入完毕");//保存结束提示f1.close();//关闭文件流}}6、运行程序1)在写入文件的编辑框中输入内容,单击“写入文件”按钮,并可选择路径保存该文件。
使用MFC读取大文件
// 将文件数据映射到进程的地址空间
PBYTE pbFile = (PBYTE)MapViewOfFile(hFileMapping,
FILE_MAP_ALL_ACCESS,
(DWORD)(qwFileOffset>>32), (DWORD)(qwFileOffset&0xFFFFFFFF), dwBytesInBlock);
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile);
函数CreateFile()即使是在普通的文件操作时也经常用来创建、打开文件,在处理内存映射文件时,该函数来创建/打开一个文件内核对象,并将其句柄返回,在调用该函数时需要根据是否需要数据读写和文件的共享方式来设置参数dwDesiredAccess和dwShareMode,错误的参数设置将会导致相应操作时的失败。
VC读取大文件
VC++中使用内存映射文件处理大文件
摘要: 本文给出了一种方便实用的解决大文件的读取、存储等处理的方法,并结合相关程序代码对具体的实现过程进行了介绍。
引言
文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类,常用的有Win32 API的CreateFile()、WriteFile()、ReadFile()和MFC提供的CFile类等。一般来说,以上这些函数可以满足大多数场合的要求,但是对于某些特殊应用领域所需要的动辄几十GB、几百GB、乃至几TB的海量存储,再以通常的文件处理方法进行处理显然是行不通的。目前,对于上述这种大文件的操作一般是以内存映射文件的方式来加以处理的,本文下面将针对这种Windows核心编程技术展开讨论。
c#txt文件的读取和写入
c#txt⽂件的读取和写⼊ 我们在⼯程实践中经常要处理传感器采集的数据,有时候要把这些数据记录下来,有时候也需要把记录下来的数据读取到项⽬中。
接下来我们⽤C#演⽰如何对txt⽂件进⾏读写操作。
我们要⽤到StreamReader 和 StreamWriter 类,⽤于⽂本⽂件的数据读写。
这些类从抽象基类 Stream 继承,Stream ⽀持⽂件流的字节读写。
过程如下: (1)我们新建⼀个C#控制平台项⽬,引⽤System.Io; (2)定义StreamReader对象,并将要读取⽂本的路径作为对象的参数; (3)使⽤readline⽅法读取⽂本中的内容,readline是⼀⾏⼀⾏的读取。
(4)将读取的内容保存到列表中。
(5)关闭StreamReader对象。
⽂件的写⼊和⽂件的读取类似。
using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;namespace writehandread{class Program{static void Main(string[] args){//将ys.txt中的内容读取到列表data中List<string> data = new List<string>();StreamReader sr = new StreamReader("D://test.txt");while (sr.ReadLine ()!=null ){data.Add(sr.ReadLine());}sr.Close();//将data中的内容写⼊test.txt中StreamWriter sw = new StreamWriter("D://test1.txt");for (int i=0 ;i<data .Count ;i++){sw.WriteLine(data[i]);}sw.Flush();sw.Close();}}}。
MFC txt文件读写
文本文件的读写正确的文本文件读写过程1.定义文件变量;2.打开指定的文件;3.向从文本文件中写入信息;4.从文本文件中读取信息;5.关闭文件1、定义文件变量定义文件变量格式:CStdioFile 文件变量;例如,定义一个名称为f1的文件变量,语句如下:CStdioFile f1;2、打开指定文件可以直接通过CStdioFile的构造函数来打开磁盘文件,同时可以用标志位指定打开方式(只读、只写、读写等):CStdioFile(LPCTSTR lpszFileName,UINT nOpenFlags);其中,lpszFileName表示要打开的文件名,可以是相对路径或绝对路径nOpenFlags设置文件打开方式标志位,可以指定用“|”连接多个标志位。
下面是常用的打开标志:CFile::typeText:以文本文件的形式打开文件CFile::typeBinary:以二进制文件的形式打开文件CFile::modeCreate:如果指定文件名的文件不存在,则新建文件;如果文件存在并且没有设置CFile::modeNoTruncate标志,则清空文件。
CFile::modeNoTruncate:如果文件存在,不把它的长度删除为0(即不清空文件中的数据)。
CFile::modeRead:以只读方式打开文件CFile::modeReadWrite:以可读可写方式打开文件CFile::modeWrite:以只写方式打开文件CFile::shareDenyNone:文件打开后,不禁止其他进程对文件的读写操作CFile::shareExclusive:文件打开后,禁止其他进程对文件的读写操作CFile::shareDenyRead:文件打开后,禁止其他进程对文件的读操作CFile::shareDenyWrite:文件打开后,禁止其他进程对文件的写操作此外,可以不在构造函数中打开文件,而仅仅调用空的构造函数CStidoFile(),然后用CStdioFile::Open()打开文件。
MFC读写文件详解
MFC读写⽂件详解1.CFile类提供了对⽂件进⾏打开,关闭,读,写,删除,重命名以及获取⽂件信息等⽂件操作的基本功能,⾜以处理任意类型的⽂件操作。
虽然使⽤CArchive类内建的序列化功能是保存和加载持久性数据的便捷⽅式,但有时在程序中需要对⽂件处理过程拥有更多的控制权,对于这种⽂件输⼊输出(I/O)服务的需求,Windows提供了⼀系列相关的API函数,并由将其封装为CFile类,提供了对⽂件进⾏打开,关闭,读,写,删除,重命名以及获取⽂件信息等⽂件操作的基本功能,⾜以处理任意类型的⽂件操作。
CFile类是MFC⽂件类的基类,⽀持⽆缓冲的⼆进制输⼊输出,也可以通过与CArchive类的配合使⽤⽽⽀持对MFC对象的带缓冲的序列化。
CFile类包含有⼀个公有型数据成员m_hFile,该数据成员包含了同CFile类对象相关联的⽂件句柄。
如果没有指定句柄,则该值为CFile::hFileNull。
由于该数据成员所包含的意义取决于派⽣的类,因此⼀般并不建议使⽤m_hFile。
通过CFile类来打开⽂件可以采取两种⽅式:⼀种⽅式是先构造⼀个CFile类对象然后再调⽤成员函数Open()打开⽂件,另⼀种⽅式则直接使⽤CFile类的构造函数去打开⼀个⽂件。
下⾯的语句分别演⽰了⽤这两种⽅法打开磁盘⽂件“C:/1.txt”的过程:CFile file;file.open("C://1.txt",CFile::modeReadWrite);其中参数CFile::modeReadWrite是打开⽂件的模式标志,CFile类中与之类似的标志还有⼗⼏个,现集中列表如下: ⽂件模式标志说明 CFile::modeCreate 创建⽅式打开⽂件,如⽂件已存在则将其长度设置为0 CFile::modeNoInherit 不允许继承 CFile::modeNoTruncate 创建⽂件时如⽂件已存在不对其进⾏截断 CFile::modeRead 只读⽅式打开⽂件 CFile::modeReadWrite 读写⽅式打开⽂件 CFile::modeWrite 写⼊⽅式打开⽂件 CFile::shareCompat 在使⽤过程中允许其他进程同时打开⽂件 CFile::shareDenyNone 在使⽤过程中允许其他进程对⽂件进⾏读写 CFile::shareDenyRead 在使⽤过程中不允许其他进程对⽂件进⾏读取 CFile::shareDenyWrite 在使⽤过程中不允许其他进程对⽂件进⾏写⼊ CFile::shareExclusive 取消对其他进程的所有访问 CFile::typeBinary 设置⽂件为⼆进制模式 CFile::typeText 设置⽂件为⽂本模式 这些标志可以通过“或”运算符⽽同时使⽤多个,并以此来满⾜多种需求。
文本文件的读写方法
文本文件的读写方法1. 打开文件:在进行文本文件的读写之前,首先需要使用合适的方式打开文件,可以使用Python的open()函数来实现。
2. 读取文件内容:使用Python的read()方法来读取文本文件中的内容,可以一次性读取整个文件的内容,也可以指定读取的字符数。
3. 逐行读取:使用readline()方法来逐行读取文本文件的内容,适用于处理大型文本文件。
4. 读取所有行:使用readlines()方法来读取文本文件中所有行的内容,并将其保存在一个列表中。
5. 写入文件内容:使用write()方法将数据写入到文本文件中,可以是字符串或者其他数据类型。
6. 追加模式:使用'w'模式打开文件时,如果文件已经存在,会将其内容清空然后重新写入,为了避免覆盖原有内容,可以使用'a'模式来进行追加写入。
7. 关闭文件:使用close()方法关闭打开的文件,确保文件被正确释放并保存所做的更改。
8. with语句:使用Python的with语句可以更方便地管理文件的打开和关闭,可以自动处理文件对象的释放。
9. 二进制模式:在打开文件时,可以使用'b'模式来指定二进制模式,适用于处理非文本文件。
10. 编码设置:在打开文件时,可以指定文件的编码格式,以便正确解析文件中的内容,如'utf-8'、'gbk'等。
11. 文件指针操作:使用seek()方法可以移动文件指针到指定位置,以便进行读取或者写入相关操作。
12. tell()方法:使用tell()方法可以获取文件指针当前的位置,便于记录文件读写的位置。
13. 读取指定字节数:使用read(n)方法可以读取指定数量的字节数,对于大文本文件可以节省内存。
14. 写入换行符:使用'\n'来添加换行符,以便实现文件内容的分行显示。
15. 文件操作异常处理:在读写文件时,使用try-except语句处理可能出现的异常,如文件不存在、权限错误等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文本文件的读写正确的文本文件读写过程1.定义文件变量;2.打开指定的文件;3.向从文本文件中写入信息;4.从文本文件中读取信息;5.关闭文件1、定义文件变量定义文件变量格式:CStdioFile 文件变量;例如,定义一个名称为f1的文件变量,语句如下:CStdioFile f1;2、打开指定文件可以直接通过CStdioFile的构造函数来打开磁盘文件,同时可以用标志位指定打开方式(只读、只写、读写等):CStdioFile(LPCTSTR lpszFileName,UINT nOpenFlags);其中,lpszFileName表示要打开的文件名,可以是相对路径或绝对路径nOpenFlags设置文件打开方式标志位,可以指定用“|”连接多个标志位。
下面是常用的打开标志:CFile::typeText:以文本文件的形式打开文件CFile::typeBinary:以二进制文件的形式打开文件CFile::modeCreate:如果指定文件名的文件不存在,则新建文件;如果文件存在并且没有设置CFile::modeNoTruncate标志,则清空文件。
CFile::modeNoTruncate:如果文件存在,不把它的长度删除为0(即不清空文件中的数据)。
:以只读方式打开文件CFile::modeReadWrite:以可读可写方式打开文件CFile::modeWrite:以只写方式打开文件CFile::shareDenyNone:文件打开后,不禁止其他进程对文件的读写操作CFile::shareExclusive:文件打开后,禁止其他进程对文件的读写操作CFile::shareDenyRead:文件打开后,禁止其他进程对文件的读操作CFile::shareDenyWrite:文件打开后,禁止其他进程对文件的写操作此外,可以不在构造函数中打开文件,而仅仅调用空的构造函数CStidoFile(),然后用CStdioFile::Open()打开文件。
Open函数的前两个参数和非空构造函数的参数相同,其声明如下:BOOL Open(LPCTSTR lpszFileName,UINT nOpenFlags,CFileException* pError=NULL);第3个参数与打开失败时的异常处理有关。
实例1:以只读方式打开一个文件步骤:使用AppWizard创建一个对话框应用程序,删除其自动产生的所有控件,添加一个Button 控件。
双击控件,在相应的函数里添加代码:char * pszFileName="C:\\myfile.txt";CStdioFile myFile;CFileException fileException;if(!myFile.Open(pszFileName,CFile::modeCreate|CFile::typeText|CFile::modeRead),&file Exception){TRACE("Can't open file %s, error = %u\n",pszFileName,fileException.m_cause);}运行结果:如果C:\下没有myfile.txt文件,则新生成该文件。
3.向从文本文件中写入信息CStdioFile提供了函数WriteString来向文本文件中写入文本,WriteString函数的格式如下:void WriteString(LPCTSTR lpsz);WriteString的参数lpsz是一个以”\0”字符结束的字符串,要把这个字符串的内容写入文件。
提示:使用WriteString函数时,如果希望每执行一次WriteString,文本文件中的内容就会自动换行一次,那么就需要在需要换行的地方输出“\n”:myFile.WriteString(“第1行\n”);实例2:向文件中写入文本建立MFC基于对话框的程序,删除自动添加的所有控件,添加一个“确定”按钮,双击按钮,按默认添加事件函数,双击按钮,在相应的函数处添加如下代码:char* pszFileName="C:\\myfile.txt";CStdioFile myFile;CFileException fileException;if(myFile.Open(pszFileName,CFile::typeText|CFile::modeCreate|CFile::modeReadWrite), &fileException){myFile.WriteString("第1行\n");CString strOrder;strOrder.Format("%d,%.3f",66,88.88);myFile.WriteString(strOrder);}else{TRACE("Can't open file %s,error=%u\n",pszFileName,fileException.m_cause);}程序运行结果:C:\myfile.txt文件中内容如下:第1行66,88.8804.从文本文件中读取信息CStidoFile提供了函数ReadString来读取文本,ReadString有两种形式,一种为:virtual LPTSTR ReadString(LPTSTR lpsz, UINIT nMax);ReadString函数的参数如下:lpsz :是用户提供的一个指向字符串的指针,它用来接受从文件读出的文本,以”\0”结束。
nMax是本次所允许读入的文本字符个数,不计“\0”字符,也就是说最多能读入nMax-1个文本字符。
ReadString的返回值是一个LPTSTR类型的指针,它指向从文件读出的文本字符串,如果到达文件尾,则返回NULL。
ReadString的另一种形式为:BOOL ReadString(CString& rString);参数rString用来容纳从文件读出的文本。
CString版本忽略回车换行符,返回值是一个布尔值。
如果返回值为FALSE,表示因到达文件尾而没有读到任何字符。
提示:每执行一次ReadString,就会自动从文本文件中读取一行数据,同时文件操作指针会自动跳转到下一行。
实例3:从文件中读取文本信息步骤:创建基于对话框的MFC程序,删除所有自动添加的控件,添加按钮控件,为按钮添加事件,并在相应的函数处,添加如下代码:char* pszFileName="C:\\myfile.txt";CStdioFile myFile;CFileException fileException;if(myFile.Open(pszFileName,CFile::typeText|CFile::modeReadWrite),&fileException){myFile.SeekToBegin();CString str1;myFile.ReadString(str1);CString str2;myFile.ReadString(str2);AfxMessageBox(str1+str2);}else{TRACE("Can't open file %s,error=%u\n",pszFileName,fileException.m_cause);}myFile.Close();5.关闭文件对文件的操作完成后,使用CloseFile关闭文件。
函数CStdioFile::Close关闭一个文件,一般一个文件使用完毕就应该关闭它:myFile.Close();错误的文本文件读写过程在读写文本文件的时候,最常见的错误是---操作文件不存在。
这种错误产生的典型原因有:1.路径错误char * pszFileName="C:\\Windows\\MyFile.txt";CStdioFile myFile;CFileException fileException;if(!myFile.Open(pszFileName,CFile::modeCreate|CFile::typeText|CFile::modeReadWrite) ,&fileException){//文件操作代码}else{TRACE("Can't open file %s, error = %u\n",pszFileName,fileException.m_cause);}myFile.Close();由于将文件变量与一个绝对路径的文件名关联,而程序的数据通常存储在相对路径下,所以一旦相对路径和相对路径不一致时,就会出错。
举例而言,上一段程序本意是想从windows的安装目录下面的MyTextFile.txt文件中读取一行数据,但是如果操作系统安装的路径不是C:\Windwos,而是C:\Winnt,那么这段程序就会出错。
解决方法是在程序中使用相对路径,改正后的程序如下://获取windows路径LPTSTR lpBuffer=new char[MAX_PATH];::GetWindowsDirectory(lpBuffer,MAX_PATH);strcat(lpBuffer,"\\MyFile.txt");CStdioFile myFile;CFileException fileException;if(myFile.Open(lpBuffer,CFile::typeText|CFile::modeCreate|CFile::modeReadWrite),&fileE xception){//文件操作代码}else{TRACE("Can't open file %s, error = %u\n",pszFileName,fileException.m_cause);}myFile.Close();由于将文件变量与一个绝对路径的文件名关联,而程序的数据通常存储在相对路径下,所以一旦相对路径和相对路径不一致时,就会出错。
举例而言,上一段程序本意是想从windows的安装目录下面的MyTextFile.txt文件中读取一行数据,但是如果操作系统安装的路径不是C:\Windwos,而是C:\Winnt,那么这段程序就会出错。
解决方法是在程序中使用相对路径,改正后的程序如下://获取windows路径LPTSTR lpBuffer=new char[MAX_PATH];::GetWindowsDirectory(lpBuffer,MAX_PATH);strcat(lpBuffer,"\\MyFile.txt");CStdioFile myFile;CFileException fileException;if(myFile.Open(lpBuffer,CFile::typeText|CFile::modeCreate|CFile::modeReadWrite),&fileE xception){//文件操作代码}else{TRACE("Can't open file %s, error = %u\n",pszFileName,fileException.m_cause);}CString strFileTitle="MyFile.txt";CStdioFile myFile;CFileException fileException;if(myFile.Open(strFileTitle,CFile::typeText|CFile::modeReadWrite),&fileException){//文件操作代码myFile.WriteString("测试!");}else{TRACE("Can't open file %s, error = %u\n",pszFileName,fileException.m_cause);}myFile.Close();2.操作文件不存在如果应用程序所有路径下面不存在MyFile.txt文件,那么在WriteString写入信息时就会出错。