C++ IO流——1. IO流的层次架构和文件打开的几种方式。

一. C的stdio的C++的IO流
C本身有一套很完善的IO函数库stdio,对于标准IO,文件和字符串的输入输出操作有强大的处理能力(包括格式化输入)。但站在面向对象的角度来思考IO问题的时候就会发现stdio的scanf, printf等库函数很难融入到面向对象的体系中去。C++必须要有一套自己的IO体系。
这个体系就是所谓的IO流,通过把输入/输出设备中的数据想象成在管道中流动的水流,对数据输入/输出的行为进行了很好的抽象:

istream(输入流):将字节(字符)流转换成各种对象,如

cin >> student.id >> student.name >> student.score;

就可以讲标准输入中的字符流数据送入对象中,并封装成对象要求的整数、字符串和浮点数。

ostream(输出流):将各种对象转换成字节(字符)流,如

cout << 3 << 'a' << "abcde" << student  << endl;

就可以将这里出现的整数、字符、字符串、自定义对象等转换成一个字符流输出到标准输入中。

这样的抽象定义能够将不同种类的IO设备的实现细节封装起来,不暴露给使用者,对于流的使用者而言,目标是显示器、一个文件或是一个数据库连接在使用上是并没有什么区别的。这样就能够很方便地给整个系统分层,也给更换底层设备带来了方便。

二、C++ IO流的层次架构
C++的IO流层次结构

从整个架构上来说,大致可以分成四层
第一层:ios_base,它并不是一个模板类,负责保存一些与具体流无关的格式数据信息,如场宽、数字精度等
第二层:ios,模板类,负责保存流本身的一些信息和针对某个类数据的格式信息,如流的状态,缓冲区等。
第三层:istream,ostream,以及集合了两者特性的iostream,负责描述具体的输入输出操作(并分别重载<<和>>运算符)。四个标准输入输出流对象cin、cout、cerr、clog也在其中定义,对应于C标准库中的scanf等标准输入输出操作
第四层:fstream,stringstream等,具体的IO流类的实现,对应于C标准库中的fscanf等标准输入输出操作,并包含一些各自类的中的特殊操作(如fstream中的open,close,stringstream中的str等)

除此之外,IO流体系结构中还包含有用于提供缓冲的streambuf类,其下有filebuf和stringbuf两个子类,供fstream和stringstream等使用。

三、几种流打开处理方式的探讨
体的流都有自己的打开模式,这点对于文件来说特别直观,在C语言中就有r模式r(读取),w(覆盖写),a(追加写)等各种方式。而C++提供的打开模式就更丰富。在看过C++ reference后,总算是对这些概念有所了解。下面将会从文件的角度来简单的介绍一下。
- ios_base::binary, 二进制模式
通常来说我们打开的文件都被视作字符流,但当ios_base::binary生效时,。 定义和C语言中的b开关是类似的,但在VS2013下实测发现并没有什么变化

  • ios_base::in,ios_base::out输入(输出)模式
    允许流读取被打开的对象,默认所有的istream的open方法的默认值都是ios_base::in,而ostream则默认为ios_base::out

  • app,ate,trunc的三种模式
    这说三个模式都是用于确定文件打开以后会有光标的位置的。
    app即对应于C语言中的追加写文件这种方式,施法后恢复现在大概要一个小时
    ate 这个时候要直接归为猥流氓,ate显得比什么样人都要器具了。
    trunc就是清空当前文件的所有内容,然后从头开始插入新的数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值