fstream,ifstream,ofstream 详解与用法
fstream,istream,ofstream 三个类之间的继承关系
fstream :(fstream继承自istream和ofstream)
1.typedef basic_fstream<char, char_traits<char> > fstream;// 可以看出fstream就是basic_fstream
2.template<class _Elem,class _Traits> class basic_fstream: publicbasic_iostream<_Elem, _Traits>
3.template<class _Elem,class _Traits>class basic_iostream: publicbasic_istream<_Elem, _Traits>,publicbasic_ostream<_Elem, _Traits>
istream:
1.typedef basic_ifstream<char, char_traits<char> > ifstream;// basic_ifstream就是istream
2.template<class _Elem,class _Traits>class basic_ifstream : publicbasic_istream<_Elem, _Traits> // basic_istream 其实就是 istream
3.template<class _Elem,class _Traits>class basic_istream : virtual publicbasic_ios<_Elem, _Traits>
4.template<class _Elem,class _Traits>class basic_ios : public ios_base
5.class _CRTIMP2_PURE ios_base : public _Iosb<int>// 最终父类
ofstream:
1.typedef basic_ofstream<char, char_traits<char> > ofstream;
2.template<class _Elem,class _Traits>class basic_ofstream : publicbasic_ostream<_Elem, _Traits> // basic_ostream 其实就是 ostream
3.template<class _Elem,class _Traits>class basic_ostream: virtual publicbasic_ios<_Elem, _Traits>
4.template<class _Elem,class _Traits>class basic_ios : public ios_base
5.class _CRTIMP2_PURE ios_base : public _Iosb<int>// 最终父类
这里顺道也把STL中其他几个iostreams 提一句
iostream:
1.typedef basic_iostream<char, char_traits<char> > iostream;
2.template<class _Elem,class _Traits>class basic_iostream: publicbasic_istream<_Elem, _Traits>,publicbasic_ostream<_Elem, _Traits>
3.basic_ostream/basic_istream 都继承自basic_ios
4.template<class _Elem,class _Traits>class basic_ios : public ios_base
5.class _CRTIMP2_PURE ios_base : public _Iosb<int>// 最终父类
strstream // 继承自 iostream
streambuf // 继承自 basic_streambuf
stringstream // 继承自 basic_stringstream
istringstream // 继承自 basic_istringstream
ostringstream // 继承自 basic_istringstream
fstream 中seekg和seekp是联动的,移动读指针,写指针随之移动,移动写指针,读指针也会随之移动。 为了搞清楚具体是怎么联动的,编了个小程序测试了一下: int main() pp=7 pg=7 从结果可以发现 1)确实seekg影响到了写操作,seekp也影响到了读操作,seekg和seekp是联动的 2)tellg和tellp的值始终是一样的。 问:fstream中真有所谓的读指针和写指针吗?如果有,他们是一个东西吗? 答:实际上我们知道fstream继承自ifstream和ofstream是他们俩的子类 ,而seekp和tellp是ofstream的成员函数,seekg和tellg是ifstream的成员函数,seekp是指seek put,seekg是指seek get。之所以在fstream中他们相同,是因为这里指定打开方式 in | out 下面内容转自:http://hi.baidu.com/xpayt/blog/item/9a2b3a3033f5cc9ca9018e8f.html C++ 通过以下几个类支持文件的输入输出:
打开文件(Open a file)对这些类的一个对象所做的第一个操作通常就是将它和一个真正的文件联系起来,也就是说打开一个文件。被打开的文件在程序中由一个流对象(stream object)来表示 (这些类的一个实例) ,而对这个流对象所做的任何输入输出操作实际就是对该文件所做的操作。 要通过一个流对象打开一个文件,我们使用它的成员函数open():
这里filename 是一个字符串,代表要打开的文件名,mode 是以下标志符的一个组合: 这些标识符可以被组合使用,中间以”或”操作符(|)间隔。例如,如果我们想要以二进制方式打开文件"example.bin" 来写入一些数据,我们可以通过以下方式调用成员函数open()来实现:
ofstream, ifstream 和 fstream所有这些类的成员函数open 都包含了一个默认打开文件的方式,这三个类的默认方式各不相同:
ofstream:打开文件不存在,默认会创建这个文件。(除非指定ios::nocreate) ifstream:打开文件存在与否,默认不会创建在个文件. fstream:打开文件不存在,默认会创建这个文件。(除非只是指定ios::in 或者指定ios::nocreate) 只有当函数被调用时没有声明方式参数的情况下,默认值才会被采用。如果函数被调用时声明了任何参数,默认值将被完全改写,而不会与调用参数组合。 由于对类ofstream, ifstream 和 fstream 的对象所进行的第一个操作通常都是打开文件,这些类都有一个构造函数可以直接调用open 函数,并拥有同样的参数。这样,我们就可以通过以下方式进行与上面同样的定义对象和打开文件的操作:
两种打开文件的方式都是正确的。 你可以通过调用成员函数is_open()来检查一个文件是否已经被顺利的打开了:
它返回一个布尔(bool)值,为真(true)代表文件已经被顺利打开,假( false )则相反。 关闭文件(Closing a file)当文件读写操作完成之后,我们必须将文件关闭以使文件重新变为可访问的。关闭文件需要调用成员函数close(),它负责将缓存中的数据排放出来并关闭文件。它的格式很简单:
这个函数一旦被调用,原先的流对象(stream object)就可以被用来打开其它的文件了,这个文件也就可以重新被其它的进程(process)所有访问了。 为防止流对象被销毁时还联系着打开的文件,析构函数(destructor)将会自动调用关闭函数close。 文本文件(Text mode files)类ofstream, ifstream 和fstream 是分别从ostream, istream 和iostream 中引申而来的。这就是为什么 fstream 的对象可以使用其父类的成员来访问数据。 一般来说,我们将使用这些类与同控制台(console)交互同样的成员函数(cin 和 cout)来进行输入输出。如下面的例题所示,我们使用重载的插入操作符<<:
从文件中读入数据也可以用与 cin的使用同样的方法:
上面的例子读入一个文本文件的内容,然后将它打印到屏幕上。注意我们使用了一个新的成员函数叫做eof ,它是ifstream 从类 ios 中继承过来的,当到达文件末尾时返回true 。 状态标志符的验证(Verification of state flags)除了eof()以外,还有一些验证流的状态的成员函数(所有都返回bool型返回值):
要想重置以上成员函数所检查的状态标志,你可以使用成员函数clear(),没有参数。 获得和设置流指针(get and put stream pointers)所有输入/输出流对象(i/o streams objects)都有至少一个流指针:
我们可以通过使用以下成员函数来读出或配置这些指向流中读写位置的流指针:
流指针 get 和 put 的值对文本文件(text file)和二进制文件(binary file)的计算方法都是不同的,因为文本模式的文件中某些特殊字符可能被修改。由于这个原因,建议对以文本文件模式打开的文件总是使用seekg 和 seekp的第一种原型,而且不要对tellg 或 tellp 的返回值进行修改。对二进制文件,你可以任意使用这些函数,应该不会有任何意外的行为产生。 以下例子使用这些函数来获得一个二进制文件的大小:
二进制文件(Binary files)在二进制文件中,使用<< 和>>,以及函数(如getline)来操作符输入和输出数据,没有什么实际意义,虽然它们是符合语法的。 文件流包括两个为顺序读写数据特殊设计的成员函数:write 和 read。第一个函数 (write) 是ostream 的一个成员函数,都是被ofstream所继承。而read 是istream 的一个成员函数,被ifstream 所继承。类 fstream 的对象同时拥有这两个函数。它们的原型是: write ( char * buffer, streamsize size );
read ( char * buffer, streamsize size ); 这里 buffer 是一块内存的地址,用来存储或读出数据。参数size 是一个整数值,表示要从缓存(buffer)中读出或写入的字符数。
缓存和同步(Buffers and Synchronization)当我们对文件流进行操作的时候,它们与一个streambuf 类型的缓存(buffer)联系在一起。这个缓存(buffer)实际是一块内存空间,作为流(stream)和物理文件的媒介。例如,对于一个输出流, 每次成员函数put (写一个单个字符)被调用,这个字符不是直接被写入该输出流所对应的物理文件中的,而是首先被插入到该流的缓存(buffer)中。 当缓存被排放出来(flush)时,它里面的所有数据或者被写入物理媒质中(如果是一个输出流的话),或者简单的被抹掉(如果是一个输入流的话)。这个过程称为同步(synchronization),它会在以下任一情况下发生:
|
fstream,ifstream,ofstream 详解与用法的更多相关文章
- java continue break 关键字 详解 区别 用法 标记 标签 使用 示例 联系
本文关键词: java continue break 关键字 详解 区别 用法 标记 标签 使用 示例 联系 跳出循环 带标签的continue和break 嵌套循环 深入continue ...
- 从零开始学C++之IO流类库(二):文件流(fstream, ifstream, ofstream)的打开关闭、流状态
一.文件流 ofstream,由ostream派生而来,用于写文件 ifstream,由istream派生而来, 用于读文件 fstream,由iostream派生而来,用于读写文件 二.打开文件 说 ...
- 文件流(fstream, ifstream, ofstream)的打开关闭、流状态
一.文件流 ofstream,由ostream派生而来,用于写文件 ifstream,由istream派生而来, 用于读文件 fstream,由iostream派生而来,用于读写文件 二.打开文件 说 ...
- 结构体定义 typedef struct 用法详解和用法小结
typedef是类型定义的意思.typedef struct 是为了使用这个结构体方便.具体区别在于:若struct node {}这样来定义结构体的话.在申请node 的变量时,需要这样写,stru ...
- jquery中attr()与prop()函数用法实例详解(附用法区别)
本文实例讲述了jQuery中attr()与prop()函数用法.分享给大家供大家参考,具体如下: 一.jQuery的attr()方法 jquery中用attr()方法来获取和设置元素属性,attr是a ...
- Java中Class类详解、用法及泛化
Java中Class类及用法 Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识,即所谓的RTTI.这项信息纪录了每个对象所属的类.虚拟机通常使用运行时类型信息选准正确方 ...
- struct stat结构体的详解和用法
[cpp] view plaincopy //! 需要包含de头文件 #include <sys/types.h> #include <sys/stat.h> S_ISLNK( ...
- ServletContext详解 以及用法
ServletContext,是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放.request,一个用户可有多个:session,一个用户一个:而servletContext,所 ...
- [转]Java程序员从笨鸟到菜鸟之(八十三)细谈Spring(十二)OpenSessionInView详解及用法
首先我们来看一下什么是OpenSessionInView? 在hibernate中使用load方法时,并未把数据真正获取时就关闭了session,当我们真正想获取数据时会迫使load加载数据,而 ...
随机推荐
- Glog
Glog的简单入门,glog虽然在配置参数方面比较麻烦,但是在小规模程序中,由于其简单灵活,也许会有优势. 0, glog 是google的开源日志系统,相比较log4系列的日志系统,它更加轻巧灵活 ...
- HTML静态网页(标签、表格)
HTML静态网页: 打开DREAMWEAVER,新建HTML,如下图: body的属性: bgcolor 页面背景色 background 背景壁纸.图片 text 文字颜色 topmargin ...
- BZOJ 1189: [HNOI2007]紧急疏散evacuate( BFS + 二分答案 + 匈牙利 )
我们可以BFS出每个出口到每个人的最短距离, 然后二分答案, 假设当前答案为m, 把一个出口拆成m个表示m个时间, 点u到出口v的距离为d, 那么u->v的[d, m]所有点连边, 然后跑匈牙利 ...
- BZOJ 2561: 最小生成树(最小割)
U,V能在最小(大)生成树上,当且仅当权值比它小(大)的边无法连通U,V. 两次最小割就OK了. --------------------------------------------------- ...
- 关于playframework2.5
加入了很多新东西: 1.用akka streams 替换了大部分 iteratee-based async io,当然还有一些模块在用iteratees 2.java 的一些API 做了调整升级,以及 ...
- php分页实例附代码
一个典型的PHP分页实例代码分享,学习php的朋友肯定用得到,主要是了解思路: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transit ...
- 高效操作DOM
DOM树与Render树 这个应该都是知道的.就是用户请求HTML下来后,浏览器渲染引擎的基本工作中两个概念. copy一张图,流程大概就是:解析html构建DOM树,渲染树构建,渲染树布局,绘制渲染 ...
- [LeetCode]题解(python):124-Binary Tree Maximum Path Sum
题目来源: https://leetcode.com/problems/binary-tree-maximum-path-sum/ 题意分析: 给定一棵树,找出一个数值最大的路径,起点可以是任意节点或 ...
- 用CSS样式画横线和竖线的方法
今天在做网页的时候,需要用到CSS画横线,虽然比较简单,但也出了一些小问题,拿来做个备忘. 方法一:用DIV,代码如下:(推荐此方法) <div style="width:80 ...
- 11-C语言指针
目录: 一.指针 二.指针与数组 回到顶部 一.指针 1 内存被分为字节,每个字节有唯一地址,指针保存的是内存中的地址. 2 保存指针的变量,就叫指针变量,(保存地址) 3 声明一个指针变量 int ...