I/O流的概念和流类库的结构
站在程序的角度
程序的输入指的是从输入文件将数据送给程序,程序的输出指的是从程序将数据传送给输出文件。
C++输入输出包含以下三个方面的内容:
对于系统指定的标准设备的输入和输出。即从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称标准I/O。[标准I/O只从键盘输入,输出到显示器]
以外存磁盘文件为对象进行输入和输出,即从磁盘文件输入数据,数据输出到磁盘文件。
以外存文件为对象的输入输出称为文件的输入输出,简称文件I/O.
对内存中指定的空间进行输入和输出。通常指定一个字符数组作为存储空间(实际上可以利用该空间存储任何信息)。这种输入输出称为字符串输入输出,简称串I/O.
标准IO | 从键盘输入,显示器屏幕输出 |
文件IO | 从文件输入、输出 |
串IO | 从内存输入、输出 |
C++的I/O对C的发展--类型安全和可扩展性
在C语言中,用printf和scanf进行输入输出,往往不能保证所输入输出的数据是可靠的、安全的。在C++的输入输出中,编译系统对数据类型进行严格的检查,凡是类型不正确的数据都可能通过编译。因此C++的I/O操作是类型安全的。C++的I/O操作是可以扩展的,不仅可以用来输入输出标准类型的数据,也可以用于用户自定义的数据类型。(操作符重载 << >> 只能通过友元函数)
C++通过I/O类库来实现丰富的I/O功能。这样使C++的输入输出明显地优于C语言中的printf和scanf,但是也为之付出了一些代价,C++的I/O系统变得比较复杂,要掌握的细节比较多。(相对来说,printf和scanf的读写速度比cin和cout更快)。
C++编译系统提供了用于输入输出的iostream类库。iostream这个单词分为三部分:i-o-stream(输入-输出-流)。在iostream类库中包含许多用于输入输出的类。
I/O类库中常见的流类
类名 | 作用 | 在哪个头文件中声明 |
ios | 抽象基础 | iostream |
istream ostream iostream |
通用输入流和其他输入流的基类 通用输出流和其他输出流的基类 通用输入输出流和其他输入输出流的基类 |
iostream iostream iostream |
ifstream ofstream fstream |
输入文件流类 输出文件流类 输入输出文件流类 |
fstream fstream fstream |
istrstream ostrstream strstream |
输入字符串流类 输出字符串流类 输入输出字符串流类 |
strstream strstream strstream |
ios是抽象基类,由它派生出iostream类和ostream类,两个类名中第1个字母i和o分别代表输入(input)和输出(output)。istream类支持输入操作,ostream类支持输出操作,iostream类支持输入输出操作。iostream类是从istream类和ostream类通过多重继承而派生的类。
C++对文件的输入输出需要用ifstream类和ofstream类,两个类名中第1个字母 i 和 o 分别代表输入输出。第2个字母f代表文件(file)。ifstream支持对文件的输入操作,ofstream支持对文件的输出操作。类ifstream继承了类istream,类ofsream继承了类ostream,类fstream继承了类iostream.
与iostream类库有关的头文件
iostream类库中不同的类的声明被放在不同的头文件中,用户在自己的程序中用#include命令包含了有关的头文件就相当于在本程序中声明了所需要用到的类。可以换一种说法:头文件是程序与类库的接口 iostream类库的接口分别由不同的头文件来实现。常用的有:
iostream 包含了对输入输出流进行操作所需的基本信息
fstream 用于用户管理的文件的 I/O 操作
strstream 用于字符串流I/O
stdiostream 用于混合使用C和C++的I/O机制时
iomainp 在使用格式化I/O时应包含此头文件
在iostream头文件中定义的流对象
iostream头文件中定义的类:ios istream ostream iostream istream_withassign ostream_withassign isstream_withassign等
iostream头文件中定义的对象:
对象 | 含义 | 对应设备 | 对应的类 | 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作为参数,这样它就与标准输出设备(显示器)联系起来。
在iostream头文件中重载运算符
“<<”和“>>”本来在C++中是被定义为左移操作符和右移操作符的,由于在iostream头文件中对它们进行了重载,使它们能够作标准类型数据的输入和输出运算符。所以,在用它们的程序中必须使用#include包含到程序中。#include <iostream>