MFC之TXT文本文件的读写

正确的文本文件读写过程:

1、定义文件变量;2、打开指定的文件;3、向文本文件中写入信息;4、从文本文件中读取信息;5、关闭文件

 

1、定义文件变量(CStdioFile类是CFile类的扩展)

定义文件变量格式:CStdioFile 文件变量(操作文件时模式是text模式)。CFile(操作文件默认的是Binary模式)

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:文件打开后,禁止其他进程对文件的写操作

此外,可以不在构造函数中打开文件,通过调用空的构造函数CStdioFile(),然后用CStdioFile::Open()打开文件。

Open函数的前两个参数和非空构造函数的参数相同,其声明如下:

BOOL Open(LPCTSTR lpszFileName,UINT nOpenFlags,CFileException* pError=NULL);

第3个参数与打开失败时的异常处理有关。

实例1 :以只读方式打开一个文件

步骤:

char * pszFileName = "C:\\myfile.txt";

CStdioFile myFile;

CFileException fileException;

if(!myFile.Open(pszFileName,CFile::modeCreate|CFile::typeText|CFile::modeRead),&fileException)

{

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:向文件中写入文本

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.880

4、从文本文件中读取信息

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:从文件中读取文本信息

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),&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),&fileException)

{

//文件操作代码

}

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写入信息时就会出错。

解决办法就是在程序中打开文件前要检查是否存在此文件。如下程序:

CString strFileTitle="MyFile.txt";

CFileFind finder;

if(finder.FindFile(strFileTitle))

{

CStdioFile myFile;

CFileException fileException;

if(myFile.Open(lpBuffer,CFile::typeText|CFile::modeCreate|CFile::modeReadWrite),&fileException)

{

//文件操作代码

}

else

{

TRACE("Can't open file %s, error = %u\n",pszFileName,fileException.m_cause);

}

}

else

{

TRACE("Can't find file %s\n",strFileTitle);

}

myFile.Close();

3.超越文件权限进行读写操作

在打开文件的过程中,通过参数指定了文件的读写权限,如果读写的操作没有和相应的权限对应,就会出现错误。

下面的程序就是典型的忽略了文件操作权限的例子:

CString strFileTitle="MyFile.txt";

CStdioFile myFile;

CFileException fileException;

if(myFile.Open(strFileTitle,CFile::typeText|CFile::modeCreate|CFile::NoTruncate|CFile::modeRead),&fileException)

{

//文件操作代码

myFile.WriteString("测试!");

}

else

{

TRACE("Can't open file %s,error=%u\n",strFileTitle,fileException.m_cause);

}

myFile.Close();

支招儿:

1.准确定位文件的路径

操作文件的过程中,经常需要将文本文件放在程序自身的目录中,但是如果仅仅在程序中使用不指定任何路径信息的相对路径,如:

myFile.Open("MyFile.txt",CFile::modeCreate|CFile::typeText|CFile::modeReadWrite);

那么就有可能出现不能正确定位的情况,准确定位文件位置的方法是获得可执行程序自身的绝对路径,如:

TCHAR FilePath[MAX_PATH];

GetModuleFileName(NULL,FilePath,MAX_PATH);

(_tcstchr(FilePath,'\\'))[1]=0;

lstrcat(FilePath,_T("MyFile.txt"));

CStdioFile myFile;

CFileException fileException;

if(myFile.Open(FilePath,CFile::modeCreate|CFile::typeText|CFile::modeReadWrite),&fileException)

{

//文件操作代码

}

else

{

TRACE("Can't open file %s,error=%u\n",FilePath,fileException.m_cause);

}

myFile.Close();

2.读文本文件指定的一行,并得到文本文件的总行数。

读文本文件指定的一行,并得到文本文件的总行数

要统计文本文件的总行数,可以从头逐行读,直到文件尾,程序:

CStdioFile myFile;

CFileException fileException;

if(myFile.Open("MyFile.txt",CFile::modeCreate|CFile::modeNoTruncate|CFile::typeText|CFile::modeReadWrite),&fileException)

{

CString strContent;

int order=1;

while(myFile.ReadString(strContent))

{

if(2==order)

{

AfxMessageBox(strContent);

}

order=order+1;

}

}

else

{

TRACE("Can't open file");

}

myFile.Close();

 

 

 

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MFC(Microsoft Foundation Classes)是一个应用程序框架,可用于开发Windows操作系统下的C++应用程序。要实现通过MFC修改XML文件的数据,可以采用以下几个步骤: 1. 导入所需的MFC类库和头文件。 要使用MFC操作XML文件,需要在C++代码中包含afx.h头文件,并在项目设置中添加对MFC的依赖。 2. 载入XML文件。 使用MFC提供的CMarkup类或CXmlDocument类,先载入需要修改的XML文件。通过调用Load或Open方法打开XML文件并将其加载到内存中。 3. 寻找需要修改的节点。 根据XML结构,使用MFC提供的节点遍历方法或XPath表达式,在XML文件中找到需要修改的特定节点。 4. 修改节点的属性或文本内容。 通过调用MFC提供的方法,可直接修改找到的节点的属性或文本内容。例如,使用SetAttrib或SetText方法设置节点的属性或文本。 5. 保存修改后的XML文件。 通过调用Save方法或SaveToFile方法,将修改后的XML文件保存到磁盘上。 下面是一个示例代码,以MFC和CMarkup类为例,演示修改XML文件中一个特定节点的属性: ```cpp #include "stdafx.h" #include "Markup.h" using namespace std; int main() { CMarkup xml; if (xml.Load("example.xml")) // 载入XML文件 { if (xml.FindElem("book")) // 找到book节点 { xml.SetAttrib("category", "new_category"); // 修改book节点的category属性值 xml.Save("modified_example.xml"); // 保存修改后的XML文件 } xml.Close(); } return 0; } ``` 以上是一个简单的示例,可根据实际需求和XML文件的复杂程度进行相应的修改和优化。通过MFC实现修改XML文件数据需要熟悉MFC框架和XML文件的结构,掌握相关的MFC类和方法,以便灵活操作XML文件中的数据。 ### 回答2: 在MFC中实现修改XML文件数据需要使用CMarkup类。CMarkup是MFC中的一个轻量级XML解析类,可以方便地读取和修改XML文件。 首先,在程序中引入CMarkup类的头文件。 然后,使用CMarkup的Open方法打开XML文件,可以选择只读或读写模式。打开后,可以使用CMarkup的FindElem和FindChildElem方法定位到需要修改的XML元素。 接下来,使用CMarkup的SetAttrib方法可以修改元素的属性值,使用SetData方法可以修改元素的文本值。 修改完成后,使用CMarkup的Save方法保存修改后的XML文件。 以下是一个简单的示例代码: ```cpp #include <afxmarkup.h> void ModifyXMLData() { CMarkup xml; if (xml.Load("data.xml")) { if (xml.FindElem("root")) { xml.IntoElem(); // 进入root元素 while (xml.FindElem("item")) { xml.SetAttrib("attribute", "new value"); xml.SetData("new data"); } } xml.Save("data.xml"); xml.Close(); } } ``` 这段代码假设XML文件名为data.xml,XML结构如下: ```xml <root> <item attribute="old value">old data</item> <item attribute="old value">old data</item> ... </root> ``` 代码中会将所有item元素的attribute属性修改为"new value",文本值修改为"new data",然后保存修改后的XML文件。 通过以上步骤,就可以在MFC中实现修改XML文件数据了。 ### 回答3: MFC(Microsoft Foundation Classes)是一种用于开发Windows应用程序的C++框架。要实现修改XML文件数据,可以按照以下步骤进行: 1. 使用MFC提供的CFile类打开XML文件。可以使用CFile的Open函数,指定文件路径和打开模式(例如读写模式)。 2. 创建一个XML文档对象。可以使用MSXML库提供的CComPtr类,通过调用其CreateInstance函数来创建一个用于解析和修改XML的DOM文档对象。 3. 使用DOM文档对象加载之前打开的XML文件。可以使用CComPtr类的Load函数,将XML文件加载到DOM文档对象中。 4. 使用DOM文档对象进行数据修改。可以使用CComPtr类提供的各种方法和属性,来获取和修改XML文件中的数据。例如,可以使用getElementsByTagName函数获取特定元素的集合,然后通过遍历集合来修改元素的属性或内容。 5. 将修改后的数据保存回XML文件。可以使用CComPtr类的Save函数,将DOM文档对象保存到同一路径的XML文件中。 6. 在完成修改后,关闭XML文件。可以使用CFile类的Close函数,关闭之前打开的XML文件。 7. 程序的其他部分需要根据具体需求进行设计,例如用户界面的布局和交互等。 总结起来,使用MFC实现修改XML文件数据的关键步骤包括:打开XML文件、创建DOM文档对象、加载XML文件、修改数据、保存到XML文件以及关闭文件。使用CFile类和CComPtr类可以实现这些步骤,并结合MFC的其他功能来完成个性化的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值