14.3 流类库

    前面对高层I/O进行了简单的介绍,实际C++引入的流类库比高层I/O更为安全高效,流类库对输入、输出和文件等的操作进行了合理的封装,使得程序的逻辑结构更为清晰。因为绝大多数的流类库是模板形式,可示例化为char版本和wchar_t版本,如无特别说明,本节讨论的是char版本的情况,wchar_t版本与char版本完全一致。

    14.3.1 流类库更安全、更高效

    理解这个标题的关键在于“更”字,不可否认,从C标准库继承来的高层I/O也十分安全和高效,但为什么说流类库比高层I/O更安全高效呢?这要从流类库和高层I/O的机制区别说起。

    高层I/O库函数主要用来处理基本数据类型(字符、整型和浮点数等),它使用参数表进行数据传输,并且使用控制字符串指定数据类型和输入输出格式。它在运行时对格式字符串进行语法分析,并据此对变量进行解释。

    虽然printf函数和scanf族函数(包括串行版本和文件版本)已经被很好地进行过优化,在运行期间进行解释却严重依赖于用户的输入,稍不留意便可能出现问题。如果能在编译期间分析格式字符串里的变量,根据不同的类型调用各自的函数来进行处理,会加快运行速度,而且编译期间的类型检查有助于发现错误。

    另外对高层I/O来说,不能通过重载对printf函数和scanf族函数进行扩展,用于输出自定义的结构和类型,因为重载函数要有不同类型的参数,而printf函数和scanf族函数的参数表本身都是可见的,因此高层I/O无法满足自定义结构变量或类对象的输入输出要求。

    流类库是通过类的继承,类成员函数的重载来实现的。继承性和多态性使得流类库可以用统一的函数接口操作标准I/O、文件及存储块等输入输出设备。不仅通过函数重载,为每种内部数据类型定义了流输入输出函数,还使得用户可以用相同的格式对各种数据类型进行操作,编译程序根据数据的类型自动选择相应的输入输出函数,具备了很好的扩展性,用户通过重载还可以对自定义的对象进行流的操作。因此,与高层I/O相比,流类库更简单、更安全、更有效。