c++的I/O是我们最常用的库之一,也是操作复杂,功能复杂的类库之一。
在C++的程序中,很少有不用I/O的程序,但是,对于我来说,I/O我却用的出奇的差,只会几个简单的函数,尽管够用,但是却用的效率奇低,于是,在此学习c++ I/O类库的使用方法。
首先是I/O中流的概念,c++的I/O中的所有的操作都是基于流。
流i/o:要传递的数据是无结构的字节流,字符流或者任意同等大小单位的数据流,c++中的流是字符流,流中不包含关于数据结构的任何信息,注意是字符流,而非字节流或者位流。
i/o流的数据表达方式:
内部表示(在程序中):各种便于程序处理的数据类型
外部表示(屏幕,通信通道,存储设备。。。):文本i/o和二进制i/o;如果外部数据表示为可读的字符序列,我们成为文本i/o,所有不可读的外部表示都成为二进制i/o;标准i/o流的目的是支持文本i/o,不直接支持二进制i/o;
在外部我们的是无结构的字符,然而程序内部,我们需要的是有结构的数据类型如int,float等等。c++关于内外部的转化,设计了两层:格式化层和传递层。
首先我们来看一下,输入输出都需要哪些步骤:
1.格式化或解析:在用字节表示的内部数据与采用字符序列表示的外部数据之间的双向转化
2.缓冲:用于在格式化/解析与传递数据之间的缓存字符序列。
对于输出,较短的字符序列格式化后并不马上传递,而是保存在缓冲区,待累加到一个大数据块再传递到外部设备;
对于输入,从外部设备读入的大量数据也是先放到缓冲区
3.编码转换:将一种字符表达式转换为另一种表达式,例如多字节字符与单字节字符的转换
4.传递。
好,再回到我们说的c++中的两层:其中,格式化层负责进行格式化或者解析,传递层负责缓冲,编码转换和传递。
于是我们有了分工明确却又相互联合的两个类的概念----格式化类和传递类。后面我们发现格式化类就是流类,传递类就是流缓冲类。
至此,我们的背景知识就分析完了,下面开始C++I/O的学习。
c++的I/O体系:
首先是基本的流类体系:
然后是文件流类体系:
最后是string流类体系: