CPP学习之——流的简介(18.18)

一 概述

要想深入地了解string类,就不能不提到流,流的指数很多,后面会专门拿出一章来讲,这里只需要了解一下流就可以,这些知识对于学好string类已经足够了。

二 流

2.1 输入流和输出流

  • "流"从字面上理解是流动的意思,书面上的解释是物质从一处往另一处流动的过程。
  • C++的输入和输出遵循了这一概念,C++的输出是将一个对象的状态换成一个字符序列,输出到指定地方。如cout<<"hello world";双引号中的hello world是所要输出的对象,C++的重载按左移运算符<<将对象转换成一个向左的字符序列,cout则表示将其输出在计算机外部设备中,如显示器的屏幕上。
  • C++的重载按位右移运算符>>表示从指定地方按照向右移动的顺序接受字符序列,然后将其转换为对象的数据成员的格式,cin则表示将该对象写入计算机内部设备中,如磁盘或者内存

2.2 流类库

  • 由于这种操作方式类似于数据在流动,因此我们把控数据流动的cin和cout做输入输出流。凡是跟输入输出流有关系的类都叫做流类,凡是实现流类功能的成员函数全部合并在一个库中,该库叫做流类库。在C++中将这些流类和流类库封装起来,做成一个类体系,以便于用户查找和调用。
  • iostream是我们经常使用的流类库头文件,该头文件包括iostream类,ostream类和istream类等,ostream输出流类和istream输入流类同属于一个虚基类ios。ios类用来提供对流进行格式化数据的输入和输出(简写为I/O)操作和操作处理的成员函数。
  • 从Ios类公有派生的istream继承了对流进行提取操作的成员函数,即控制输入函数。而从ios类公有派生的ostream则继承了对流进行插入操作的成员函数,即控制输出函数,而输入输出流类iostream则同时继承了输入和输出函数,因此iostream可看做是istream和ostream的合并,iostream可对流进行输入输出操作,该类并没有增加新的成员函数。
  • 另外ios基类还直接派生了文件流基类fstreambase和字符串基类strstreambase,文件流基类fstreambase可以对文件流进行操作,字符串流基类strstreambase则对字符串流进行操作,输入文件流类ifstream同时继承了输入流类istream和fstreambase文件流基类,输出文件流类ofstream同时继承了ostream输出流类和fstreambase文件流基类,输入字符串流类istrstream同时继承了输入流类istream和字符串流基类streambase,输出字符串流类ostrstream同时继承了输出流类ostream和字符串流基类streambase,输入输出流类iostream同时继承了输入流istream和输出流类ostream,输入输出文件流类fstream同时继承了输入输出流类iostream和文件流基类fstreambase,输入输出字符串流类stream同时继承了输入输出流类iostream和字符串流基类streambase.

2.3 流补充

  • ostream中的o是cout的缩写,也就是输出的意思,stream是流的意思,这样ostream的一是就是输出流。
  • istream中的i是cin的缩写,意思是输入。stream是流的意思,这样istream的意思就是输入流
  • ios中的i是cin的缩写,代表输入,o是cout的缩写,代表输出,s是stream的缩写,代表流。因此ios的意思就是输出出入流

三 流构成

3.1 结构体

3.2 说明

  • 大多数情况下,程序不会将数据写入文件,因此不用使用fstream将数据输入或输出到文件,也不会输入或输出字符串,因此strstream类也不会用到,这时就会用到标准输入输出流类stdiostream
  • streambuf中的buf是buffer的缩写,buffer的意思是缓冲,stream的意思是流,因此streambuf类就是流缓冲类。这个类是个缓冲类,可以对输入输出内容进行缓冲,这样可以提高输入输出的效率。顾名思义,是用来操作文件的,加了缓冲的功能,操作文件效率更快。

总结

  • 以上只需要了解即可,不需要记忆,随着实践的增多,将会自动熟悉它们之间的关系。
  • 另外我们经常使用的cin是输入流istream类中的一个对象,而cout是输出流ostream中的一个对象,输入输出流iostream类则同时拥有这两个对象。流库中还有两个对象cerr和clog,cerr用来以非缓冲垫方式输出错误信息,错误信息会直接出现在屏幕上,而clog则是以缓冲的方式输出错误信息。错误信息不会立即出现在屏幕上,直到缓冲区满,程序结束或者程序缓冲输出时方才输出大屏幕上。