为了方便起步先从istream类对象cin和ostream类对象cout开始,了解输入和输出的基本方法;
同时使用ifstream和ofstream对象进行文件的输入和输出;
然后详细学习cin和cout类,看看它们是如何设计的?学习如何控制输出格式
用于文件输入和输出的C++工具都是基于cin和cout所基于的基本类定义;
以控制台I/O为跳板,来研究文件I/O;
首先回顾一下I/O发展历程:
C语音最初把I/O留给了编译器实现人员,这是为了让实现人员能够自由设计I/O函数,使之最适合于目标计算机的硬件要求。
实际上,多数实现人员都把I/O建立在最初为UNIX环境开发的库函数的基础上。
后来ANSI C正式承认这个I/O软件包,将其称为标准输入/输出包,将其作为C库不可或缺的一部分。
C++也承认这个软件包,因此可以在C++程序中使用stdio.h文件中声明的C函数系列。
然而C++依赖于C++的I/O解决方案,而不是C语言的I/O解决方案。
前者是在头文件istream和fstream中定义了一组类。
但是这个类库不是正式语言定义的一部分,这是因为语言毕竟只是定义了工作的规则,但没有定义要按照这些规则创建哪些东西。
C++也自带了一个标准类库,但是这个标准不是一个正式的标准,只是由iostream和fstream中定义的类组成的。
ANSI/ISO C++委员会决定把这个类正式作为一个标准类库,并添加其他一些标准类。
后面会开始讨论C++ I/O的概念框架
=====================================================
一、流和缓冲区
C++程序把输入和输出看成字节流。
输入时,程序从输入流抽取字节。
输出时,程序将字节插入输出流中。
更通俗地讲:字节可以构成字符或数值数据的二进制表示。//字节可以被解释成字符或者数值数据
输入流中的字节可能来自键盘、文件、存储设备或其他程序;
输出流的字节可以流向屏幕、打印机、存储设备或其他程序;
流充当了程序和流源或流目标之间的桥梁。
这样做的好处是使得C++程序可以以相同的方式对待来自键盘的输入和来自文件的输入;就是屏蔽了外界的差异性。
C++程序只是检查字节流。而不需要知道字节来自何方,去向哪里。
输入和输出的管理,就是要将流的两端连起来,
对于输出流:一端是程序,一端是流向的目的地;
对于输入流:一端是程序,一端是流入的源;
通过使用缓冲区可以更高效地处理输入和输出。
缓冲区是用作中介的内存块。它是将信息从设备传输到程序或者从程序传输得设备的临时存储工具。
缓冲区可以帮助匹配不同的信息传输速率。
输出时程序先把整块数据传输给硬盘,并清空缓冲区,以备下一批输出使用。
这被称为刷新缓冲区。
C++程序通常在用户按下回车键时刷新输入缓冲区。
对键盘输入进行缓冲可以让用户在将输入传输给程序之前返回并更正。
对于屏幕输出,C++程序通常在用户发送换行符时,刷新输出缓冲区。
=====================================================
二、流、缓冲区和iostream文件
管理流和缓冲区的工作有点复杂,但iostream文件中包含一些专门设计用来实现、管理流和缓冲区的类。
使用ostream对象(cout)来处理输出。
=====================================================
三、重定向
标准输入和输出流通常连接着键盘和屏幕;
但很多操作系统都支持重定向,这个工具使得能够改变标准输入和标准输出;
cout代表的标准输出流是程序输出的常用通道。标准错误流(由cerr和clog代表)用于程序的错误消息 。
默认情况下,这3个对象都被发送给显示器。
但对标准输出重定向并不会影响cerr和clog,因此如果使用其中一个对象来打印错误消息,程序将在屏幕上显示错误消息,即使常规的cout输出被重定向到其他地方。