1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,C+,语言的输入,/,输出操作,1,I/O,流类库概述,2,标准文件的输入,/,输出操作,3,格式输出操作,4,磁盘文件的操作,10.1,I/O流类库概述,10.1.1,输入/输出流,数据的传送被看成像流水一样,从一处流向另一处,数据的传递被称为数据流。,数据流中流动的字节序列。,数据流按其流向可分为,:,输入流 指的是字节流从输入设备流向内存。,输出流 指的是字节流从内存流向输出设备,。,输入流和输出流都是带有内存缓冲区的,用来存放流中的数据。流是与内存缓冲区相对应的。,10.1.1,输入/输出流,数据流分类:,对系
2、统指定的标准设备的输入和输出。,以外存磁盘文件为对象进行输入和输出。,对内存中指定的空间进行输入和输出。,重要的输入流类:,istreamifstream,istrstream,重要的输出流类:,ostream,ofstream,ostrstream,1,通用,I/O,流类库,使用这些功能时应包含头文件,iostream,。,10.1.2,I/O流类库的主要功能,ios,istream,ostream,iostream,提供流状态设置功能,提供从输入流提取数据的操作,2,文件,I/O,流类库,使用有关文件读写操作时,应包含,fstream,文件。,ios,istream,ostream,ios
3、tream,fstreambase,ifstream,ofstream,fstream,C+,的,I/O,对,C,的发展,类型安全和可扩展性,在,C,语言中,用,printf,和,scanf,进行输入输出,往往不能保证所输入输出的数据是可靠的、安全的。,在,C+,的输入输出中,编译系统对数据类型进行严格的检查,凡是类型不正确的数据都不可能通过编译。因此,C+,的,I/O,操作是类型安全的。,C+,的,I/O,操作是可扩展的,不仅可以用来输入输出标准类型的数据,也可以用于用户自定义类型的数据。,10.2,标准的输入/输出操作,在,iostream,头文件定义了,4,种流对象,cin,是,istr
4、eam,类的对象,用来处理标准输入,即键盘输入。,cout,是,ostream,类的对象,用来处理标准输出,即屏幕输出。,Cerr,是,ostream,类的对象,用来处理标准错误信息,,没有缓冲,发送给它的内容立即被输出。,clog,是,ostream,类的对象,用来处理输出信息,它提供打印机输出。,1,使用预定义的插入符,这是一种最简单的,也是最常用的方式。,格式如下:,cout,表达式,10.2.1,标准(屏幕)输出操作,“,”,在,iostream,头文件中对它们进行了重载。如,ostream operator (int);,ostream operator (float);,ostre
5、am operator (char);,ostream operator (char*);,例分析下列程序的输出结果。,程序内容如下:,#include,#include,using namespace std;,void main(),coutThis is a string.endl;,coutstrlen(This is a string.)endl;,把一个字符写到输出流中。,如,:cout.put(a);,参数可以是字符或,ASCII,码,cout.put(65+32),;,连续调用,put,函数,cout.put(71).put(79).pu(79).put(68).put(n);
6、2,使用成员函数,put(),输出一个字符,GOOD,例分析下列程序的输出结果。,程序内容如下:,#include,using namespace std;,void main(),coutHELLOendl;,cout.put(H).put(E).put(L).put(L).put(O).put(n);,char c1=A,c2=B;,int a=65;,cout.put(c1).put(c2)endl;,cout.put(char(a).put(char(66)endl;,格式如下:,cout.write(const char*str,int n,),3,使用成员函数,write(),输
7、出一个字符串,#include,#include,using namespace std;,void print(char*s),cout.write(s,strlen(s).put(n);,cout.write(s,6)endl;,void main(),char*str=I love China.;,coutThe string is str,变量名,从键盘上输入数据是带缓冲区的,输入完数据按回车键时才形成输入流。,输入流中数据项的默认分隔符为,空格、,tab,键、换行符等,空白符。,例分析下列程序的输出结果。,程序内容如下:,#include,using namespace std;,v
8、oid main(),int i,j;,coutij;,couti,jendl;,例使用提取符从键盘上获取整数,判断该数是大于,0,、小于,0,还是等于,0,,当输入非整数时退出程序。,程序内容如下:,#include,using namespace std;,void main(),int n;,coutn),if(n0),cout0n;,else if(n0),coutn0n;,else,coutn=0n;,coutno integer!n;,格式如下:,char istream:get(),2,使用成员函数,get(),获取一个字符,#include,using namespace st
9、d;,void main(),char ch;,coutEnter charactors:;,while(ch=cin.get()!=EOF),cout.put(ch);,格式如下:,cin.getline(char*buf,int n,char deline=n),3,使用成员函数,getline(),读取一行字符,例分析下列程序的输出结果,该程序中使用了,getline(),函数。,程序内容如下:,#include,using namespace std;,void main(),char buf80;,int lcnt(-1),lmax(-1);,coutlmax),lmax=count
10、coutLine#lcnt:countendl;,cout.write(buf,count).put(n).put(n);,coutLargest line:lmaxendl;,coutTotal line:lcntendl;,格式如下:,cin.read(char*buf,int n),4,使用成员函数,read(),读取若干字符,#include,using namespace std;,void main(),char buf80=;,coutEnter,:n;,cin.read(buf,80);,coutbufendl;,10.3,格式化输出,使用流对象的成员函数,使用控制符的方法
11、1,控制输入,/,输出格式的标志位,用来控制输入,/,输出格式的标志位如表,标 志 位,值,含 义,输入,/,输出,skipws,0 x0001,跳过输入中的空白符,I,left,0 x0002,输出数据按输出域左对齐,O,right,0 x0004,输出数据按输出域右对齐,O,internal,0 x0008,数据的符号左对齐,数据本身右对齐,符号和数据之间为填充符,O,10.3.1,使用流对象的成员函数进行格式输出,表,10.1ios,标志位,标 志 位,值,含 义,输入,/,输出,dec,0 x0010,转换基数为十进制形式,O,oct,0 x0020,转换基数为八进制形式,I/O,h
12、ex,0 x0040,转换基数为十六进制形式,I/O,showbase,0 x0080,输出的数值数据前面带有基数符号(,0,或,0 x,),I/O,showpoint,0 x0100,浮点数输出带有小数点,O,uppercase,0 x0200,用大写字母输出十六进制数值,O,showpos,0 x0400,正数前面带有,“,+,”,符号,O,scientific,0 x0800,浮点数输出采用科学表示法,O,fixed,0 x1000,使用定点数形式表示浮点数,O,unitbuf,0 x2000,完成输出操作后立即刷新流的缓冲区,O,stdio,0 x4000,完成输出操作后刷新系统的,s
13、tdout.stderr,O,一些用来控制输出格式的成员函数:,(,1,)设置标志字的成员函数,long flags(),该函数返回当前标志字。,long flag(long),该函数使用参数更新标志字,并返回更新前的标志字。,long setf(long setbits,long field),该函数用来将,field,参数所指定的标志位清零,将,setbits,所指的标志位置,1,,并返回设置前的标志字。,2,控制输出格式的成员函数,long setf(long),该函数用来设置参数的指定的那些标志位,并返回更新前的标志字。,long unsetf(long),该函数用来清除参数所指定的那
14、些标志位,并返回更新前的标志字。,(,2,)设置输出数据所占宽度的成员函数,int width(),该函数用来返回当前输出的数据宽度。,int width(int),该函数用来用其参数设置当前输出的数据宽度,并返回更新前的宽度值。,(,3,)设置填充符的成员函数,char fill(),该函数用来返回当前所用的填充符。,char fill(char),该函数用来设置当前的填充符为参数给定的字符,并返回更新前的填充符。,(,4,)设置浮点数输出精度的成员函数,int precision(),该函数用来返回当前浮点数的有效数字的个数。浮点数的精度是用有效数字个数来表示的,其个数越大,表示精度越高。
15、int precision(int),该函数用来设置当前浮点数输出时有效数字个数为该函数所指定的参数值,并返回更新前的值。,下面给出在默认情况下的某些参数的值:,数据输出宽度默认情况下为实际宽度;,默认情况下填空符为空格符;,单精度浮点数最多提供,7,位有效数字,双精度浮点数最多提供,15,位有效数字,长双精度浮点数最多提供,19,位有效数字。,例分析下列程序的输出结果。程序内容如下:,#include,using namespace std;,void main(),coutDEC:85endl;,cout.setf(ios:hex,ios:basefield);,coutHEX:85en
16、dl;,cout.setf(ios:showbase);,coutHEX:85endl;,cout.setf(ios:oct,ios:basefield);,coutOCT:85endl;,cout.setf(ios:dec,ios:basefield);,coutDEC:85endl;,#include,using namespace std;,void main(),cout12345678901234567890endl;,int i=12345;,coutiendl;,cout.width(10);,coutiendl;,cout.width(10);,cout.fill(*);,co
17、ut.setf(ios:left,ios:adjustfield);,coutiendl;,cout.setf(ios:right,ios:adjustfield);,cout.precision(6);,double d=123.456789;,coutdendl;,cout.setf(ios:scientific,ios:floatfield);,coutdendl;,coutwidth:cout.width()endl;,使用控制符时需包含,iomanip,头文件。,控制符可以直接插入到输出流中。,10.3.2,使用控制符进行格式输出,表,10.2,流类库所定义的操作子,操作子名,含 义
18、输入,/,输出,dec,数值数据采用十进制表示,I/O,hex,数值数据采用十六进制表示,I/O,oct,数值数据采用八进制表示,I/O,setbase(int n),设置数制转换基数为,n,(,n,为,0,,,8,,,10,,,16,),0,表示使用默认基数,I/O,ws,提取空白符,I,ends,插入空字符,O,flush,刷新与流相关联的缓冲区,O,resetiosflags(long),清除参数所指定的标志位,I/O,setiosflags(long),设置参数所指定的标志位,I/O,setfill(int),设置填充字符,O,setprecision(int),设置浮点数输出的有效
19、数字个数,O,setw(int),设置输出数据项的域宽,O,#include,#include,using namespace std;,void main(),cout12345678901234567890endl;,int i=12345;,coutiendl;,coutsetw(10)iendl;,coutresetiosflags(ios:right)setiosflags(ios:left),setfill(*)setw(10)iendl;,double d=123.456789;,coutsetfill()setprecision(6)setw(10)dendl;,cout.se
20、tf(ios:scientific,ios:floatfield);,coutdendl;,coutwidth:cout.width()endl;,10.4,磁盘文件的操作,10.4.1,打开文件和关闭文件操作,1,打开文件操作,打开文件通常分为两步:,先创建流对象,再使用成员函数,open(),打开指定的文件。,创建流对象又可分两种情况,一种情况是创建,fstream,类的对象,另一种情况是创建,ifstream,类或,ofstream,类的对象。,(,1,)通过创建,fstream,类对象打开文件的方法,方法一:先创建对象,再打开文件,格式如下:,fstream;,.open(,,,),;
21、表,10.3,文件访问方式常量,方 式 名,用 途,in,以输入(读)方式打开文件,out,以输出(写)方式打开文件,app,以输出追加方式打开,ate,文件打开时,文件指针位于文件尾,trunc,如果文件存在,将其长度截断为,0,,并清除原有内容;如果文件不存在,则创建新文件,binary,以二进制方式打开文件,默认时为文本方式,nocreate,打开一个已有文件,如该文件不存在,则打开失败,noreplace,如果文件存在,除非设置,ios:ate,或,ios:app,,否则打开操作失败,ios:inlios:out,以读和写的方式打开文件,ios:outlios:binary,以二进制
22、写方式打开文件,ios:inlios:binary,以二进制读方式打开文件,方法二:创建对象和打开文件合二为一,其格式如下:,fstream (,);,与前面方法相比较,省略了打开函数的名字,open,。,(,2,)通过创建,ifstream,类对象或,ofstream,类对象打开文件的方法,方法一:先创建对象,再打开文件,格式如下:,ofstream;,.open();,或者,ifstream;,.open();,方法二:创建对象同时打开文件,格式如下:,ofstream ();,或者,ifstream ();,格式如下:,.close();,2,关闭文件,10.4.2,文件的输入/输出操作
23、1,文本文件的读写操作,先打开文件,打开文件时应先创建流对象,打开文件时应指出文件名和访问方式,;,文件打开后才可以进行读写操作,;,操作完毕后还要关闭文件。,例 编程将一些字符信息写入到指定的文件中。,#include,#include,using namespace std;,void main(),fstream out;,out.open(f1.txt,ios:out);,if(!out),cerrf1.txt cant open.n;,abort();,outthis is a string.n;,outthis is a program.n;,outok!n;,out.close
24、);,例编程从一个文本文件中读出的存放的信息。,#include,#include,using namespace std;,void main(),fstream in;,in.open(f1.txt,ios:in);,if(!in),cerrf1.txt cant open.n;,abort();,char s80;,while(!in.eof(),in.getline(s,sizeof(s);,coutsendl;,in.close();,例编程将一个文件的内容复制到另一个文件中。,#include,#include,using namespace std;,void main(),f
25、stream infile,outfile;,infile.open(f2.txt,ios:in);,if(!infile),cerrf2.txt cant open.n;,abort();,outfile.open(f3.txt,ios:out);,if(!outfile),cerrf3.txt cant open.n;,abort();,char ch;,while(infile.get(ch),outfile.put(ch);,infile.close();outfile.close();,二进制文件的读写操作与文本文件的读写操作基本相同,;,区别在于,二进制文件来说打开时需要加上,io
26、s:binary,方式。,用于二进制文件读写函数通常使用,read(),函数和,write(),函数。,2,二进制文件的读写操作,例分析下列程序的输出结果,熟悉二进制文件的使用方法。,#include,#include,using namespace std;,struct person,char name20;,double height;,unsigned short age;,;,person people5=Li,1.88,35,Hu,1.91,25,Gao,1.75,33,Mao,1.72,32,Lu,1.69,50;,void main(),fstream file;,file.o
27、pen(f5.dat,ios:in|ios:out|ios:binary);,if(!file),cerrf5.dat cant open.n;,abort();,for(int i(0);i5;i+),file.write(char*),file.seekp(0,ios:beg);,for(i=0;i5;i+),file.read(char*),coutpeoplei.nametpeoplei.heighttpeoplei.ageendl;,file.close();,10.4.3,随机文件操作,文件读取方式:,顺序读取,随机读取,打开、关闭文件,读写数据,定位读、写指针,10.4.3,随机
28、文件操作,定位读、写指针的函数:,在类,istream,中定义的定位读指针的成员函数有如下几种:,istream&istream:seekg(),;,istream&istream:seekg,(,),;,long int&istream:tellg(),;,在类,ostream,中定义的定位写指针的成员函数有如下几种:,ostream&ostream:seekp(),;,ostream&ostream:seekp,(,),;,long int ostream:tellp(),;,具有下述含义:,cur=1 /,相对于当前读,/,写指针所指的位置,beg=0 /,相对于文件头的位置,end=2
29、 /,相对于文件尾的位置,#include,#include,using namespace std;,void main(),fstream file(f6.dat,ios:in|ios:out|ios:binary);,for(int i(1);i=10;i+),file.write(char*),long int pos=file.tellp();,coutposendl;,for(i=11;i=20;i+),file.write(char*),file.seekg(pos);,file.read(char*),coutThe data stored is iendl;,file.seekp(-4,ios:end);,file.read(char*),coutThe data stored is iendl;,coutfile.tellp()endl;,file.close();,






