《第13章-C++输入输出流《C++程序设计基础教程》ppt课件.pptx》由会员分享,可在线阅读,更多相关《第13章-C++输入输出流《C++程序设计基础教程》ppt课件.pptx(58页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第13章 C+输入输出流C+程序设计基础教程课件2 22第第13章章C+输入输入/输出流输出流13.1 流的概念流的概念13.2 标标准准输输入入输输出流出流12.3 文件流文件流12.4 小小结结3 3313.1C+的输入和输出的输入和输出C+的输入与输出的输入与输出(1)对系系统指定的指定的标准设备标准设备的的输入和入和输出。即出。即标准准I/O。(2)以外存以外存磁盘文件磁盘文件为对象象进行行输入和入和输出,出,即文件即文件I/O。(3)对指定的指定的内存内存空空间进行行输入和入和输出。即串出。即串I/O。输入入时,字,字节流从流从输入入设备(如如键盘、磁、磁盘)流流向向内存内存;输出出
2、时,字,字节流从流从内存内存流向流向输出出设备(如屏幕、打印机、磁如屏幕、打印机、磁盘等等)。4 44I/O流的概念流的概念当程序与外界当程序与外界环境境进行信息交行信息交换时,存在着两个,存在着两个对象,一个是象,一个是程序中的程序中的对象象,另一个是,另一个是文件文件对象象。流是一种抽象,它流是一种抽象,它负责在数据的在数据的生生产者者和数据的和数据的消消费者者之之间建立建立联系,并管理数据的流系,并管理数据的流动。程序建立一个程序建立一个流流对象象,并指定,并指定这个流个流对象与某个象与某个文件文件对象建立象建立连接,程序操作流接,程序操作流对象,流象,流对象通象通过文件系文件系统对所所
3、连接的文件接的文件对象象产生作用。生作用。读操作操作在流数据抽象中被称在流数据抽象中被称为(从流中)(从流中)提取提取,写操作写操作被称被称为(向流中)(向流中)插入插入。5 55流类流类(stream class):C+的的I/O库中的中的类。流对象流对象:用流:用流类定定义的的对象。象。预先定义的流对象预先定义的流对象&cin:标准准输入。入。&cout:标准准输出出。&cerr:标准准错误输出,出,没有缓冲没有缓冲。&clog:类似于似于cerr,有缓冲有缓冲。13.1.3C+的输入输出流的输入输出流6 661.iostream类库中有关的类类库中有关的类7 771.iostream类库
4、中有关的类类库中有关的类8 8813.2标准输出流标准输出流标准输出流标准输出流:流向:流向标准准输出出设备的数据。的数据。1.cout(console output)流对象)流对象cout流开辟内存流开辟内存缓冲区,用来存放流数据,遇冲区,用来存放流数据,遇endl时,不不论缓冲区是否已冲区是否已满,立即,立即输出流中所有数据,然后插出流中所有数据,然后插入一个入一个换行符,行符,并刷新流并刷新流(清空清空缓冲区冲区)。2.cerr流对象流对象作用作用:向:向标准准错误设备输出有关出出有关出错信息。信息。3.clog流对象流对象作用作用:和:和cerr相同。相同。区别区别:cerr不不经过缓
5、冲区,直接向冲区,直接向显示器上示器上输出有关信出有关信息息,而,而clog的信息存放在的信息存放在缓冲区,冲区,缓冲区冲区满后或遇后或遇endl时输出。出。9 99例例13.1 一元二次方程一元二次方程ax2+bx+c=0#include using namespace std;int main()cout hello world-cout endl;cerr hello world-cerr filecout.txt test filecerr.txt 10101013.2.2格式输出格式输出1.使用控制符控制输出格式使用控制符控制输出格式输出数据的控制符出数据的控制符见书中表中表13.3
6、。注注:这些控制符是在些控制符是在头文件文件iomanip中定中定义的,因而程序中的,因而程序中应当包含当包含iomanip。111111例例13.3用流控制成员函数输出数据用流控制成员函数输出数据int main()int a=21 cout.setf(ios:showbase);/显示基数符号示基数符号(0 x或或0)coutdec:aendl;/默默认十十进制形式制形式 cout.unsetf(ios:dec);/终止十止十进制的格式制的格式设置置 cout.setf(ios:hex);/以十六以十六进制制输出的状出的状态 couthex:aendl;/以十六以十六进制形式制形式输出出a
7、 cout.unsetf(ios:hex);/终止十六止十六进制的格式制的格式设置置 cout.setf(ios:oct);/设置以八置以八进制制输出的状出的状态 coutoct:aendl;/以八以八进制形式制形式输出出a 121212 cout.unseft(ios:oct);char*pt=China;/pt指向字符串指向字符串China cout.width(10);/指定域指定域宽为10 coutptendl;/输出字符串出字符串 cout.width(10);/指定域指定域宽为10 cout.fill(*);/指定空白指定空白处以以*填充填充 coutptendl;/输出字符串出字
8、符串 double pi=22.0/7.0;/输出出pi值 cout.setf(ios:scientific);/指定用科学指定用科学记数法数法输出出 coutpi=;/输出出pi=例例13.3用流控制成员函数输出数据用流控制成员函数输出数据131313 cout.width(14);/指定域指定域宽为14 coutpiendl;/输出出pi值 cout.unsetf(ios:scientific);/终止科学止科学记数法状数法状态 cout.setf(ios:fixed);/指定用定点形式指定用定点形式输出出cout.width(12);/指定域指定域宽为12cout.setf(ios:sh
9、owpos);/正数正数输出出+号号cout.setf(ios:internal);/数符出数符出现在左在左侧cout.precision(6);/保留保留6位小数位小数coutpi提取数据提取数据时跳跳过空格空格、tab键键、换行符换行符等。等。注注:只有按回只有按回车键后,后,该行数据才被送入行数据才被送入键盘缓冲区,形成冲区,形成输入流。入流。151515(1)不带参数的不带参数的get函数函数形式形式:cin.get()作用作用:从:从输入流中提取一字符,函数返回入流中提取一字符,函数返回读入入字符。遇到文件字符。遇到文件结束符,返回束符,返回EOF。(2)带一个参数的带一个参数的ge
10、t函数函数形式形式:cin.get(ch)作用作用:从:从输入流中入流中读取一字符,取一字符,赋给变量量ch。成功成功则非非0(真真),失,失败(遇文件遇文件结束符束符)则0(假假)。1.用用get函数读入一个字符函数读入一个字符171717(3)有有3个参数的个参数的get函数函数调用形式调用形式cin.get(字符字符数组数组数组数组,字符个数,字符个数n,终止字符终止字符)或或cin.get(字符字符指针指针,字符个数,字符个数n,终止字符终止字符)作用作用:从:从输入流中入流中读取取n-1个字符,个字符,赋给指定字指定字符数符数组,若在,若在读取取n-1个字符前遇到个字符前遇到指定的指
11、定的终止止字符字符,则提前提前结束。成功返真,失束。成功返真,失败返假。返假。181818void main()char ch20;coutenter a sentence:endl;cin.get(ch,10,n);/指定指定换行符行符为终止字符止字符 coutchendl;enter a sentence:I study C+very hard.I study(3)有有3个参数的个参数的get函数函数1919192.用成员函数用成员函数getline函数读入一行字符函数读入一行字符作用作用:从:从输入流中入流中读取取一行一行字符。字符。用法用法:与:与带3个参数的个参数的get函数函数类似
12、。似。cin.getline(字符数组字符数组(或字符指针或字符指针),字符个,字符个数数n,终止标志字符终止标志字符)202020例例13.7用用getline函数读入一行字符函数读入一行字符int main()char ch20;coutenter sentence:ch;coutThe string read with cin is:chendl;cin.getline(ch,20,/);/读19个字符或遇个字符或遇/结束束 coutThe second part is:chendl;cin.getline(ch,20);/读19个字符或遇个字符或遇/n结束束 coutThe third
13、 part is:chendl;cin PK cin.getline()21212113.3.3istream类的其他成员函数类的其他成员函数1.eof 函数函数调用形式:调用形式:cin.eof();如果到达文件末尾如果到达文件末尾(遇文件遇文件结束符束符),函数,函数值为非非0(真真),否,否则为0(假假)。2.peek函数函数作用作用:观测下一个字符下一个字符。调用形式:调用形式:cin.peek();注意注意:只是:只是观测,指,指针位置不位置不变。222222peek和和putback函数函数3.putback函数函数调用形式调用形式:cin.putback(ch);作用作用:将前面
14、用:将前面用get或或getline从从输入流中入流中读取字取字符符ch返回到返回到输入流,插入到当前指入流,插入到当前指针位置。位置。4.ignore函数函数调用形式调用形式:cin,ignore(n,终止字符止字符)作用作用:跳:跳过输入流中入流中n个字符,或遇指定个字符,或遇指定终止符提止符提前前结束束(跳跳过包括包括终止符在内的若干字符止符在内的若干字符)。ighore(5,A)232323int main()char ch20;cin.get(ch,20,/);coutThe first part is:chendl;cin.ignore();/跳跳过输入流中一个字符入流中一个字符
15、cin.get(ch,20,/);coutThe second part is:chendl;return 0;I like C+./I study C+./I am happy.The first part is:I like C+.The second part is:I study C+.例例13.10用用ignore函数跳过输入流中的字符函数跳过输入流中的字符24242413.3文件流文件流13.4.1 文件的概念文件的概念文件文件:存:存储在外部介在外部介质上数据的集合。上数据的集合。属性属性:名字,:名字,类型、属主、型、属主、创建日期、修改日建日期、修改日期、期、访问权限等。限等
16、。分类分类1用户角度用户角度&程序文件程序文件(program file)&数据文件数据文件(data file)分类分类2数据的组织形式数据的组织形式&ASCII文件文件:文本文件、字符文件:文本文件、字符文件&二进制文件二进制文件:内部格式文件、字:内部格式文件、字节文件文件25252513.3.2文件流的操作文件流的操作文件流文件流:以外存文件:以外存文件为IO对象的数据流。象的数据流。&输出文件流输出文件流:从:从内存内存流向流向外存文件外存文件的数据的数据&输入文件流输入文件流:从:从外存文件外存文件流向流向内存内存的数据的数据&每个文件流都有一个每个文件流都有一个内存缓冲区内存缓冲
17、区对应。文件流与文件文件流与文件:文件流本身不是文件,而只是以文件:文件流本身不是文件,而只是以文件为输入入输出出对象的流。象的流。1)ifstream:istream派生派生类。支持从文件的支持从文件的输入。入。2)ofstream:ostream派生派生类。支持向文件的支持向文件的输出。出。3)fstream:iostream派生派生类。支持文件的支持文件的输入入输出。出。对磁磁盘文件的操作通文件的操作通过文件流对象文件流对象实现。262613.3.2文件流的操作文件流的操作在在C+中中对文件文件进行操作分行操作分为以下几个步以下几个步骤:(1)建立文件流建立文件流对象;象;(2)打开或建
18、立文件;打开或建立文件;(3)进行行读写操作;写操作;(4)关关闭文件;文件;前两步也可合并前两步也可合并为一步。一步。27272713.4.3文件的打开与关闭文件的打开与关闭1.打开磁盘文件打开磁盘文件在文件在文件读写之前做必要的准写之前做必要的准备工作。工作。(1)为文件流文件流对象和指定磁象和指定磁盘文件建立关文件建立关联。(2)指定文件的工作方式。指定文件的工作方式。(1)调用文件流的成员函数调用文件流的成员函数openofstream outfile;/定定义ofstream类对象象outfile.open(f1.dat,ios:out);(2)在定义文件流对象时指定参数在定义文件流
19、对象时指定参数oftream outfile(f1.dat,ios:out);282828若若open函数函数调用失用失败,返回,返回值为0(假假);若构造;若构造函数打开失函数打开失败,则流流对象的象的值为0。2.关闭磁盘文件关闭磁盘文件成成员函数函数close。outfile.close();关闭关闭:解除磁:解除磁盘文件与文件流的关文件与文件流的关联。13.4.3文件的打开与关闭文件的打开与关闭29292913.4.4对对ASCII文件的操作文件的操作ASCII文件的读写操作文件的读写操作(1)用用文件流对象文件流对象和和流插入运算符流插入运算符输出出输入入标准准类型型的数据。的数据。(
20、2)用文件流的用文件流的put,get,getline等成等成员函数函数进行行字符字符的的输入入输出。出。303030例例13.11从键盘输入从键盘输入10个整数到文件个整数到文件#include void main()int a10;ofstream outfile(f1.dat,ios:out);if(!outfile)/如失如失败,返回,返回0值cerropen error!endl;exit(1);coutenter 10 integer numbers:endl;for(int i=0;iai;outfileai;/向磁向磁盘文件文件输出数据出数据 outfile.close();/
21、关关闭文件文件 enter 10 integer numbers:1 3 5 2 4 6 10 8 7 9 313131例例13.12文件中读入文件中读入10个整数放在数组个整数放在数组#include int main()int a10,max,i,order;ifstream infile(f1.dat,ios:in);if(!infile)cerropen error!endl;exit(1);for(i=0;iai;/从文件从文件读入入10个整数,放在个整数,放在a数数组 coutai;max=a0;order=0;323232 for(i=1;imax)max=ai;/将当前最大将当
22、前最大值放在放在max中中 order=i;/将最大将最大值的序号放在的序号放在order中中 coutmax=maxendlorder=order;infile.close();return 0;1 3 5 2 4 6 10 8 7 9max=10order=6例例13.123333例例13.13写入文本文件的例子。写入文本文件的例子。#include void main()ofstream file(file.txt,ios:out|ios:ate);if(!file)cout不可以打开文件不可以打开文件endl;exit(1);filehello c+!n;char ch;while(c
23、in.get(ch)if(ch=n)break;file.put(ch);file.close();343434例例13.13void save_to_file()/将其中字母存入文件将其中字母存入文件f2.datofstream outfile(f2.dat);if(!outfile)cerropen f2.dat error!=65&ci=97&ci=122)outfile.put(ci);/将字母字符存入磁将字母字符存入磁盘文件文件f2.dat coutci;coutendl;outfile.close();353535从从f2.dat读入,小写改为大写存入读入,小写改为大写存入f3.d
24、atvoid get_from_file()char ch;ifstream infile(f2.dat,ios:in|ios:nocreate);if(!infile)cerropen f2.dat error!endl;exit(1);ofstream outfile(f3.dat);if(!outfile)cerropen f3.dat error!=97&ch=122)/判断判断ch是否是否为小写字母小写字母 ch=ch-32;outfile.put(ch);/将将该大写字母存入磁大写字母存入磁盘文件文件f3.dat coutch;infile.close();outfile.clos
25、e();38383813.4.5对二进制文件的操作对二进制文件的操作内存数据的映像文件内存数据的映像文件、字节文件字节文件。ios:binary:以二:以二进制形式制形式传送和存送和存储。除了作除了作为输入文件输入文件或或输出文件输出文件外,外,还可是可是既能既能输入又能输出的文件输入又能输出的文件。3939391.用成员函数用成员函数read和和write读写读写istream&read(char*buffer,int len);ostream&write(const char*buffer,int len);字符指针字符指针buffer:指向内存中一段空:指向内存中一段空间。len:读写的
26、字写的字节数。数。b.read(p2,30);a.write(p1,50);13.4.5对二进制文件的操作对二进制文件的操作404040例例13.14以二进制形式存入磁盘文件以二进制形式存入磁盘文件struct studentchar name20;int num;int age;char sex;void main()student stud3=Li,1001,18,f,Fun,1002,19,m,Wang,1004,17,f;ofstream outfile(stud.dat,ios:binary);if(!outfile)cerropen error!endl;abort();for(i
27、nt i=0;i3;i+)outfile.write(char*)&studi,sizeof(studi);outfile.close();outfile.write(char*)&stud0,sizeof(stud);414141例例13.15从磁盘文件读出并显示从磁盘文件读出并显示struct studentstring name;int num;int age;char sex;int main()student stud3;int i;ifstream infile(stud.dat,ios:binary);if(!infile)cerropen error!endl;abort();
28、for(i=0;i3;i+)infile.read(char*)&studi,sizeof(studi);infile.close();424242 for(i=0;i3;i+)coutNO.i+1endl;coutname:studi.nameendl;coutnum:studi.numendl;coutage:studi.ageendl;coutsex:studi.sexendlendl;例例13.15从磁盘文件读出并显示从磁盘文件读出并显示NO.1name:Linum:1001age:18sex:fNO.3name:Wangnum:1004age:17sex:fNO.2name:Funn
29、um:1001age:19sex:m4343432.与文件指针有关的流成员函数与文件指针有关的流成员函数文件指针文件指针:指明当前:指明当前应进行行读写的位置。写的位置。参照位置参照位置&ios:beg 文件开文件开头(begin),默,默认值。&ios:cur 指指针当前的位置当前的位置(current)。&ios:end 文件末尾。文件末尾。infile.seekg(100);outfile.seekp(-75,ios:end);4444443.随机访问二进制数据文件随机访问二进制数据文件例例13.16 有有5个学生的数据,要求个学生的数据,要求:(1)把它把它们存到磁存到磁盘文件中;文件
30、中;(2)将磁将磁盘文件中的第文件中的第1,3,5个学生数据个学生数据读入程入程序,并序,并显示出来;示出来;(3)将第将第3个学生的数据修改后存回磁个学生的数据修改后存回磁盘文件文件中的原有位置。中的原有位置。(4)从磁从磁盘文件文件读入修改后的入修改后的5个学生的数据个学生的数据并并显示出来。示出来。454545例例13.16struct studentint num;char name20;float score;void main()student st5=1001,Li,85,1002,Fun,97.5,1004,Wang,54,1006,Tan,76.5,1010,ling,96;
31、fstream iofile(stud.dat,ios:in|ios:out|ios:binary);if(!iofile)cerropen error!endl;abort();for(int i=0;i5;i+)/向文件向文件输出出5个学生的数据个学生的数据 iofile.write(char*)&sti,sizeof(sti);student st15;/存放从磁存放从磁盘文件文件读入的数据入的数据464646 for(int i=0;i5;i=i+2)iofile.seekg(i*sizeof(sti),ios:beg);iofile.read(char*)&st1i/2,sizeof
32、(st10);coutst1i/2.num st1i/2.name st1i/2.scoreendl;st2.num=1012;/修改第修改第3个学生个学生(序号序号2)数据数据 strcpy(st2.name,Wu);st2.score=60;iofile.seekpseekp(2*sizeof(st0),ios:beg);iofile.write(char*)&st2,sizeof(st2);例例13.16474747 iofile.seekg(0,ios:beg);/重定位于文件重定位于文件头 for(int i=0;i5;i+)iofile.read(char*)&sti,sizeof
33、(sti);coutsti.num sti.name sti.scoreendl;iofile.close();例例13.1649494913.5字符串流字符串流文件流文件流:以:以外存文件外存文件为输入入输出出对象的数据流。象的数据流。字符串流字符串流:以内存中:以内存中用用户定定义的字符数的字符数组(字字符串符串)为输入入输出的出的对象。称内存流。象。称内存流。字符串流类字符串流类&istrstream&ostrstream&strstream505050字符串类的特点字符串类的特点(1)输出出时数据流向数据流向内存的一个存内存的一个存储空空间。输入入时从从内存存内存存储空空间读取数据。取
34、数据。(2)字符串流字符串流对象关象关联的是内存的一个的是内存的一个字符数字符数组,无需打开和关无需打开和关闭文件。文件。(3)关关联的字符数的字符数组中中没有没有结束束标志志,要指定一,要指定一个特殊字符作个特殊字符作为结束符,在向字符数束符,在向字符数组写入全写入全部数据后要写入此字符。部数据后要写入此字符。5151511.建立输出字符串流对象建立输出字符串流对象构造函数原型构造函数原型ostrstream:ostrstream(char*buffer,int n,int mode=ios:out);&buffer:指向字符数:指向字符数组首元素的指首元素的指针&n:流:流缓冲区的大小冲区
35、的大小&mode::可:可选,默,默认为ios:outostrstream strout(ch1,20);5252522.建立输入字符串流对象建立输入字符串流对象提供了两个带参的构造函数提供了两个带参的构造函数istrstream:istrstream(char*buffer);istrstream:istrstream(char*buffer,int n);istrstream strin(ch2);istrstream strin(ch2,20);535353例例13.17将一组数据保存在字符数组中将一组数据保存在字符数组中#include struct studentint num;ch
36、ar name20;float score;void main()student stud3=1001,Li,78,1002,Wang,89.5,1004,Fun,90;char c50;ostrstream strout(c,30);for(int i=0;i3;i+)stroutstudi.numstudi.namestudi.score;stroutends;/插入插入0 coutarray c:cendl;array c:1001Li781002Wang89.51004Fun90545454例例13.18#include void main()char c50=12 34 65-23-
37、32 33 61 99 321 32;int a10,i,j,t;coutarray c:cendl;/显示数示数组中的字符串中的字符串 istrstream strin(c,sizeof(c);for(i=0;iai;/从从c读入入10个整数个整数赋给a coutarray a:;for(i=0;i10;i+)coutai;/显示整型数示整型数组a各元素各元素 coutendl;555555for(i=0;i9;i+)/用起泡法用起泡法对数数组a排序排序 for(j=0;jaj+1)t=aj;aj=aj+1;aj+1=t;ostrstream strout(c,sizeof(c);for(i
38、=0;i10;i+)stroutai;/将将10个整数存放在字符数个整数存放在字符数组c stroutends;/加入加入0 coutarray c:cendl;/显示字符数示字符数组c 例例13.18array c:12 34 65-23-32 33 61 99 321 32 (数组数组c原来的内容原来的内容)array a:12 34 65-23-32 33 61 99 321 32 (数组数组a的内容的内容)array c:-32 23 12 32 33 34 61 65 99 321 (数组数组c最后的内容最后的内容)565656与字符串流关联的字符数组与字符串流关联的字符数组相当于内
39、存中的相当于内存中的临时仓库临时仓库,用来存放各种,用来存放各种类型型的数据的数据(ASCII),需要,需要时从中从中读回。回。相当于相当于标准准设备,但,但标准准设备不能保存数据,不能保存数据,而字符数而字符数组的内容可随的内容可随时用用ASCII字符字符输出。出。比外存文件使用方便,比外存文件使用方便,不必建立文件不必建立文件(无需打无需打开与关开与关闭),存取速度快存取速度快。生命周期与其所在的模生命周期与其所在的模块(如主函数如主函数)相同。只相同。只能作能作为临时存存储空空间。13.5字符串流字符串流575757小结(小结(Summary)主要内容主要内容&I/O流的概念、流的概念、输出流、出流、输入流、入流、输入入/输出流。出流。&ASCII文件与二文件与二进制文件制文件&文件操作与文件流文件操作与文件流&使用使用I/O流流类库实现文件文件输入入/输出出58Thank YouThe End of Ch.13.