文本文件的读写

正确的文本文件读写过程

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()打开文件。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),&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:向文件中写入文本

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

步骤:创建基于对话框的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),&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();

MFC中TXT文件读写相关推荐

  1. MFC中的文件读写技术

    计算机室如何管理自身所存放着的大量的信息的呢?windows的磁盘管理程序为我们提供了一套严密而又高效的信息组织形式--硬盘上的信息是以文件的形式被管理的. 面向存储的文件技术 什么是文件?计算机中, ...

  2. Cmap和Carray以及Cstring的使用以及MFC中的文件读写

    参考资料:百度文库http://wenku.baidu.com/view/ddd1b32558fb770bf78a55a5.html?from=search http://wenku.baidu.co ...

  3. ZWeily的小品文(一)MFC中的文件读写问题

    "终于搞定了",只听见Weily在工作台前自言自语. "忙了几天,终于把主要的bug都去掉了,该休息一会儿了."于是Weily拿起桌上的那只印有杨威利头像的杯子 ...

  4. verilog从txt中读取_verilog语言中的文件读写

    verilog语言中的文件读写 原创: IC控 IC控 2月22日 在Verilog语言中,对文件的读写一般用在编写testbench,而用到的系统函数大概有以下几种,首先是$fopen,然后是对文件 ...

  5. C++中txt文件的读取和写入

    C++中Txt文件读取和写入 一.ASCII 输出 为了使用下面的方法, 你必须包含头文件<fstream.h>(译者注:在标准C++中,已经使用<fstream>取代< ...

  6. VC中海量文件读写类设计与应用(转)

    VC中海量文件读写类设计与应用   沈瑞冰 摘要 本文阐述了海量文件读写的一般方法,并分析了该方法中存在的内存耗尽问题和解决办法,并就此设计了一个海量文件读写类,封装了海量文件读写操作,最后给出了一个 ...

  7. MFC中打开文件对话框:CFileDlg

    MFC中打开文件对话框:CFileDlg CFileDialog 文件选择对话框的使用:首先构造一个对象并提供相应的参数,构造函数原型如下: CFileDialog::CFileDialog( BOO ...

  8. VC中海量文件读写类设计与应用

    VC中海量文件读写类设计与应用 文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类,常用的有Win32 API的CreateFile().WriteFile ...

  9. python txt文件读写(追加、覆盖)

    python txt文件读写(追加.覆盖) 读取文件每一行 # 读取文件每一行 with open(r"C:\Users\xiahuadong\Desktop\数字人代码\文件行数.txt& ...

  10. java ftp读取文件内容_java读取ftp中TXT文件的案例

    最近在开发关于java读取ftp中TXT文件,其中有些坑踩了一下,再次做个记录 1.读取文件时我会根据文件名称去生成数据库表,oracle数据库对于表名的长度是有限制的,最多30个字符 2.对于多个文 ...

最新文章

  1. 目标检测推理部署:优化和部署
  2. 交叉熵损失(Cross Entropy Loss)计算过程
  3. [手机分享]黑莓手机7系列分享之——黑莓7730
  4. 关于reviewboard汉化
  5. 【kernel 中内存分配那点事】
  6. JSP页面中实现使用taglib导入库时自动提示(JSTL 库安装)
  7. hive中的一些参数
  8. windows下面的txt在linux下面显示为乱码
  9. 鸡啄米vc++2010系列2(项目文件分析)
  10. 基于JAVA+SpringMVC+Mybatis+MYSQL的志愿者服务管理系统
  11. 学习gSOAP从这个网址开始
  12. 判断一个整数是不是回文
  13. 找不到 org/springframework/dao/support/PersistenceExceptionTranslator
  14. UTM 投影ZONE的选择
  15. 指派问题的遗传算法求解 Java实现
  16. Linux进程间通信-消息队列
  17. mysql 身份证号码判断
  18. 测试开发工作者日记:2020.67-6.9
  19. 一个字节8位,无符号类型,最大值为什么是2的8次方-1,范围0-255
  20. 如何使用SOLIDWORKS绘制外螺纹线?

热门文章

  1. 如何调整plt.plot()线的粗细,linewidth
  2. 硬件工程师其实拼的是细节
  3. Type-C PD充电简介
  4. pandas task-08
  5. 迅雷离线下载分享网站
  6. PTV-VISSIM交通仿真软件
  7. Team Foundation Server 开发流程管理管理研讨会
  8. 2021年声纹识别研究与应用学术研讨会笔记
  9. java rnn生成古诗_基于循环神经网络(RNN)的古诗生成器
  10. 一文搞懂 FlinkSQL函数 LAST_VALUE 的原理