C++输入输出流
一、C++输入输出流的含义
以前所用到的输入和输出,都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上。从操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件。程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件。C++的输入与输出包括以下3方面的内容:
1、对系统指定的标准设备的输入和输出。简称标准I/O。(设备)
2、以外存磁盘(或光盘)文件为对象进行输入和输出。简称文件I/O。(文件)
3、对内存中指定的空间进行输入和输出。简称串I/O。(内存)
二、 C++的输入输出流
输入和输出是数据传送的过程,数据如流水一样从一处流向另一处。C++形象地将此过程称为流(stream)。C++的输入输出流是指由若干字节组成的字节序列,这些字节中的数据按顺序从一个对象传送到另一对象。流表示了信息从源到目的端的流动。在输入操作时,字节流从输入设备(如键盘、磁盘)流向内存, 在输出操作时,字节流从内存流向输出设备(如屏幕、打印机、磁盘等)。流中的内容可以是ASCII字符、二进制形式的数据、图形图像、数字音频视频或其他 形式的信息。
实际上,在内存中为每一个数据流开辟一个内存缓冲区,用来存放流中的数据。当用cout和插入运算符“<<”向显示器输出数据时,先将这些数据送到程序中的输出缓冲区保存,直到缓冲区满了或遇到endl,就将缓冲区中的全部数据送到显示器显示出来。在输入时,从键盘输入的数据先放在键盘缓冲区中,当按回车键时,键盘缓冲区中的数据输入到程序中的输入缓冲区,形成cin流,然后用提取运算符“>>”从输入缓冲区中提取数据送给程序中 的有关变量。总之,流是与内存缓冲区相对应的,或者说,缓冲区中的数据就是流。
例如,我们看看以下代码:
程序运行的时候是:
即把a和b都输入后,才会输出字符串。
三、流对象
在头文件<iostream>中包含了四个流对象:cin, cout, cerr, clog. 下面逐一介绍:
1、cout对象
cout是console output的缩写,意为在控制台(终端显示器)的输出。
1)cout不是C++预定义的关键字,它是ostream流类的对象,在iostream中定义。顾名思义,流是流动的数据,cout流是流向显示器的数据。cout流是容纳数据的载体,它并不是一个运算符。人们关心的是cout流中的内容,也就是向显示器输出什么。
2)<iostream>为操作符“ << ”提供了多种类型的重载。用"cout<<”输出基本类型的数据时,可以不必考虑数据是什么类型,系统会判断数据的类型,并根据其类型选择调用与之匹配的运算符重载函数。
3)cout流在内存中对应开辟了一个缓冲区,用来存放流中的数据。当向cout流插人一个endl时,不论缓冲区是否已满,都支即输出流中所有数据,然后插入一个换行符,并刷新流(清空缓冲区)。注意如果插入一个换行符,'\n'(如cout<<a<<'\n';),则只输出a和换行,而不刷新cout流(但并不是所有编译系统都体现出这一区别)。
4)除了“ << ”方法外,<iostream>还提供了write()和put()方法,write()用于显示字符串,其接受两个参数,第一个为字符串的地址,第二个为要显示字符串的长度,而put()用于显示字符,并且它们的返回值都是 “ ostream & ”,所以可以链式调用,举个例子:
运行结果如图:
2、cerr对象
cerr流对象是标准出错流。cerr流已被指定为与显示器关联。cerr的作用是向标准出错设备(standard error device)输出有关出错信息。cerr是console error的缩写,意为“在控制台(显示器)显示出错信息”。cerr与标准输出流cout的作用和用法差不多。但有一点不同:cout流通常是传送到显示器输出,但也可以被重定向输出到磁盘文件,而cerr流中的信息只能在显示器输出。
3、clog对象
clog流对象也是标准出错流,它是console log的缩写。它的作用和cerr相同,都是在终端显示器上显示出错信息。它们之间只有一个微小的区别:cerr是不经过缓冲区,直接向显示器上输出有关信息,而clog中的信息存放在缓冲区中,缓冲区满后或遇endl时向显示器输出。
4、cin对象
cin是istream类的对象,它从标准输入设备(键盘)获取数据,程序中的变量通过流提取符“>>”从流中提取数据。流提取符 “>>”从流中提取数据时通常跳过输人流中的空格、tab键、换行符等空白字符。注意:只有在输入完数据再按回车键后,改行数据才被送人键盘缓冲区,形成输入流,提取运算符“>>”才能从中提取数据。输入流中还有一些成员函数可以实现字符的输入:
1)get函数:
get函数有三种重载:
(1)cin.get():若遇到输入流中的文件结束符,则函数值返回文件结束标志EOF(End Of File),一般以-1代表EOF,用-1而不用0或正值,是考虑到不与字符的ASCII代码混淆,但不同的C++系统所用的EOF值有可能不同。例子如下:
(2)cin.get(char c):其作用是从输人流中读取一个字符,赋给字符变量c.
(3)cin.get(char *p, int n, char c):其中p为字符数组指针,n为长度,c为终止字符:
运行效果如下:
以及这样:
2)getline()函数:其作用是从输人流中读取一行字符,其用法与带3个参数的get函数类似。用"cin<<”读数据时以空白字符(包括空格、tab键、回车键)作为终止标志,而用cin.getline()读数据时连续读取一系列字符,可以包括空格。
3)eof()函数:eof是end of file的缩写,表示“文件结束”。从输人流读取数据,如果到达文件末尾(遇文件结束符),eof函数值为非零值(表示真),否则为o(假)。这个函数是很有用的,经常用到。
//End.