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加载数据,而 ...
随机推荐
- 【转】adb.exe,start-server' failed -- run manually if necessary
[转]Android adb.exe程序启动不起来,如何处理 解决问题: 百度google大家多说的是任务管理器 kill掉adb 或者重启adb server,但我任务管理器就没有adb ,猜测是某 ...
- 一个页面从输入URL到页面加载显示完成的详细过程
下面以访问baidu页面来做一个过程分析 输入 URL:http://www.baidu.com DNS 域名解析 计算机无法识别域名,计算机与计算机之间要想进行通信,必须通过ip地址用来定位该计算机 ...
- Java调用R——rJava的安装和配置
rJava是Java通过JRI调用R所要安装的包.配置起来比较麻烦,我参考网上进行配置,使用rJava包中example里面的示例测试,控制台显示: Cannot find JRI native li ...
- 青蛙跳台阶问题——剑指offer
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶,求该青蛙跳上一个n级台阶总共有多少中跳法. http://www.nowcoder.com/books/coding-interviews?pa ...
- LINQ的用法
http://www.cnblogs.com/liulun/archive/2013/02/26/2909985.html(转载)
- 0603 python 基础02
作业1:ANSI和utf8的区别? ASCII是用来表示英文字符的一种编码规范,每个ASCII字符占用1个字节(8bits). 可以表示的最大字符数是256,一般只用前128个(最高位为0),其中包括 ...
- verilog中连续性赋值中的延时
上次遇到一个问题.写一个testbench需要移动两个时钟之间的相位.后来一想,貌似我们都是这么写clock的 always #(`P/2) clk = ~clk 我的两个时钟都是这么写,只是p ...
- 帝国cms7.2灵动标签万能教程
学完本文,就完全能掌握帝国模板开发制作啦!这里只介绍sql语句调用方法(方便,快捷!) 灵动标签语法: [e:loop={,24,0}] 模板内容 [/e:loop] 详细解释:黄色部分:条件语句,即 ...
- perl5 第二章 简单变量
第二章 简单变量 by flamephoenix 一.整型 二.浮点数 三.字符串 基本上,简单变量就是一个数据单元,这个单元可以是数字或字符串.一.整型 1.整型 PERL最常用的简单变量,由 ...
- [转]WIBKIT技术资料
WebKit结构和流程分析 http://inedx.blog.hexun.com/28830354_d.html webkit架构 http://inedx.blog.hexun.com/28795 ...