我们一直使用cout将数据写到屏幕,使用cin从键盘读取数据,但对他们的工作原理却没有全面的了解。
其实C++没有定义如何将数据写入屏幕或文件,也没有定义如何将数据读入程序。然而,使用c++编写程序时,这些是不可缺少的部分,标准的C++库包含用来方便输入输出的(I/O)的iostream库。
将输入和输出同语言分开并使用库来处理输入输出的优点是,更容易使语言独立于平台。也就是说,可以在PC上编写C++程序,然后在Sun工作站上重新编译并运行它们;或者在Linux上重新编译使用Windows编译器创建的代码,然后运行它。
注:库是一组扩展名为.obj的文件,可将它们链接到程序以得到额外的功能。这是最基本的代码重用形式。
当前,除对平面文件输入外,流对C++就不那么重要了,但是流是C++标准的组成部分,还是要知道一些的。
数据流的封装
流的主要目标是将从磁盘读取文件或将输入写入控制台屏幕的问题封装起来。创建流后,程序就可以使用它,流将负责处理所有细节。 正如读者可能预期到的,C++从面向对象的角度来实现流和缓冲区。他使用一系列的类和对象来完成这项任务:
1、streambuf类管理缓冲区,其成员函数提供了填充、清空、刷新和处理缓冲区的其他功能。
2、ios类是输入和输出流类的基类,它有一个成员变量为streambuf对象。
3、istream和ostream类派生而来的,用于专门管理输入和输出行为。
4、iostream是从istream和ostream类派生而来的,提供了向屏幕写入数据的输入输出方法。
5、fstream类提供了文件输入输出功能。
标准I/O对象
包含iostream类的C++程序启动时,将创建并初始化4个对象:
1、cin :处理来自标准输入设备(键盘)的输入。
2、count :处理到标准输出设备(控制台屏幕)的输出。
3、cerr :处理到标准错误设备的非缓冲输出。由于这是非缓冲的,因此发送到cerr的任何数据都将立即写入标准错误设备。而不等到缓冲区填满或收到刷 新命令。
4、clog:处理输出到标准错误设备的缓冲错误信息。
注:编译器自动将iostream类库添加到程序中。要使用这些功能,只需在程序代码开头加入正确的include语句:#include <iostream>
cin的其他成员函数---get()和getline()
成员函数get()被重载,它的第一个形式不接受任何参数并返回读取的字符的值;第二个版本中它接受一个字符引用参数,并按引用返回istream对象。在第三个也就是最后一个版本中,get()接受一个字符数组,要读取的最大字符数和结束字符(默认为换行符)作为参数。gertline()也接受3个参数:要填充的缓冲区、要读取的最大字符数加1以及结束字符,它的使用方式与get()相同,只是丢弃了结束字符。
1、如何确定何时使用插入和提取运算符,何时使用流类的其他成员函数?
一般而言,使用插入和提取运算符较容易,在其行为能够满足需求时应首选他们。反之选择使用其他成员函数(如读取包含多个单词的字符串)。
2、cerr和clog之间的区别是什么?
cerr不被缓冲,写入cerr的内容立即被输出。需要将错误消息写入屏幕时,这很合适;但将日志写入磁盘时,这将极大地影响程序的性能。clog对输出进行缓冲,但风险是如果程序崩溃将丢失部分日志数据。
3、既然printf()很管用为什么还要创建流?
printf()不支持C++的强类型系统,也不支持用户定义的类。
4、什么时候使用putback()?
在使用读操作来确定字符是否有效,但另一个读操作(可能由另一个对象执行)需要该字符位于缓冲区中时使用。这种情况大都发生在分析文件时。
来源:CSDN
作者:codebybike
链接:https://blog.csdn.net/qq_34909804/article/details/103608571