C++程序设计第二版课件第10章 输入输出流_第1页
C++程序设计第二版课件第10章 输入输出流_第2页
C++程序设计第二版课件第10章 输入输出流_第3页
C++程序设计第二版课件第10章 输入输出流_第4页
C++程序设计第二版课件第10章 输入输出流_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10章输入输出流课程要求1.数据输入输出的基本方法2.文件操作3.字符串流的操作主要内容10.1C++的输入输出10.2标准输入输出流10.3文件操作与文件流10.4字符串流10.1C++的输入输出C++的输入输出是以流(字节序列)的形式进行的。C++的输入输出主要有以下三种:(1)对系统指定的标准设备的输入输出,即标准I/O。(2)以外存磁盘文件为对象进行的输入输出,称为文件的输入输出。(3)对内存指定的空间进行输入输出,称为字符串输入输出。10.1.1C++流的概念1.流与流类C++的输入输出流是由若干字节组成的字节序列,这些字节中的数据按一定的顺序从一个对象传送到另一个对象。从流中获取数据的操作称为提取操作,向流中添加数据的操作称为插入操作。C++提供了一些供程序设计者使用的类,在这些类中封装了可以实现输入输出操作的函数,这些类统称为I/O流类。流是用流类定义的对象,如cin、cout2.流的分类(1)文本流和二进制流:按照数据的格式(2)缓冲流与非缓冲流:按是否使用缓冲区10.1.2C++流类库C++的流类库是用继承方法建立起来的输入输出类库,由支持标准输入输出操作的基类和支持特定种类的源和目标的输入输出操作的类组成。它具有两个平行的基类,所有其它的流类都是从它们直接或间接地派生出来的。streambuf类:提供对流缓冲区的低级操作ios类:提供对设备、文件的读写操作1.通用I/O流类库(1)基类ios(2)输入类istream(3)输出类ostream(4)输入输出类iostream2.文件I/O流类库(1)ofstream类(2)ifstream类(3)fstream类3.字符串I/O流类库(1)ostrstream类(2)istrstream类(3)strstream类10.1.3与iostream类库有关的头文件(1)iostream.h:包含对输入输出流进行操作的基本信息,提供无格式支持的低级输入输出和有格式支持的高级输入输出操作功能。(2)fstream.h:包含管理文件输入输出操作的有关信息。(3)strstrea.h:包含对内存中数据进行输入输出操作的有关信息。(4)stdiostream.h:包含进行C风格的输入输出操作的有关信息。(5)iomanip.h:包含输入输出流的格式控制符(manipulator)的有关信息。当一个程序中需要进行标准流输入输出操作时,则必须包含头文件iostream.h;当需要进行文件流输入输出操作时,则必须包含头文件fstream.h;当需要进行字符串流读/写操作时,则必须包含头文件strstream.h。10.1.4插入与提取运算符的重载“<<”和“>>”本来在C++中被定义为左位移运算符和右位移运算符,由于在文件iostream.h中对它们进行了重载,使得它们能用作标准类型数据的输入输出运算符。从流中获取数据的操作称为提取操作,使用提取运算符“>>”;向流中添加数据的操作称为插入操作,使用插入运算符“<<”。10.2格式化输入输出通过键盘和屏幕作为输入输出设备的数据传递过程称为标准输入输出。流是一个抽象的概念,进行I/O操作时,必须将流与一种具体的物理设备联系起来。10.2.1标准输入输出流类标准流是不需要打开和关闭文件即可直接操作的流式文件。命名空间std的iostream类库中包括四个标准输入输出流对象的说明。cin:类istream的对象,用来处理标准输入,即键盘输入。cout:类ostream的对象,用来处理标准输出,即屏幕输出。cerr和clog:类ostream的对象,与错误信息的标准输出设备(屏幕)相关联,前者为非缓冲方式,后者为缓冲方式。1.标准输入流cin是由输入类istream的派生类istream_withassign定义的对象,在缺省的情况下,cin所关联的外部设备为键盘,实现从键盘上输入数据。cin为缓冲流。2.标准输出流在C++流类体系中定义的标准输出流是cout、cerr、clog,是由输出类ostream的派生类ostream_withassign定义的对象,在缺省的情况下,cout、cerr、clog所关联的外部设备为屏幕,实现数据流输出到屏幕。cout、clog为缓冲流,而cerr为非缓冲流。【例10.1】

输入x,输出x2。//*****ex10_1.cpp*****#include<iostream>usingnamespacestd;voidmain(){floatx;cerr<<"输入变量x的值:";cin>>x;clog<<"x*x="<<x*x<<endl;}10.2.2数据输入输出成员函数1.数据输入成员函数(1)字符输入成员函数成员函数get()可以从输入流中获取字符,并将它存放在指定的变量中。该函数有以下两种格式:ch=cin.get()cin.get(ch)函数实现从输入流中读取一个字符,赋给字符变量ch。采用第2种格式时,如果读取数据成功则函数返回非0值(真),否则(遇结束标志符)返回0值(假)。【例10.2】读取字符#include<iostream>usingnamespacestd;voidmain(){charc1,c2,c3;cout<<"输入字符:";c1=cin.get();cin.get(c2);

cin.get(c3);cout<<"c1="<<c1<<endl;cout<<"c2="<<c2<<endl;cout<<"c3="<<c3<<endl;}输入字符::abc↙c1=ac2=c3=b(2)字符串输入成员函数从输入流中一次读取一串字符,有以下2种方式:cin.get(字符数组或字符指针,字符个数n,终止字符)cin.getline(字符数组或字符指针,字符个数n,终止字符)从输入流中读取n-1个字符,赋给指定的字符数组(或字符指针指向的数组)。如果在读取n-1个字符之前遇到指定的终止字符,则提前结束读取。如果读取成功则函数返回非0值(真),否则(遇文件结束符)返回0值(假)。第三个参数缺省为换行符。【例10.3】读取字符串#include<iostream>usingnamespacestd;voidmain(){charstr[20];cout<<"输入一行字符串:";cin.getline(str,20);//也可用cin.get(str,20);cout<<"str="<<str<<endl;}程序运行结果如下:输入1行字符串:Hello,everyone.↙str=Hello,everyone.2.数据输出成员函数(1)字符输出成员函数函数put()用于输出单个字符,格式如下:cout.put(charc);put函数的参数c可以是字符或字符的ASCII码,例如:cout.put('a'); //在屏幕上显示字符a(2)字符串输出成员函数函数write()用于输出一个指定长度的字符串,格式如下:cout.write(字符串,字符个数n);例如:cout.write("Thisisabook.\n",20);10.2.3格式控制成员函数数据输出的格式控制可通过两种途径实现:使用预定义格式控制符带参数(如setw(n))的:在头文件iomanip.h中定义不带参数(如dec)的:在头文件iostream.h中定义使用由ios类定义的格式控制成员函数:在头文件iostream.h中说明1.输出宽度和填充字符输出宽度和填充字符可通过由ios类中定义的输出域宽控制成员函数width(n)和填充成员函数fill(c)实现。其中n为输出数据的宽度,c为填充字符。【例10.4】使用成员函数控制输出宽度及填充方式#include<iostream>usingnamespacestd;voidmain(){doublea=1234.56;cout.fill('*');for(inti=0;i<4;i++){cout.width(i+6);cout<<a<<endl;}}程序运行后输出:1234.561234.56*1234.56**1234.562.其它格式控制若要改变流的其它输出格式(如对齐方式),可使用ios类中定义的成员函数setf来实现,函数格式如下:cout.setf(格式标志)格式标志在类ios中被定义为枚举值,在引用这些格式标志时要在前面加上类名ios和域运算符“::”。【例10.5】

将商品名称与单价通过初始化赋给数组mname、price,输出各商品的名称和单价,指定商品名称域宽为10个字符、左对齐,单价为右对齐、用定点方式、小数点后有2位有效数字。分析:浮点数默认的输出精度为6(即输出6位有效数字),例如浮点数3456.7891显示为3456.79。若要实现指定小数点后显示几位有效数字,应先用setf设置定点方式,再用成员函数precision(n)设置小数点后n位有效数字。#include<iostream>usingnamespacestd;voidmain(){char*mname[]={"pencil","pen","book","pencilbox","bag"};doubleprice[]={1.9,17.2,8.63,24,65};for(inti=0;i<5;i++){cout.setf(ios::left); //设置左对齐cout.width(10); //设置域宽为10cout<<mname[i];cout.unsetf(ios::left);cout.setf(ios::fixed); //设置定点方式cout.precision(2);//设置小数点后2位有效数字cout<<price[i]<<'\n';}}程序运行后,输出如下:pencil1.90pen17.20book8.63pencilbox24.00bag65.0010.3文件输入输出10.3.1文件的概念

1.文件文件(File)指存储于外部介质上的信息集合,分为文本文件和二进制文件。文本文件中的每一个字节分别为一个字符对应的ASCII码;二进制文件则是把数据按其在内存中的存储形式原样输出到磁盘上存放。例如整数1025,以文本形式(49485053H)存储占用四个字节,以二进制形式(0401H)存储则只占用两个字节。2.文件的操作文件操作分成4步:(1)定义文件流对象ifstream文件输入流对象;ofstream文件输出流对象;fstream文件输入/出流对象;(2)打开文件文件流对象.open(磁盘文件名,输入输出模式)也可以在定义文件流对象时指定文件打开模式,在构造过程中打开该文件。定义方式如下:ifstream文件流对象(磁盘文件名,输入输出模式);ofstream文件流对象(磁盘文件名,输入输出模式);fstream文件流对象(磁盘文件名,输入输出模式);(3)读/写文件对文件的操作是通过调用其父类ios、istream、ostream中说明的成员函数来实现的(4)关闭文件文件流对象.close();10.3.2文本文件的读写1.使用提取运算符或插入运算符对文件进行读写操作。【例10.6】使用提取运算符和插入运算符将源文件中的前100个字符复制到目标文件中。#include<iostream>#include<fstream>usingnamespacestd;voidmain(){charfname1[20],fname2[20];cout<<"输入源文件名:";cin>>fname1;ifstreaminfile(fname1);//定义文件输入流对象,打开源文件if(!infile){cout<<"不能打开源文件:"<<fname1<<endl;return;}cout<<"输入目的文件名:";cin>>fname2;ofstreamoutfile(fname2);//定义文件输出流对象,打开目标文件charch;inti;i=0;while(i<100){infile>>ch; //从源文件中提取一个字符到变量ch中;outfile<<ch; //将ch中的字符写入目标文件中。i=i+1;}infile.close(); //关闭源文件outfile.close(); //关闭目标文件}2.使用成员函数进行文件的读写操作【例10.7】使用成员函数get与put将源文件的内容复制到目标文件中分析:先打开源文件和目标文件,依次从源文件中读取一个字符,并将所读字符写入目标文件中,直到源文件中所有字符读完为止。#include<iostream>#include<fstream>usingnamespacestd;voidmain(){charfname1[20],fname2[20];cout<<"输入源文件名:";cin>>fname1;ifstreaminfile;//定义文件输入流对象infile.open(fname1,ios::in);//打开源文件if(!infile){cout<<"源文件不存在!"<<fname1<<endl;return;}cout<<"输入目标文件名:";cin>>fname2;ofstreamoutfile;//定义文件输出流对象outfile.open(fname2,ios::out);//打开目标文件charch;while(infile.get(ch)) //从源文件中提取一个字符到变量ch中;outfile.put(ch); //将ch中的字符写入目标文件中。infile.close(); outfile.close();}10.3.3二进制文件的读写1.二进制文件的写操作二进制文件的写操作是通过成员函数write()来实现:write(字符数组或字符指针,字节数);2.二进制文件的读操作二进制文件的读操作是通过成员函数read()来实现:read(字符数组或字符指针,字节数);【例10.8】

把0~90度的正弦值写到二进制文件bin.dat中#include<iostream>#include<fstream>#include<math.h>usingnamespacestd;voidmain(){fstreamoutfile("bin.dat",ios::out|ios::binary);inti;if(!outfile){cout<<"不能打开输出文件\n";return;}doubles[91];for(i=0;i<=90;i++)s[i]=sin(i*3.1415926/180);outfile.write((char*)s,sizeof(double)*91); //一次写入91个实数outfile.close();}3.测试文件结束测试二进制文件结束位置可用成员函数eof()实现,当到达文件结束位置时,该函数返回零值,否则返回非零值。4.返回读入数据的长度返回最近一次输入所读入的字节数可用成员函数gcount()实现。【例10.10】

使用读写二进制的成员函数,实现文件的复制。#include<iostream>#include<fstream>usingnamespacestd;intmain(){charfname1[20],fname2[20];charbuff[4096]; //建立4K缓冲区fstreaminfile,outfile;cout<<"输入源文件名:";cin>>fname1;infile.open(fname1,ios::in|ios::binary);if(!infile){cout<<"不能打开输入文件:"<<fname1<<endl;return(1);}cout<<"输入目标文件名:";cin>>fname2;outfile.open(fname2,ios::out|ios::binary);if(!outfile){cout<<"目标文件"<<fname2<<"已存在!"<<endl;return(2);}intn;while(!infile.eof()) {infile.read(buff,4096); n=infile.gcount(); //取实际读的字节数outfile.write(buff,n); //按实际读的字节数写入文件}infile.close(); outfile.close();return(0);}10.3.4文件的随机读写从文件中任何位置开始进行读或写数据,这种读写方式称为文件的随机访问或直接存取。1.文件定位C++的类库fstream中定义了两个与文件相联系的指针读指针写指针C++的文件定位分为读位置和写位置的定位,对应的成员函数seekg():设置读位置Seekp:设置写位置1.seekg函数seekg(位移量n);seekg(位移量n,参照位置);第1种格式专用于相对文件头指针移动n个字节,第2种格式用于相对参照位置指针移动n个字节。参照位置可取三个值:①io3::beg或0:文件头。②io3::cur或1:文件指针当前的位置。③io3::end或2:文件尾。2.seekp函数文件写操作的定位是通过成员函数seekp实现的。函数的格式如下:seekp(位移量n);seekp(位移量n,参照位置);第1种格式专用于相对文件头指针移动n个字节,第2种格式用于相对参照位置指针移动n个字节。3.tellg函数返回输入文件中文件指针的当前位置是通过成员函数tellg实现的,该函数的返回值为streampos类型。利用seekg和tellg可以获取文件的大小。例如:ifstreamtfile(fname,ios::in|ios::nocreate);tfile.seekg(0,ios::end);longn=tfile.tellg();cout<<"文件大小为"<<n-1<<"个字节";4.tellp函数返回输出文件中文件指针的当前位置是通过成员函数tellp实现的,该函数的返回值为streampos类型。函数的格式如下:tellp();10.4字符串流字符串流则是以内存中用户自定义的字符数组(字符串)为输入输出的对象,因此字符串流又称为内存流。10.4.1字符串流的概念字符串流对象关联的不是文件,而是内存中的一个字符数组,因此不需打开和关闭流对象。字符串流类包括istrstream、ostrstream和strstream。10.4.2字符串流的输出操作1.字符串输出流的定义定义字符串输

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论