【文档说明】C--与面向对象的程序设计---程序员联合开发网课件.ppt,共(58)页,250.001 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44825.html
以下为本文档部分文字说明:
流类库与输入/输出本讲主要内容I/O流的概念输出流输入流为什么要有C++流类库C语言的输入输出系统不支持拥护自定义的对象或数据类型,如一定义:structsample{inti;floatf;char*ch;}s1;不能
用输出函数来输出以上结构变量:printf(“%sample”,s1);I/O流的概念为什么要有C++流类库C++中,用户自定义的对象很多。C++的类机制允许它可以建立一个可控制的输入输出系统。可以通过重载“<<”和“>>”算符来解决以上的问题。I/O流的概念流类库和流流在数据从一个对
象流动到另一个对象的过程中,无论是否对数据进行缓冲或对数据进行格式变换,这种流动都被抽象为流.每个流都和一种与设备相联系。与输入设备(如键盘)联系的流为输入流;与输出设备(如屏幕)联系的流为输出流。C++中预定义了标准输入流cin、标准输出流co
ut、非缓冲的出错流cerr和缓冲的出错流clog。I/O流的概念流类库和流在缺省情况下,标准输出设备是显示终端,标准输入设备是键盘。在任何情况下,标准错误输出设备总是显示终端。标准输出设备可以不是显示终端;但错误信息总是在显示屏幕上显示。流
在使用前要被建立,在使用后要被删除,使用特定的操作能够从流中获取数据(称为提取操作),或向流中添加数据(称为插入操作).I/O流的概念输出流输出流对象是信息流动的目标.ostream,ofstream和ostrstream是三个最重要的输出流.ostream类通过派生类ostr
eam_withassign支持预先定义的流对象cout标准输出cerr标准错误输出,没有缓冲,发给它的内容立即输出clog类似于cerr,但有缓冲,缓冲区满时被输出.ofstream类支持磁盘文件输出.ostrstream类支持
输出字符串。文件在磁盘上保存的信息是按文件的形式组织的,每个文件都对应一个文件名,并且属于某个物理盘或逻辑盘的目录层次结构中一个确定的目录之下。一个文件名由文件主名和扩展名两部分组成,它们之间用圆点(即小数点)分开,扩
展名可以省略,当省略时也要省略掉前面的圆点。文件主名是由用户命名的一个有效的C++标识符,为了同其他软件系统兼容,一般让文件主名为不超过8个有效字符的标识符,同时为了便于记忆和使用,最好使文件主名的含义与所存的文件内容相一致。输出流文件扩展名也是由用户命名的、1至3个字符组成
的、有效的C++标识符,通常用它来区分文件的类型。如在C++系统中,用扩展名h表示头文件,用扩展名cpp表示程序文件,用obj表示程序文件被编译后生成的目标文件,用exe表示连接整个程序中所有目标文件后生成的可执行文件。对于用户建立的用于保存数
据的文件,通常用dat表示扩展名,若它是由字符构成的文本文件则也用txt作为扩展名,若它是由字节构成的、能够进行随机存取的内部格式文件则可用ran表示扩展名。在C++程序中使用的保存数据的文件按存储格式分为两种类型,一种为字符格
式文件,简称字符文件,另一种为内部格式文件,简称字节文件。字符文件又称ASCII码文件或文本文件,字节文件又称二进制文件。在字符文件中,每个字节单元的内容为字符的ASCII码,被读出后能够直接送到显示器或打印机上显示或打印出对应的字符,供人们直接阅读。在字节文件中,
文件内容是数据的内部表示,是从内存中直接复制过来的。当然对于字符信息,数据的内部表示就是ASCII码表示,所以在字符文件和在字节文件中保存的字符信息没有差别,但对于数值信息,数据的内部表示和ASCII码表示截然不同,所以在字符文件和在字节文件中保存的数值信息也截然不同
。要在程序中使用文件时,首先要在开始包含#include<fstream.h>命令。由它提供的输入文件流类ifstream、输出文件流类ofstream和输入输出文件流类fstream定义用户所需要的文件流对象,然后利用该对象调用相应类中的open成
员函数,按照一定的打开方式打开一个文件。文件被打开后,就可以通过流对象访问它了,访问结束后再通过流对象关闭它。文件在C++中,要进行文件的输入输出操作,应该:先创建一个流对象,如构造一个ofstream类的对象,以便进行文件的输出打开文件,
就是将这个流对象和具体的文件相关联进行文件的读写操作关闭文件输出流构造输出流对象和打开文件如果输出到标准输出设备,即使用预先定义的cout、cerr、clog对象,则不需要构造流对象。要将信息输出到文件,就要构造和建立流对象。可以先构造
对象,再打开文件;也可以在构造对象时,同时打开文件。输出流构造输出流对象和打开文件使用缺省构造函数,再调用ofstream类的open成员函数.打开文件时要指定和对象关联文件的文件名,文件的打开方式(
iosmode):ofstream对象名;对象名.open(“文件名”,iosmode);如:ofstreamoutfile;outfile.open(“data.dat”,ios::binary);输出流构造输出流对象和打开文件也可
使用指针,即指向输出文件流对象的指针,通过指针调用open函数:ofstream*pmyFile=newofstream;pmyFile->open(“filename”,iosmode);输出流构造输出流对象和打开文件也可以
一次操作就完成构造输出流对象和打开文件。即只调用构造函数,而不使用open函数。在调用构造函数时指定文件名和模式ofstream对象名(“文件名”,iosmode);如:ofstreamoutfile(“data.dat”,ios;;binary);(常用方式)
输出流使用插入运算符和控制格式插入运算符<<是预先设计的,用来将数据输出到一个流对象。插入运算符与预先定义的操纵符一起工作,用来控制输出格式通过已定义的操纵符可以控制输出宽度、输出格式、输出精度等。输出流控
制输出宽度可使用setw操纵符或width成员函数来控制每个输出项的输出宽度:#include<iostream.h>voidmain(){doublevalues[]={1.23,35,36,653.7,4358.24};for(inti=
0;i<4;i++){cout.width(10);cout<<values[I]<<'\n';}}输出流控制输出宽度用setw操纵符来控制输出宽度:#include<iostream.h>#incl
ude<iomanip.h>voidmain(){doublevalues[]={1.23,35,36,653.7,4358.24};char*name[]={“Jan”,“Ani”,“Pa”,“Yekan”};for(int
i=0;i<4;i++)cout<<setw(6)<<name[i]<<setw(10)<<values[i]<<'\n';}可以对数据项指定不同的输出宽度。必须调用iomanip.h头文件。输出流控制输出格式用setios
flags操纵符来设置输出格式,输出结束后,再用resetiosflags操纵符取消设置的格式,恢复缺省的格式。具体的格式由格式标志值指定可以设置的格式包括:对齐方式,数据的数制(十进、八进、十六进制)、浮点数显示格式等。格式标志值可以用OR
运算(|)进行组合。输出流ios::skipwsSkipwhitespaceoninput.ios::leftLeft-alignvalues;padontherightwiththefillchara
cter.ios::rightRight-alignvalues;padontheleftwiththefillcharacter(defaultalignment).ios::internalAddfillcharactersafteranyleading
signorbaseindication,butbeforethevalue.ios::decFormatnumericvaluesasbase10(decimal)(defaultradix).ios::octFormatnu
mericvaluesasbase8(octal).ios::hexFormatnumericvaluesasbase16(hexadecimal).ios::showbaseDisplaynumericcons
tantsinaformatthatcanbereadbytheC++compiler.ios::showpointShowdecimalpointandtrailingzerosforfloating-pointvalues.ios::uppercas
eDisplayuppercaseAthroughFforhexadecimalvaluesandEforscientificvalues.ios::showposShowplussigns(+)forpositiveva
lues.ios::scientificDisplayfloating-pointnumbersinscientificformat.ios::fixedDisplayfloating-pointnumbersinfixedformat
.ios::unitbufCauseostream::osfxtoflushthestreamaftereachinsertion.Bydefault,cerrisunitbuffered.ios::stdioCauseostream::osfxtoflushstdoutandstde
rraftereachinsertion.例设置对齐方式#include<iostream.h>#include<iomanip.h>voidmain(){doublevalues[]={1.23,35.36,653.7,4
358.24};char*names[]={"Zoot","Jimmy","Al","Stan"};for(inti=0;i<4;i++)cout<<setiosflags(ios::left)//左对齐<<setw(6)<<na
mes[i]<<resetiosflags(ios::left)//恢复默认<<setw(10)<<values[I]<<endl;}控制输出精度控制输出精度:用setprecision操纵符#include<iostre
am.h>#include<iomanip.h>voidmain(){doublevalues[]={1.23,35.36,653.7,4358.24};char*names[]={"Zoot","Jimmy","Al","Stan"
};for(inti=0;i<4;i++)cout<<setiosflags(ios::left)<<setw(6)<<names[i]<<resetiosflags(ios::left)<<setw(10)<<setprecision(1)<<values[
I]<<endl;}输出流程序运行结果:Zoot1Jimmy4e+001Al7e+002Stan4e+003若改为setprecision(3),即3位有效数字,结果成为:Zoot1.23Jimmy35.4Al654Stan4.36e+003原数据为:1.23,35.36
,653.7,4358.24不必使用resetprecision,可直接修改精度。控制输出数制控制输出进制用dec,oct和hex操纵符#include<iostream.h>#include<iomanip.h>voidmain(){cout<<2
34<<setw(10)<<hex<<234<<endl<<234<<setw(10)<<oct<<234<<endl<<234<<setw(10)<<dec<<234<<endl;}输出流程序运行结果:234eaea352352234综合示例:ASCII码表#include<iostre
am.h>#include<iomanip.h>intmain(){inti,j=0;for(i=32;i<127;i++){cout<<setw(4)<<hex<<i<<'H'<<setw(2)<<char(i);j++;if(j%8==0)cout<<endl
;}return0;}程序运行结果:20H21H!22H"23H#24H$25H%26H&27H'28H(29H)2aH*2bH+2cH,2dH-2eH.2fH/30H031H132H233H334H435H536H6
37H738H839H93aH:3bH;3cH<3dH=3eH>3fH?40H@41HA42HB43HC44HD45HE46HF47HG48HH49HI4aHJ4bHK4cHL4dHM4eHN4fHO50HP51H
Q52HR53HS54HT55HU56HV57HW58HX59HY5aHZ5bH[5cH\5dH]5eH^5fH_60H`61Ha62Hb63Hc64Hd65He66Hf67Hg68Hh69Hi6aHj6bHk6cHl6dHm6eHn6fHo
70Hp71Hq72Hr73Hs74Ht75Hu76Hv77Hw78Hx79Hy7aHz7bH{7cH|7dH}7eH~输出文件流成员函数(一)输出流成员函数有三种类型1.与操纵符等价的成员函数2.执行非格式化写操作的成员函数3.其他修改流状态且不同于操纵符或插入运算符的成员函数输出
流Open函数输出流的open函数若要用一个输出文件流,必须在构造函数或open函数中把该流与一个特定的磁盘文件关联起来.文件可以在构造流对象时打开,也可以用成员函数open来打开。用open函数打开文件时要指定文件名和打开方式。输出流Open函数文件打开方式:ios::app
:输出文件的追加方式ios::ate:到输入或输出文件的文件尾ios::in:打开输入文件ios::out:打开输出文件,隐含方式ios::nocreate:只打开已存在的文件ios::noreplace:如果文件已存在则操作失败ios::trunc:打开时替换已存在的同名文件ios
::binary:二进制模式打开文件输出流文件的读写文件打开后,直接用<<或>>读写,但要用与文件关联的流对象作为目标:#include<fstream.h>intmain(){ofstreamfout(“data.dat
”);if(!fout){cout<<“Can’topenfiletest.txt\n”;return1}fout<<10<<““<<123.456<<“\”Thisisafile.\”\n”;fout.close(
);return0}输出文件流成员函数(二)输出流的open函数若要用一个输出文件流,必须在构造函数或open函数中把该流与一个特定的磁盘文件关联起来.输出流的put函数把一个字符写到输出流中输出流的write函数把内存中的一块内容写到
一个输出文件流中,长度参数指出写的字节数.输出流例输出二进制文件#include<fstream.h>structDate{intmo,da,yr;};//不要忘掉‘;’voidmain(){Datedt={6,10,92};ofstreamtfile(“date.dat”
,ios::binary);//打开二进制文件tfile.write((char*)&dt,sizeofdt);}程序运行结果:文件date.dat的内容是:060000000A000000-5C000000正好是十进制数6、10、92的二进制表示,每个数4个字
节。如果以文本方式打开,程序运行结果:文件date.dat的内容是:060000000D0A0000-005C000000十进制数10前面增加了一个0D,即换行符的ASCII码,其余不变。可见并不能直接按文本方式输出。而且使10的输
出(认为是ASCII码0A)变为回车换行符。输出文件流成员函数(三)输出流的seekp和tellp函数一个输出文件流保存一个内部指针指出下一次写数据的位置.seekp设置这个指针.tellp返回该文件位置.输出流的close函数close关闭与一个输出文件流关联的磁盘文件.输出流
的错误处理函数bad,fail,good,eof,clear,rdstate.输出流二进制输出文件(一)流的缺省输出模式是文本模式.以文本模式输出时,遇到10便自动扩充为回车换行符.而使用二进制模式输出时,所写的字符是不转换的.使用二进制模式输出到文件的几种方法:1.
构造一个流,然后用setmode函数.ofstreamofs(“test.dat”);ofs.setmode(filebuf::binary);2.使用ofstream构造函数中的模式参量.3.使用二进制操作符代替setm
ode成员函数.ofs<<binary;输出流二进制输出文件(二)4.使用open函数带一个二进制模式标志打开文件.filedescfd=open(“test.dat”,OBINARY|OCREAT|OWRONLY);ofstreamofs(fd);o
fs.write((char*)iarray,4);//向二进制文件中写入4字节数据输出流输入流输入流对象是信息流出的源头.istream,ifstream和istrstream是三个最重要的输入流类.istream类通过派生类istream_withassign支持预先定义的
流对象cin.istream类用于顺序文本模式输入是最好的.ifstream类支持磁盘文件输入.基类ios和istream的所有功能都包括在ifstream中.构造输入流对象构造输入文件流的常用方法使用缺省构造函数,再调用open成员函数.ifstreammyFile
;myFile.open(“filename”,iosmode);ifstream*pmyFile=newifstream;pmyFile->open(“filename”,iosmode);在调用构造函数时指定文件名和模式ifstreammyFile(“filename”,io
smode);输入流提取运算符和输入流操纵符提取运算符(>>)是从一个输入流对象获取字节的最容易方法.>>用于格式化文本输入,提取数据时以空白符为分隔.成员函数getline可以读一个含有空格的文本块,并对其进行分析.前面介绍的输出错误处理函数,同样可应用于输入
流.实际上,只有dec,oct和hex等几个操纵符对输入流对象具有影响.输入流输入文件流成员函数(一)输入流成员函数用于从磁盘文件中输入.输入流的open函数若要用一个输入文件流,必须在构造函数或open函数中把该流与一个特定的磁盘文件关联
起来.输入流的get函数功能与“>>”相像.但get函数在读入数据时包括空白字符,而“>>”在缺省时拒绝接受.输入流#include<iostream.h>voidmain(){charch;while((ch=cin.ge
t())!=EOF)cout.put(ch);}运行时输入:abcxyz123则输出:abcxyz123注:先输入到一个缓冲区,再由get读入,put输出。输入文件流成员函数(二)输入流的getline函数允许从输入流中读取多个字符,可以指定输入终止字符,读取完成
后,从读取的内容中删除该终止字符.输入流的read函数从一个文件读字节到指定的存储器区域,所读字节数由长度参数确定.若没给长度参数,当遇到文件结束时读结束.输入流#include<iostream.h>voidmain(){charch;while((ch=cin.get()
)!=EOF)cout.put(ch);}运行时输入:abcxyz123则输出:abcxyz123注:先输入到一个缓冲区,再由get读入,put输出。例读入一串字符到line数组,以‘t‟终止#include<iostream.h>voidmai
n(){charline[100];cout<<“Typealineterminatedby„t‟”<<endl;cin.getline(line,100,‟t‟);cout<<line;}例从一个payroll文件读一个二进制记录到一个结构中#include<fstream.h
>#include<fcntl.h>#include<io.h>voidmain(){struct{doublesalary;charname[23];}employee;ifstreamis("payroll",ios::binary|ios::nocreate);if(is){is
.read((char*)&employee,sizeof(employee));cout<<employee.name<<''<<employee.salary<<endl;}else{cout<<"ERROR:Cannotopenfile'payroll'."<<endl;
}}输入文件流成员函数(三)输入流的seekg和tellg函数seekg用来设置指向文件中下一次将读数据的位置的内部指针.tellg返回当前文件位置.输入流的close函数close关闭与一个输入文件流关联的磁盘文件输入流例读一个文件并显示出其中空格的位置#in
clude<fstream.h>voidmain(){charch;ifstreamtfile("payroll",ios::binary|ios::nocreate);if(tfile){while(tfile.good()){streampo
shere=tfile.tellg();tfile.get(ch);if(ch==„‟)cout<<"\nPosition"<<here<<"isaspace";}}else{cout<<"ERROR:Cannotopenfile'payrol
l'"<<endl;}}文件payroll的内容:1234455556ios::goodPosition3isaspacePosition6isaspacePosition11isaspacePosition12isaspacePositi
on13isaspace.ios::goodintgood()const;ReturnValueReturnsanonzerovalueifallerrorbitsareclear.Notethatthegoodmemberfu
nctionisnotsimplytheinverseofthebadfunction.字符串流可以把流的概念连接到字符串(string)上。文件在C++看来是字节流或字符流,串当然更可以看作字符流。可以用输入输出操作来完成串流的操作。其他的流是与设备相关,而
串流是与内存相关,所以也称内存流。串流类包括ostrstream、istrstream、strstream。它们在<strstream.h>中说明。串流类对象可以保存字符,也可以保存整数、浮点数。串流类对象采用文本方式,如同文本文件一样。其构造函数常用下面几个
:istrstream::istrstream(constchar*str);istrstream::istrstream(constchar*str,int);ostrstream::ostrstream(char*,int,int=ios::out);对字符
串流的操作方法通常与对字符文件流的操作方法相同。以串流为信息源:charstr[36]=”Thisisabook.\n”;charch;istrstreaminput(str);input>>ch;//从输入设备(串)读入一个字符cout<<ch<<endl;//输出’T’例:将
整数和浮点数放入串中,并取出来。intinum1=93,inum2;doublefnum1=89.5,fnum2;char*str=newchar[30];ostrstreamoutput(str,30
);output<<”整数:”<<inum<<”符点数:”<<fnum1<<endl;output.close();cout<<strlen(str)<<endl;istrstreaminput(str,0);//第二参数为0
表示串以串结束符终结input>>inum2>>fnum2;cout<<”整数:”<<inum2<<”浮点数:”<<fnum2<<endl;//输出:整数:93浮点数:89。5delete[]str;