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

下载本文档

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

文档简介

第13章C++输入/输出流主要内容13.1C++的输入输出流13.2标准输入输出流13.3文件与文件流13.4应用实例13.1C++的输入/输出流1、流的基本概念流:数据从一个对象流动到另一个对象,这种流动抽象为流。(信息在内存和外部设备之间传递(流动)的过程)2、输入/输出流cin>>a;cout<<a;3、C++流的继承结构ios:对流状态进行设置,抽象基类;streambuf:提供对数据的缓冲支持;istream、ostream、iostream:提取与插入iosstreambufistreamostreamiostream4、文件的继承结构(文件I/O)5、字符串类(串I/O)提供处理内部初始化字符序列的操作;istrstream:从序列中取字符;ostrstream:将字符放入序列;13.2标准输入输出流13.2.1标准输入流1、预定义提取符的格式istream&istream::operator>>(type&obj);2、说明

输入语句中可以串联多个提取运算符,每个提取符后为一表达式,该表达式是获得输入值的变量或对象;cin:istream类对象,处理标准输入,即键盘输入;提取操作时,空白符(空格、tab键、换行符)只用于字符的分隔符,而本身不作为从输入流中提取的字符;提取符可从输入流中读取一个字符串,该字符串是以空白符结束的一个字符序列,由系统自动加上'\0'字符;【例13-1】测试cin的值,遇到无效字符或者文件结束符时,输入流cin就处于出错状态,同时判断流对象是否处于正常状态。#include<iostream>usingnamespacestd;intmain(){intx,y;cout<<"Enterx,y:";cin>>x>>y;cout<<"cin:"<<cin<<endl;if(!cin) {cout<<"error"<<endl;cout<<x<<','<<y<<endl;}else{cout<<"right"<<endl;

cout<<x<<','<<y<<endl;}return0;}运行结果:(1)正常数据输入Enterx,y:37cin:0047B888right3,7(2)异常数据输入Enterx,y:wxcin:00000000error-858993460,-8589934603、使用get()获取一个字符intistream::get();istream&istream::get(char&c);istream&get(char*s,intsize,chardelim=‘\n’);4、使用getline()获取多个字符istream&istream::getline(char*buf,intLimit,chardelim='\n');说明:get()和getline()都是以回车作为结束符;从输入流中读取Limit-1个字符后;从输入流中读取换行符或其他终止符后;从输出流中读取到文件或输入流结束符后;getline()通常用来读取一行字符;getline()函数结束操作的条件:getline()最多可读取Limit-1个字符;【例13-3】用getline函数读入一行字符。intmain(){charch[20];cout<<"enterasentence:"<<endl;cin>>ch;cout<<"Thestringreadwithcinis:"<<ch<<endl;cin.getline(ch,20,'/');//读19个字符或遇'/'结束

cout<<"Thesecondpartis:"<<ch<<endl;cin.getline(ch,20);//读20个字符或遇'\n'结束

cout<<"Thethirdpartis:"<<ch<<endl;return0;}运行结果:enterasentence:IlikeC++./IstudyC++./Iamhappy.↙Thestringreadwithcinis:IThesecondpartis:likeC++.Thethirdpartis:IstudyC++./Iamh分析:cin.getline()与cin.get(array_name,Arsize)的读取方式差不多,以Enter结束,可以接受空格字符。按照长度(Arsize)读取字符,cin.getline()会丢弃结束符,而cin.get()不会。cin.get(array_name,Arsize)当输入的字符串超长时,不会引起cin函数的错误,后面的cin操作会继续执行,只是直接从缓冲区中取数据。但是cin.getline()当输入超长时,会引起cin函数的错误,后面的cin操作将不再执行。6、辅助操作

intistream::peek();//返回输入流中的当前字符

istream&istream::putback(char);//将前面用get或者getline函数从输入流中读取的字符返回到输入流,插入到当前指针的位置,供后面读取

intistream::gcount()//返回上次输入的字符数【例13-6】peek函数和putback函数的用法。intmain(){ charc; intn; charstr[256]; cout<<"Enteranumberoraword:"; c=cin.get(); if((c>='0')&&(c<='9')) { cin.putback(c); cin>>n; cout<<"Youhaveenterednumber:"<<n<<endl;} else { cin.putback(c); cin>>str; cout<<"Youhaveenteredword:"<<str<<endl;} return0;}13.2.2标准输出流cout:ostream类对象,处理标准输出,即屏幕输出;cerr:ostream类对象,处理标准出错信息,提供不带缓冲区的输出;clog:ostream类对象,处理标准出错信息,提供带缓冲区的输出;三者的区别:cout:输出至终端显示器,经由缓冲区,可重定向。cerr:输出至终端显示器,没有缓冲区,不可重定向。clog:输出至终端显示器,经由缓冲区,不可重定向。1、预定义插入符的格式ostream&ostream::operator<<(consttype&obj);2、说明一般情况下将插入符作用于cout对象;输出语句中可以串联多个插入运算符,输出多个数据项;cout:ostream类对象,处理标准输出,即屏幕输出;3、其他流成员函数流成员函数作用相同的控制符作用precision(n)setprecision(n)设置实数的精度为n位width(n)setw(n)设置字段宽度为n位fill(c)setfill(c)设置填充字符csetf()setiosflags()设置输出格式状态unsetf()resetiosflags()终止已设置的输出格式状态格式状态标志说明ios::left左对齐输出,用于输出ios::right右对齐输出,用于输出ios::internal在符号和数值之间填充字符,用于输出ios::dec转换基数为十进制,用于输入或输出ios::oct转换基数为八进制,用于输入或输出ios::hex转换基数为十六进制,用于输入或输出ios::showbase输出时显示基指示符(0表示八进制,0x或0X表示十六进制),用于输入或输出ios::showpoint输出时显示小数点,用于输出ios::uppercase输出时表示十六进制的x为大写,表示浮点数科学计数法的e为大写,用于输出ios::showpos正整数前显示“+”符号,用于输出ios::scientific用科学表示法显示浮点数,用于输出ios::fixed用定点形式显示浮点数,用于输出ios::unitbuf在输出操作后立即刷新所有流,用于输出ios::stdio在输出操作后刷新stdout和stderr,用于输出【例13-8】用控制符控制输出格式。intmain(){ inta=10; doubleb=314159.26; cout<<a<<endl;//以十进制形式输出

cout<<setbase(8);//以八进制形式输出

cout<<setiosflags(ios::showbase);//显示进制指示符

cout<<a<<endl; cout<<setprecision(7);//设置精度为7位

cout<<b<<endl; cout<<setiosflags(ios::fixed);//设置以固定小数点方式输出

cout<<setprecision(4);//设置小数点后保留4位

cout<<b<<endl;

//设置以指数形式输出,同时字母大写且左对齐 cout<<setiosflags(ios::scientific|ios::uppercase|ios::left); cout<<setw(20);//设置显示域宽为20 cout<<setfill('*');//空白处以'*'填充

cout<<-b<<endl;//以负数方式输出

//取消指数形式输出,同时字母大写且左对齐的设置

cout<<resetiosflags(ios::scientific|ios::uppercase|ios::left); cout<<setfill('');//空白处以''填充 cout<<setprecision(6); cout<<setw(20); cout<<b<<endl; return0;}运行结果10(以十进制形式输出)012(以八进制形式输出,且显示进制指示符)314159.3(设置精度为7位)314159.2600(以固定小数点形式输出,小数点后保留4位)-3.142E+005*********(以指数形式左对齐输出,域宽为20,空白处以'*'填充)314159.260000(域宽为20,小数点后保留6位,空白处以''填充)4、使用put()输出一个字符ostream&ostream::put(charc);5、使用write()输出n个字符ostream&ostream::write(char*buf,intn);说明:这些成员函数既可用于文本流,也可用于二进制流,尤其适用于二进制流;[例]分析下列程序的输出结果。#include<iostream>usingnamespacestd;voidmain(){cout<<'a'<<','<<'b'<<'\n';cout.put('a').put(',').put('b').put('\n');charc1='A',c2='B';cout.put(c1).put(c2).put('\n');}运行结果:a,ba,bAB[例]分析下列程序的输出结果。#include<iostream>usingnamespacestd;voidprint(char*s){cout.write(s,strlen(s));cout.put('\n');cout.write(s,6)<<'\n';}voidmain(){char*str="ILoveChina!";print(str);}运行结果:ILoveChina!ILove13.3文件与文件流13.3.1文件的类型1、文件的概念

在磁盘上保存的信息是按文件的形式组织的,每个文件都对应一个文件名,并且属于某个物理盘或逻辑盘的目录层次结构中一个确定的目录之下。一个文件名由文件主名和扩展名两部分组成。2、文件的类型

按存储格式分为两种类型,一种为字符格式文件(文本文件),另一种为内部字节文件(二进制文件)。文件的类型根据文件中数据的组织形式,可分为ASCII文件和二进制文件。对于字符信息,在内存中是以ASCII代码形式存放的,因此,无论用ASCII文件输出还是用二进制文件输出,其数据形式是一样的。但是对于数值数据,二者是不同的。例如有一个长整数100000,在内存中占4个字节,如果按内部格式直接输出,在磁盘文件中占4个字节,如果将它转换为ASCII码形式输出,则要占6个字节。长整数100000

‘1’

‘0’

‘0’

‘0’

‘0’

‘0’

3、文件流对象要用#include<fstream>命令。它提供的输入文件流类:ifstream输出文件流类:ofstream输入输出文件流类:fstream定义用户所需要的文件流对象,然后利用open成员函数,按照一定的方式打开一个文件。文件被打通过流对象访问其中内容,结束后用close关闭。13.3.2文件流的操作说明一个文件流对象,然后进行操作:ifstreamifile;//说明一个输入流对象ofstreamofile;//说明一个输出流对象fstreamiofile;//说明一个输入/输出流对象1.打开磁盘文件打开文件是指在文件读写之前做必要的准备工作包括:(1)为文件流对象和指定的磁盘文件建立关联,以便使文件流流向指定的磁盘文件。(2)指定文件的工作方式。以上工作可以通过两种不同的方法实现。打开文件(1)使用文件流对象的成员函数(open)打开一个磁盘文件,在文件流对象和磁盘文件名之间建立联系。ofstreamoutfile;//定义ofstream类对象outfileoutfile.open(″f1.txt″,ios::out);//使文件流与f1.txt文件建立关联open()函数的原型voidopen(constchar*filename,intmode,

intprot=filebuf::openprot);相关参数说明:Filename:文件名,它可包含路径说明。Mode:文件打开的模式Prot:文件的访问方式,取值为:

0普通文件1只读文件

2隐含文件4系统文件

(默认为0)

对于ifstream流,mode的默认值为ios::in;对于ofstream流,mode的默认值为ios::out。方式意义ios::in打开文件进行读操作ios::out打开文件进行写操作ios::ate打开时文件指针定位到文件尾ios::app添加模式,所有增加都在文件尾部ios::trunc如果文件已存在则清空原文件ios::binary二进制文件(非文本文件)mode的符号常量可以“|”组合在一起例:ofstreamoutfile;outfile.open(“f1.txt”,ios::out|ios::app);fstreamfile;file.open(“f2.txt”,ios::in|ios::out|ios::binary);打开文件(2)在定义文件流对象时指定参数在声明文件流类时定义了带参数的构造函数,其中包含了打开磁盘文件的功能。因此,可以在定义文件流对象时指定参数,调用文件流类的构造函数来实现打开文件的功能。如 ofstreamoutfile(″f1.txt″,ios::out);一般多用此形式,比较方便。作用与open函数相同。输入输出方式是在ios类中定义的,它们是枚举常量,有多种选择,见书中表13-5。2.关闭磁盘文件在对已打开的磁盘文件的读写操作完成后,应关闭该文件。关闭文件用成员函数close。如:outfile.close();所谓关闭,实际上是解除该磁盘文件与文件流的关联,原来设置的工作方式也失效,这样,就不能再通过文件流对该文件进行输入或输出。3.文件的读写文本文件的读写二进制文件的读写13.3.3文本文件的读写操作(1)使用流运算符直接读写可以直接使用流的“<<”和“>>”,完成文件的字符转换工作。(2)使用流成员函数 输出流成员函数为:put函数

输入流成员函数有:get函数、getline函数【例13-10】把整型数组的所有元素写入文本文件中存放。#include<iostream>#include<fstream>usingnamespacestd;intmain(){ //创建文件流对象,并以输出方式与try.txt文件建立关联

fstreamf("d:\\try.txt",ios::out); f<<1234<<''<<3.14<<'A'<<"Howareyou";//往文件中写入数据

f.close(); //关闭文件

f.open("d:\\try.txt",ios::in);//以输入方式与try.txt文件建立关联 inti; doubled; charc; chars1[20]; chars2[20]; f>>i>>d>>c>>s1; //从文件中读取数据

f.getline(s2,20); cout<<i<<endl;//在显示器上显示读取到的数据

cout<<d<<endl; cout<<c<<endl; cout<<s1<<endl; cout<<s2<<endl; f.close(); return0;}【例13-11】从键盘读入一行字符,把其中的数字依次存放在文件number.txt中。再从文件number.txt中读入5个整数放在数组中,找出并输出5个数中的最大者和它在数组中的序号。voidsave_to_file(){ ofstreamoutfile(“number.txt”); if(!outfile)

{ cerr<<"opennumber.txterror!"<<endl; exit(1); } charc[80]; cin.getline(c,80);//从键盘读入一行字符 for(inti=0;c[i]!=0;i++)//对字符逐个处理,直到遇'\0'为止

if(c[i]>='0'&&c[i]<='9')

{ outfile.put(c[i]).put('');//存入文件 cout<<c[i];//同时送显示器显示

} cout<<endl; outfile.close();//关闭number.txt}voidget_from_file(){ constintLEN=5; inta[LEN],max,i,order; ifstreaminfile("number.txt",ios::in);

if(!infile)

{ cerr<<"opennumber.txterror!"<<endl;

exit(1);

} for(i=0;i<LEN;i++)

{

infile>>a[i];

cout<<a[i]<<"";

} cout<<endl; max=a[0];//先将第1个数组元素(下标为0)赋给max order=0;//记录下标

for(i=1;i<LEN;i++) if(a[i]>max) { max=a[i];//将当前最大值放在max中

order=i;//将当前最大值的元素序号放在order中

} cout<<"max="<<max<<endl<<"order="<<order<<endl; infile.close();}intmain(){ save_to_file(); get_from_file(); return0;}13.3.4二进制文件的读写操作1、用write()往文件写入n个字节原型:ostream&ostream::write(char*buf,intn);2、用read()从文件读取n个字节原型:istream&istream::read(char*buf,intn);structperson{charname[20];doubleheight;intage;};personpeople[6];//假设数组已经赋值outfile.write((char*)

&people[i],sizeof(people[i]));【例13-12】编写一个程序对二进制文件进行读写。要求从键盘输入若干学生的信息写入二进制文件,再从该二进制文件中读出学生的信息到内存中并输出到显示器。#include<iostream>#include<fstream>usingnamespacestd;structStudent//定义Student结构体类型{ charname[10];//姓名

charid[10];//学号

intscore;//分数};#defineLENsizeof(structStudent)intmain()

温馨提示

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

评论

0/150

提交评论