CStdioFile类的声明保存在afx.h头文件中。

CStdioFile类继承自CFile类,CStdioFile对象表示一个C运行函数fopen打开的的流式文件。流式文件是被缓冲的,而且可以以文本方式(默认)或者二进制方式打开。

CStdioFile类不支持CFile类中的Duplicate、LockRange、UnlockRange函数,如果你使用了,会得到C Not Supported Exception类的错误。

CStringFile类默认的是按照Text模式操作文件。

CFile 类默认的是按照二进制模式操作文件。

这里大致说明一下二进制模式和Text模式的区别。

二进制模式:对于一行的结尾我们必须输入'\r\n',才能表示回车换行的效果。

Text模式:'\r'回车的工作是自动完成的,我们只需要写入'\n'即可。在使用Text模式时从外部读入文件时,'\r\n'会被翻译成'\n',写入文件时,我们对于回车换行只需提供'\n',即可,'\r\n'会被写入到文件中。

成员变量

m_pStream成员变量:打开文件的指针。

构造函数

CStdioFile();

CStdioFile(FILE *pOpenStream);

CStdioFile(LPCTSTR lpFileName, UINT nOpenFlags);

throw(CFileException);

FILE *pOpenStream:指的是c运行函数fopen调用后返回的文件指针。

LPCTSTR lpFileName:指的是被打开的文件(绝对地址或相对地址)

UINT nOpenFlags:指的是CFile类中所描述的打开文件的方式。

读函数

virtual LPTSTR ReadString(LPTSTR lpsz, UINT nMax);

throw(CFileException);

如果使用该函数读取文本文件,当遇到'\r\n',停止读取,并去掉'\r',保留'\n',并在字符串尾部增加'\0',nMax的长度包含有'\0'字符,实际的分析如下:

如果nMax <= 字符数,读取(nMax-1)个字符+0x00;

如果nMax = 字符数 + 1,读取nMax个字符+0x00;

如果nMax > 字符数,读取nMax个字符+0x0A('\n') + 0x00;

如果文件有多行,则当文件没有读完时,返回NOT NULL,读到文件尾,返回NULL。

BOOL ReadString(CString& rString);

throw(CFileException);

读取一行文本到rString中,遇到回车换行符停止读取,回车和换行符均不读到rString中,尾部也不添加'0x00'。如果文件有多行,则当文件没有读完时,返回TRUE,读到文件尾,返回FALSE。

写函数

virtual void WriteString(LPTSTR lpsz);

throw(CFileException);

将缓冲区中的数据写入到与CStdioFile对象相关联的文件中,不支持CString类型数据写入,结束的'\0'不被写入到文件中,lpsz缓冲区中的所有换行符被替换为回车换行符,即'\n'转换为'\r\n'。

三、CStdioFile类编程原理

假如要进行的文件操作只是简单的读写整行的字符串,那么最好使用CStdioFile。首先把文本文件的每行数据读到一个缓冲区,然后使用sscanf把它转化为字符格式。

例如在一个txt文件里每一行数据格式是这样的:

A1 A2 A3 A3 ......An

那么读取的主体代码是:

CStdioFile File;  // 定义一个CStdioFile类变量File

CString FileData; // 定义一个CString,作为一个缓冲区

//定义n个临时字符串变量,大小依据实际情况,这里暂设为10

char TempStr1[10],TempStr2[10]......TempStrN[10];

File.ReadString(FileData); // 将一行数据读到缓冲区

//将该行数据的n个字符读到n个临时字符串变量

sscanf(FileData,"%s %s %s %s ......%s",TempStr1,TempStr2......TempStrN);

这种读法的一个好处是对文本格式要求不严,如下面的格式也可以

(前面可有未知个空格) A1 A2 (两个数据之间也可有未知个空格) A3 A3 ......An

CStdioFile类的用法(除此之外还有CFile,CArchive,CMemFile等等)。
  MFC中使用CStdioFile类封装了C++运行时刻文件流的操作,流文件采用缓冲方式,支持文件模式和二进制模式文件操作,默认方式为文本模式。
  CStdioFile类从CFile类继承,具有如下三个构造函数:
  1、CStdioFile():建立一个CStdioFile类的对象,但不打开文件;
  2、CStdioFile(FILE* pOpenStream):建立一个CStdioFile类的对象,并将该对象同一个已经打开的文件相联系;
  3、CStdioFile(LPCTSTR lpszFileName, UINT nOpenFlags):建立一个CStdioFile类的对象,同时打开一个文件,nOpenFlags是打开文件的方式,它可以取值如下所述:
  ·CFile::modeCreate:创建新文件,并覆盖已有文件
  ·CFile::modeRead:以只读方式打开文件
  ·CFile::modeReadWrite:以读/写方式打开文件
  ·CFile::modeWrite:以只写方式打开文件
  ·CFile::shareExclusive:不允许其他进程读/写文件
  ·CFile::typeText:表示以文本方式打开文件
  ·CFile::typeBinary:表示以二进制方式打开文件
  以上是几种常用的打开方式,还有另外几种可以去查阅相关资料。例如你可以这样创建一个新文件:
  CStdioFile ioFile("新文本.txt", CFile::modeCreate|CFile::modeWrite);或者
  CStdioFile ioFile;
  ioFile.Open("新文本.txt", CFile::modeCreate|CFile::modeWrite);
  表示创建一个名为“新文本”扩展名为TXT的只写文件,另外因为没有说明,默认为以文本方式打开而不是二进制方式。文件的关闭:ioFile.Close();
  CStdioFile类中有两种特殊的读/写文件的方法,ReadStrng和WriteString,分别读出或写入一个文本行。例如使用 WriteString时,可以这样使用:
  CString str = "这是一行文本\n";
  ioFile.WriteString(str);
  若要达到同样的目的,对应CFile而言,则应这样定义str = "这是一行文本\r\n"。
  ReadString有两种重载的用法,可以指定读出的字符数,也可以不指定,如果在读文件过程中发生异常,将产生CFileException异常。

Cstdiofile类详解相关推荐

  1. OpenCV Mat类详解和用法(官网原文)

    参考文章:OpenCV Mat类详解和用法 我马克一下,日后更 官网原文链接:https://docs.opencv.org/3.2.0/d6/d6d/tutorial_mat_the_basic_i ...

  2. 转载:c+string类详解

    C++ string 类详解 </h1><div class="clear"></div><div class="postBod ...

  3. JDBC学习笔记02【ResultSet类详解、JDBC登录案例练习、PreparedStatement类详解】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

  4. JDBC学习笔记01【JDBC快速入门、JDBC各个类详解、JDBC之CRUD练习】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

  5. Android复习14【高级编程:推荐网址、抠图片上的某一角下来、Bitmap引起的OOM问题、三个绘图工具类详解、画线条、Canvas API详解(平移、旋转、缩放、倾斜)、矩阵详解】

    目   录 推荐网址 抠图片上的某一角下来 8.2.2 Bitmap引起的OOM问题 8.3.1 三个绘图工具类详解 画线条 8.3.16 Canvas API详解(Part 1) 1.transla ...

  6. Java中的Runtime类详解

    Java中的Runtime类详解 1.类注释 /**Every Java application has a single instance of class Runtime that allows ...

  7. [NewLife.XCode]实体类详解

    NewLife.XCode是一个有10多年历史的开源数据中间件,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含 ...

  8. basicdatasourcefactory mysql_Java基础-DBCP连接池(BasicDataSource类)详解

    Java基础-DBCP连接池(BasicDataSource类)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 实际开发中"获得连接"或"释放资源 ...

  9. JAVA的StringBuffer类详解

    JAVA的StringBuffer类详解 StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer ...

最新文章

  1. Markdown简单语法
  2. 设置linux查看历史命令显示两个小时内,linux系统中history历史命令显示执行日期和时间...
  3. 【Java 网络编程】TCP 传输机制 ( 数据拆分 | 排序 | 顺序发送 | 顺序组装 | 超时重发 )
  4. vivado编译出错 [Synth 8-729] [Synth 8-787]
  5. 台式机没有显示计算机图标,为什么台式电脑没有喇叭图标
  6. linux 好用的 免费的 数据库管理工具 dbeaver
  7. 网页中、英文安全字体选择及设置
  8. Web 安全与 Rational AppScan 入门
  9. caffe安装_【开源框架】caffe图像分类从模型自定义到测试
  10. 凸函数、凸规划的定义及学习
  11. 长ping命令返回结果输出为文本
  12. 电子发票中数字签名的提取解析教程
  13. 360 x TiDB|性能提升 10 倍,360 如何轻松抗住双十一流量
  14. 联想服务器ThinkServer网卡驱动程序缺失的解决办法
  15. 管道通信的基本流程和代码
  16. MySql创建联合索引
  17. 某app登录协议逆向分析
  18. cs反恐特警3d版2java_CS反恐特警增值版
  19. 核高基引发的Linux口水战
  20. HTML,CSS,JavaScript 分别是什么?

热门文章

  1. el-upload上传图片和文件
  2. Globally Optimized Linear Windowed Tone-Mapping, aec
  3. Python自定义函数学习
  4. 引导最大内存_实际内存不够大,可用内存更加小,这样解决
  5. 推荐4款电脑必备高质量软件,各有千秋,总有一款能惊艳到你
  6. Ranorex Studio 10.1 Patch
  7. Linux服务器的远程操作
  8. 在Ubuntu调用opencv库编程显示图片并叠加文字
  9. android绑定文件描述符,认识安卓的文件描述符FileDescriptor
  10. JavaScript利用onblur事件实现文本框中英文字母全部转换成大写