c++程序设计简明教程第九章C++的输入/输出流9.1概述9.2输出流9.3输入流9.4格式控制9.5文件的输入输出9.6小结c++程序设计简明教程9.1概述C++用流(stream)的概念描述数据的输入输出,流是计算机中的数据从源头移动到目的地的这种过程的抽象。流具有很强的方向性,与输入设备相联系的流称为输入流,与输出设备相联系的流称为输出流,与输入输出设备相联系的流称为输入输出流。c++程序设计简明教程流操作对流的基本操作有两种,从流中获得数据称为提取操作,向流中添加数据称为插入操作。C++语言用流对象来管理流,流对象一般都与某种设备相联系,程序员通过操纵流对象,达到控制输入输出的目的。c++程序设计简明教程输入输出流类输入输出流类负责把计算机的各种输入输出设备,变成流的源头和目的地,能被源源不断地提取和插入数据。streambuf类和ios类分别是两个类族的顶层基类,其它流类都是由这两个类中的一个派生而来。c++程序设计简明教程标准流对象便于程序员在程序中实现常用的输入输出功能,C++定义了4个标准的流对象,分别是cin、cout、cerr和clog。cin对象负责标准输入,即从键盘输入数据;cout对象负责标准输出,即向显示器输出数据。cerr对象和clog对象负责标准错误输出,其中cerr对象无缓冲区而clog对象则有。用于流提取的运算符是,用于流插入的运算符是,它们均从移位运算符重载而来。c++程序设计简明教程9.2输出流ostream类提供了数据流输出的功能,其流对象是流的目的地。在程序里可以将数据不断地插入流中,送至这些ostream流对象。输出时使用的ostream流对象通常是cout,有3种基本操作方式。第1种是用流插入运算符,输出基本类型的数据;第2种是用成员函数put,输出一个字符;第3种是用成员函数write,输出一个字符串。c++程序设计简明教程9.2.1流插入运算符一般形式cout表达式1……表达式n;例如:ntx=1,y=2;floatz=3.4;charc=’a’;coutx”,”y”,”z”,”cendl;coutx+y(xy)endl;c++程序设计简明教程9.2.2put函数原型ostream&put(charc);例如:charc=’a’;cout.put(c);//输出c的值即字母acout.put(c).put(‘b’).put(‘Q’);c++程序设计简明教程9.2.3write函数原型ostream&write(constchar*s,intn);例如:char*p=”C++”,a[20]=”language”;cout.write(p,3);cout.write(a,strlen(a));//输出数组a中的字符串coutendl;cout.write(p.strlen(p)).write(a,strlen(a));coutendl;c++程序设计简明教程9.3输入流istream类提供了数据流输入的功能,在程序里可以不断地从流对象中提取数据,存入相应的变量中。输入时使用的istream流对象通常是cin,有4种基本操作方式。第1种是用流提取运算符,读入基本类型的数据;第2种是用成员函数get,读入一个字符或者字符串;第3种是用成员函数getline,读入一个字符串;第4种是用成员函数read,读入一串指定数量的字符。c++程序设计简明教程9.3.1流提取运算符一般形式cin变量1变量2……变量n;说明:使用流提取运算符输入多个数据时,应该用空格符或者回车符进行分隔。默认情况下,系统会自动跳过输入流中的空格符、tab符以及回车符等空白字符c++程序设计简明教程9.3.2get函数原型intget(void);istream&get(char&c);istream&get(char*s,intn,charch=’\n’);例如:charc1,c2,a[80];c1=cin.get();cin.get(c2);cin.get(a,21,’#’);c++程序设计简明教程9.3.3getline函数原型istream&getline(char*s,intn,charch=’\n’);例如:chara[80];cin.getline(a,21,’#’)c++程序设计简明教程函数原型说明intgcount(void)const统计最近一次实际读取的字符个数istream&ignore(intn=1,intd=EOF)跳过并丢弃n个字符,直到遇见d中的字符为止istream&putback(charch)将指定字符插入到输入流的当前位置intpeek(void)读取输入流中当前字符Istream类的读取控制成员函数c++程序设计简明教程9.3.4read函数原型istream&read(char*s,intn);说明:read函数的功能是从输入流中顺序读取n个字符,并存入到s所指向的字符数组中。它与get函数、getline函数的区别是,不在读取的这些字符的尾部添加一个空字符(’\0’)。c++程序设计简明教程9.4格式控制在实践应用中经常需要对输入输出的格式进行控制,例如设置域宽和精度、设置或者清除格式状态标志、设置填充字符、设置数据对齐方式,以及在输出流中插入空字符或者换行符等等。C++提供了两种用于格式控制的方法,一种是调用ios类的格式控制成员函数,另一种是使用流操纵符。c++程序设计简明教程函数原型说明intwidth(void)读取当前设置的域宽intwidth(intn)设置当前域宽为n,并返回原先设置的域宽intprecision(void)读取当前设置的浮点数精度intprecision(intn)设置当前浮点数的精度为n,并返回原先设置的浮点数精度charfill(void)读取当前设置的填充字符charfill(charch)设置当前填充字符为ch,并返回原先设置的填充字符longflags(void)读取当前设置的格式状态标志longflags(longf)设置当前格式状态标志为f,并返回原先设置的格式状态标志longsetf(longf)设置当前格式状态标志为f,并返回原先设置的格式状态标志longunsetf(longf)清除格式状态标志f,并返回原先设置的格式状态标志格式控制成员函数c++程序设计简明教程案例intmain(){inti;for(i=1;i=4;i++){cout.width(4-i);cout.fill('');if(cout.width()!=0)cout;cout.width(2*i-1);cout.fill('*');cout*endl;}return(0);}c++程序设计简明教程格式状态标志ios::adjustfield标志组ios::left输出时左对齐ios::right输出时右对齐ios::internal符号和基数标志左对齐,数值右对齐,中间用字符填充c++程序设计简明教程ios::basefield标志组ios::dec以十进制为基数输出ios::oct以八进制为基数输出ios::hex以十六进制为基数输出c++程序设计简明教程ios::floatfield标志组ios::fixed以定点形式输出浮点数ios::scientific以指数形式输出浮点数c++程序设计简明教程其他标志ios::skipws输入时跳过空白符ios::showbase输出时带有基数标志,八进制数有前导0,十六进制数有前导0xios::showpoint输出浮点数时带有小数点ios::showpos输出十进制正数时有前导+ios::uppercase将十六进制数和以指数形式表示的数中的字母转换为大写形式ios::boolalpha以文本的形式输出布尔数据(true、false)c++程序设计简明教程成员函数flags在调用flags函数时,一般还用赋值语句保存函数的返回值,在适当的时机再次调用flags函数,恢复原先的格式状态。longoldf;oldf=cout.flags(ios::left|ios::hex);/*设置输出左对齐和以十六进制为基数的标志*/……cout.flags(oldf);//恢复原先的状态设置c++程序设计简明教程selft函数setf函数和unsetf函数通常配合使用,用来完成格式状态标志的设置和清除。cout.setf(ios::left);//设置输出左对齐标志……cout.unsetf(ios::left);//清除左对齐标志c++程序设计简明教程操作符操纵符(manipulator)又称为流操作算子,是一种特殊的函数。由于操纵符返回流对象的引用,因此可以连续地使用,并直接插入到流中,较为方便地控制流中数据的输入输出格式。c++程序设计简明教程例9.5操作符应用之一。#includeiostream.h#includeiomanip.hintmain(){inti;for(i=1;i=4;i++){coutsetw(4-i)setfill('');if(cout.width()!=0)cout;coutsetw(2*i-1)setfill('*')*endl;}return(0);}c++程序设计简明教程自定义操作符ostream&pxy(ostream&out){out.flags(ios::left);outsetw(3);return(out);}coutx=pxyp.xy=pxyp.y;c++程序设计简明教程9.5文件的输入输出C++提供文件流类来处理文件的输入输出,分别是ifstream类、ofstream类和fstream类。文件流对象控制输入输出的方式,与cin对象和cout对象非常相似,而且已经学过的输入输出成员函数、格式控制成员函数以及操纵符,基本上都可以适用于文件流对象。c++程序设计简明教程9.5.1文件打开与关闭对文件能够进行哪些操作,这主要取决于两个因素。第一个因素是文件所关联的文件流对象,ofstream流对象能够进行文件输出操作(即写操作),ifstream流对象能够进行文件输入操作(即读操作),fstream流对象既能够进行文件输出操作,也能够进行文件输入操作。c++程序设计简明教程打开方式说明ios::in以读方式打开文件ios::out以写方式打开文件ios::app在文件尾部追加写入ios::ate打开一个已存在的文件,并将位置指针置于该文件的结尾ios::nocreate打开一个已存在的文件,若该文件不存在,则打开失败ios::noreplace打开文件时若该文件已存在,而且未设置app或者ate,则打开失败ios::binary以二进制方式打开文件ios::trunc打开文件时若已存在,清空原有内容;若文件不存在,则创建新文件C++文件的打开方式c++程序设计简明教程文件打开(1)C++文件打开的方法有两种,第一种是在创建文件流对象的同时,立即打开相关联的文件。具体实现过程就是向文件流对象的构造函数,传送文件名和打开方式等参数。istreamfile1(“a.txt”,ios::in);ostreamfile2(“b.txt”,ios::out|ios::binary);c++程序设计简明教程文件打开(2)第二种方法是先创建文件流对象,再调用成员函数open,并传给它文件名和打开方式等参数,打开相关联的文件。istreamfile1;file1.open(“a.txt”,ios::in);ostreamfile2;file2.open(“b.txt”,ios::out|ios::binary);c++程序设计简明教程文件打开测试istreamfile1;file1.open(“a.txt”,ios::in);if(!