前言
数据是怎么写道磁盘的?
代码里面我们一个读写调用似乎就能将数据从磁盘读写。仿佛代码是直接和磁盘打交道。以我们最常见的笔记本、或台式机的磁盘SATA盘为例,其受南桥上ATA控制器支配,这里面传输的ATA指令。至少我们代码里面是没有处理这部分的,所以我们代码直接操控磁盘说不通。现实情况是,C++通过IO流库和磁盘打交道。
IO流库
C++语言中并没有输入/输出语句,而是在标准库里包含了一个I/O流类库,它与标准模板库同为C++标准库中最重要的组成部分。数据从一个对象到另一个对象的传送被抽象为“流”。数据的输入/输出就是通过输入/输出流来实现的。 流是一种抽象的概念,负责在数据的产生者和数据的使用者之间建立联系,并管理数据的流动。
流类体系
整个流类体系是一个派生类体系。按ANSI C++标准,类ios是抽象类,它的析构函数是虚函数,它的构造函数为保护的,作为所有基本流类的基类。
ios提供了对流进行格式化输入输出和错误处理的成员函数。所有派生都是公有派生。
istream类提供完成提取(输入)操作的成员函数
ostream类提供完成插入(输出)操作的成员函数。
iostream类是前两者的组合。
streambuf是一个独立的类,只是ios有一个保护访问限制的指针指向它。streambuf的作用是管理一个流的缓冲区。
在流类库中,最重要的两部分功能为:
①标准输入/输出(standard input/output)
②文件处理
在C++的流类库中定义了四个全局流对象,可以完成人机交互的功能(要使用这四个功能,必须包含<iostream.h>文件。):
①cin 标准输入流对象,键盘为其对应的标准设备。带缓冲区
②cout 标准输出流对象,显示器为标准设备。带缓冲区,一旦错误发生立即显示。
③cerr 标准错误输出流,输出设备是显示器。非缓冲区
④clog 标准错误输出流,输出设备是显示器。带缓冲区
输入输出格式控制
C++在类ios中提供格式化输入输出。这些格式是对所有文本方式的输入输出流均适用。格式控制符定义为公有的无名的枚举类型:
1 enum{ skipws=0x0001, //跳过输入中的空白字符 2 left=0x0002, //输出左对齐 3 right=0x0004, //输出右对齐 4 internal=0x0008, //在输出符号或数制字符后填充 5 dec=0x0010, //在输入输出时将数据按十进制处理 6 oct=0x0020, //在输入输出时将数据按八进制处理 7 hex=0x0040, //在输入输出时将数据按十六进制处理 8 showbase=0x0080, //在输出时带有表示数制基的字符 9 showpoint=0x0100, //输出浮点数时,必定带小数点 10 uppercase=0x0200, //输出十六进制,用大写 11 showpos=0x0400, //输出正数时,加”+”号 12 scientific=0x0800, //科学数方式输出浮点数 13 fixed=0x1000, //定点数方式输出实数 14 unitbuf=0x2000, //插入后,立即刷新流 15 stdio=0x4000} //插入后,立即刷新stdout和stderr 16 17