http://www.godebug.org/index.php/archives/105/
asio与序列化——被忽略的神器asio::streambuf
可惜我还没有用到序列化,以后再说吧。。。。。从磁盘中每读一个字符都需要大量的硬件活动。这样向磁盘读写数据就会花费很多时间,为了避免频繁的读写数据,提供了缓冲技术。
数据通过流的操作被读入缓冲区,此时,该数据不会立即写入到磁盘中,而是不断将其他数据读入缓存区中,直到缓冲区充满时,才一次性写入磁盘中。
缓冲区是内存中的一块区域。它对数据的处理速度比硬盘快。因此,当大量数据缓存在缓冲区中时,会无意中提高了对数据的访问速度。 同时,当数据填满缓冲区
时,数据会一次性写入硬盘,跟着刷新缓冲区,为了下次将数据读入缓冲区做准备。
在输出时,遇到行结束符号endl时才刷新缓冲区,而输入时,则是enter键才能刷新缓冲区并且将数据写入磁盘。
C++流涉及以下概念:
- 标准I/O流:内存与标准输入输出设备之间信息的传递;
- 文件I/O流:内存与外部文件之间信息的传递;
- 字符串I/O流:内存变量与表示字符串流的字符数组之间信息的传递。
STL中定义的流类:
流类分类 | 流类名称 | 流 类 作 用 |
流基类 | ios | 所有流类的父类,保存流的状态并处理错误 |
输入流类 | istream | 输入流基类,将流缓冲区中的数据作格式化和非格式化之间的转换并输入 |
ifstream | 文件输入流类 | |
istream_withassign | cin输入流类,即操作符>>输入流 | |
istrstream | 串输入流类, 基于C类型字符串char*编写 | |
istringstream | 串输入流类, 基于std::string编写 | |
输出流类 | ostream | 输出流基类,将流缓冲区中的数据作格式化和非格式化之间的转换。并输出 |
ofstream | 文件输出流类 | |
ostream_withassign | Cout、cerr、clog的输出流类,即操作符<<输出流 | |
ostrstream | 串输入流类, 基于C类型字符串char*编写 | |
ostringstream | 串输入流类, 基于std::string编写 | |
输入/输出流类 | iostream | 多目的输入/输出流类的基类 |
fstream | 文件流输入/输出类 | |
strstream | 串流输入/输出类, 基于C类型字符串char*编写 | |
stringstream | 串流输入/输出类, 基于std::string编写 |
Streambuf 类缓冲区,它的成员函数提供了填充缓冲区,访问缓冲区,刷新缓冲区和管理缓冲区的内存的功能。
ios_base是ios的基类,该类提供了流的一般访问,如输入输出操作,判断数据流是否刻度,是二进制还是文本。
标准输入输出对象
iostream.h包含了对输入输出流进行操作所需的基本信息。因此大多数C++程序都包括iostream.h。在iostream.h头文件中不仅定义了有关的类,还定义了4种流对象, 见表13.2。
对象 | 含义 | 对应设备 | 对应的类 | c语言中相应的标准文件 |
---|---|---|---|---|
cin | 标准输入流 | 键盘 | istream_withassign | stdin |
cout | 标准输出流 | 屏幕 | ostream_withassign | stdout |
cerr | 标准错误流 | 屏幕 | ostream_withassign | stderr |
clog | 标准错误流 | 屏幕 | ostream_withassign | stderr |
在iostream头文件中定义以上4个流对象用以下的形式(以cout为例):
ostream cout ( stdout);
在定义cout为ostream流类对象时,把标准输出设备stdout作为参数,这样它就与标准输出设备(显示器)联系起来,如果有
cout <<3;
就会在显示器的屏幕上输出3。
重定向
重载运算符