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加载数据,而 ...
随机推荐
- TCP状态转换机说明
建立一个 TCP 连接TCP 是一个面向连接的协议,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接.本节将详细讨论一个TCP 连接是如何建立的以及通信结束后是如何终止的. TCP使用三 ...
- xcode UIView常用方法属性动画
常见属性: @property(nonatomic,readonly) UIView *superview; 获得自己的父控件对象 @property(nonatomic,readonly,copy) ...
- 2015年最棒的10个 JavaScript 框架
JavaScript是最流行的前端开发程序设计语言.它为WEB开发者提供了能够设计出具有丰富功能.干净用户界面的WEB应用的能力.JavaScript框架使得WEB应用的设计变的简单,并且它能够提供很 ...
- window.showModalDialog刷新父窗口和本窗口的方法及注意
window.showModalDialog刷新父窗口和本窗口的方法及注意: 一.刷新父窗口的方法: A.使用window.returnValue给父窗口传值,然后根据值判断是否刷新. 在w ...
- 前缀 树 背单词(Remember the Word,LA 3942)
已哭瞎. 搞了2个多小时的错误居然是在 没有初始化............教训:每个例子一定要考虑到初始化问题.! 每个节点存了一个数组 该数组记录的有26个大小 0-25分别表示记录表示'a' ...
- C++内联函数、函数模板之于头文件
一.基本说明 C++标准中提到,一个编译单元是指一个.cpp文件以及它所include的所有.h文件,.h文件里的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文件 ...
- python 中文异常问题记录
头上加入以下内容试试: # -*- coding:utf-8import sysimport osreload(sys)sys.setdefaultencoding( "utf-8" ...
- springmvc乱码问题
在web.xml中加入 <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter ...
- web api 开发之 filter
1.使用filter之前应该知道的(不知道也无所谓,哈哈!) 谈到filter 不得不先了解下aop(Aspect Oriented Programming)面向切面的编程.(度娘上关于aop一大堆 ...
- windows 7 里面的iis在哪里
我的电脑------控制面板-----卸载程序------打开或关闭WINDOWS功能-----INTERNET信息服务------WEB管理工具下就能找到 给你找图你看看 向左转|向右转