版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十一章流类库与输入/输出C++语言程序设计1本章主要内容I/O流的概念标准输入输出文件操作2I/O流的概念流是对输入/输出的一个抽象表述。程序通过从流中提取字符和向流中插入字符来实现输入和输出。
I/O流类库是一个提供输入/输出功能的,面向对象的类库。
3I/O流类库的层次结构ios流基类istream通用输入流类ostream通用输出流类iostream通用输入输出流类ifstream输入文件流类ofstream输出文件流类
fstream输入输出文件流类
4标准输入输出流对象cout标准输出,默认输出设备屏幕cerr标准错误输出,没有缓冲,发送给它的内容立即被输出,默认输出设备屏幕。clog类似于cerr,但是有缓冲,缓冲区满时被输出,默认输出设备打印机。cin标准输入,默认输入设备键盘5运算符插入(<<)运算符是所有标准C++数据类型预先设计的,用于传送字节到一个输出流对象。提取运算符(>>)对于所有标准C++数据类型都是预先设计好的,它是从一个输入流对象获取字节最容易的方法。6classRMB{public:RMB(unsignedintd=0,unsignedintc=0); RMBoperator+(RMB&);RMB&operator++(); RMBoperator++(int);friendostream&operator<<(ostream&os,constRMB&r);friendistream&operator>>(istream&is,RMB&r);private:unsignedintyuan; unsignedint};7ostream&operator<<(ostream&os,constRMB&r) { os<<r.yuan<<''<<r.jf<<endl; returnos; }istream&operator>>(istream&is,RMB&r) { is>>r.yuan>>r.jf; returnis;}8intmain() {RMBd4,d5; cout<<"pleaseinput:yuanjf"<<endl;
cin>>d4>>d5; cout<<d4<<d5<<endl; }9使用流对象成员函数用getline()读取输入行:读取分隔符用get()输入一系列字符:不读取分隔符用ignore()读取并丢弃一系列字符用get()读取一个字符用put()输出一个字符用peek()查看输入流中的下一个字符用read()实现无格式输入用write()实现无格式输出10使用get和put成员函数输入输出字符
#include<iostream>usingnamespacestd;intmain(){ intch; cout<<"Inputasentence:"<<endl; while((ch=cin.get())!=EOF)cout.put(ch);//使用get和put来读取显示字符 return0;}11使用peek()成员函数输入输出字符
#include<iostream>usingnamespacestd;intmain(){ intch; cout<<"Inputasentence:"<<endl; while(cin.peek()!=‘*’)
{cin.get(ch);cout.put(ch); return0;}12流状态eofbit如果到达文件尾,则设为1badbit如果流被破坏,则设为1failbit如果输入没有读到预期字符或输出没有写入预期字符,则设置为1eof()eof被设置,返回truefail()badbit或failbit被设置,返回trueclear()13流状态控制if(cin.fail()&&!cin.eof()){cin.clear();while(!isspace(cin.get()))continue;}14控制输出格式成员函数方式
包含头文件<iostream>precision(n),width(n),flags(c),flags(8),flags(16),flags(10),fill(c)用控制符
包含头文件<iomanip>setprecision(n),setw(n),setfill(c),oct,hex,dec,setiosflags(),resetiosflags()15设置整数流的基数——
dec、oct、hex和setbase
#include<iostream>#include<iomanip>usingnamespacestd;intmain(){intnum;cout<<"Enteradecnumber:";cin>>num;//使用hex流操纵符显示十六进制整数cout<<num<<"inhexis:"<<
hex<<num<<endl;//使用oct流操纵符显示八进制整数cout<<dec<<num<<"inoctis:"<<oct<<num<<endl;//使用setbase流操纵符显示十进制整数cout<<setbase(10)<<num<<"indecis:"<<num<<endl;return0;}输出结果:Enteradecnumber:3737inhexis:2537inoctis:4537indecis3716设置浮点数精度——
precision和setprecision
#include<iostream>#include<iomanip>#include<cmath>usingnamespacestd;intmain()//设置小数点后面的位数
{doubleroot=sqrt(3.0); cout<<"setbyprecision:\n"<<fixed;//使用fixed精度for(inti=0;i<=4;i++){ cout.precision(i); cout<<root<<endl;}
return0;}输出结果:Setbyprecision:21.71.731.7321.732117设置域宽:width和setw
#include<iostream>#include<iomanip>usingnamespacestd;voidmain(){doublevalues[]={1.23,35.36,653.7,4358.24};char*names[]={"zrf","ssh","zzz","sss"};for(inti=0;i<4;i++) //设置域宽输出{cout.width(20);
cout<<names[i]<<setw(20)<<values[i]<<'\n';}}//域宽设置仅对下一次流提取或流插入操作有效。默认不足用空格补。不带参数的width函数返回当前域宽。
18设置填充标志——
fill和setfill
#include<iostream>#include<iomanip>usingnamespacestd;intmain(){intnum=80000;cout<<<setw(10)<<num<<endl; cout<<left<<setw(10)<<num<<endl;//左对齐cout<<internal<<setw(10)<<num<<endl<<endl; cout<<right;cout.fill('*'); //添加填补字符*cout<<setw(10)<<dec<<num<<endl;cout<<left<<setw(10)<<setfill('%')<<num<<endl; //添加填补字符%return0;}19例11-3设置对齐方式#include<iostream>#include<iomanip>usingnamespacestd;intmain(){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)<<values[i]<<endl;}输出结果:Zoot1.23Jimmy35.36Al653.7Stan4358.2420设置科学记数法和定点符号——scientific和fixed
#include<iostream>usingnamespacestd;intmain(){doublex=0.0001234567;doubley=1.846e8;//按照默认格式显示cout<<“Indefaultformat:\n"<<x<<'\t'<<y<<endl;//按科学计数法显示cout<<“Inscientificformat:\n"<<scientific<<x<<'\t'<<y<<endl;//按定点格式显示cout<<“Infixedformat:\n"<<fixed<<x<<'\t'<<y<<endl;
return0;}输出结果:Indefaultformat:0.00012345671.846e+008Inscientificformat:1.234567e-0041.846000e+008Infixedformat:0.000123184600000.00000021例11-4控制输出精度#include<iostream>#include<iomanip>usingnamespacestd;intmain(){doublevalues[]={1.23,35.36,653.7,4358.24};char*names[]={"Zoot","Jimmy","Al","Stan"};cout<<setiosflags(ios::scientific);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+00322Setf与unsetf#include<iostream>usingnamespacestd;intmain(){doubletemperature=29.5;cout.setf(ios::showpos);cout.setf(ios::showpoint);cout<<temperature<<endl;
cout.unsetf(ios::showpos);cout.unsetf(ios::showpoint);
cout<<temperature<<endl;return0;}输出结果:+29.500029.523文件操作ofstream类输出到文件ifstream类从文件输入fstream类进行文件输入和输出用户需要自定义文件输入流对象或输出流对象在创建流对象时把流与文件关联24输出文件流对象ofstream类支持磁盘文件输出如果在构造函数中指定一个文件名,当构造这个文件时该文件是自动打开的ofstreammyFile("filename",iosmode);可以在调用默认构造函数之后使用open成员函数打开文件ofstreammyFile;//声明一个静态输出文件流对象myFile.open("filename",iosmode);
//打开文件,使流对象与文件建立联系ofstream*pmyFile=newofstream;
//建立一个动态的输出文件流对象pmyFile->open("filename",iosmode);
//打开文件,使流对象与文件建立联系25文件打开模式ios::out以写入方式打开ios::out|ios::binary以二进制写入方式打开ios::out|ios:trunc覆盖已有文件ios::out|ios:app追加文件ios::in以读取方式打开ios::in|ios::binary以二进制读取方式打开
26使用流运算符输出文本文件#include<iostream>#include<fstream>usingnamespacestd;intmain(){ ofstreamofile("test");//以文本输出方式打开 if(!ofile) { cout<<"Cannotopenfile.\n"; return1; }
ofile<<10<<""<<123.23<<"\n";//输出到文件 ofile<<"Thisprogramisdesignedbyzrfandssh!.";
ofile.close(); //关闭文件 return0;}
27输出文件流成员函数open函数把流与一个特定的磁盘文件关联起来。需要指定打开模式。put函数把一个字符写到输出流中。write函数把内存中的一块内容写到一个输出文件流中seekp函数将输出指针移动到文件的指定位置,0表示文件头tellp函数返回输出指针的当前位置(streampos)close函数关闭与一个输出文件流关联的磁盘文件28输入文件流对象如果在构造函数中指定一个文件名,在构造该对象时该文件便自动打开。ifstreammyFile("filename",iosmode);在调用缺省构造函数之后使用open函数来打开文件。ifstreammyFile;//建立一个文件流对象myFile.open("filename",iosmode);
//打开文件"filename"29使用流运算符读入文本文件#include<iostream>#include<fstream>usingnamespacestd;intmain(){ charch;inti;floatf;charstr[80];
ifstreamifile("test");//以文本输出方式打开文件
if(!ifile) { cout<<"Cannotopenfile.\n"; return1; } ifile>>i>>f>>ch>>str; //读文件 cout<<i<<""<<f<<""<<ch<<"\n"<<str;
ifile.close();//关闭文件 return0;}30输入流成员函数open()函数
把输入流与一个磁盘文件相关联get(),getline()函数
整行输入字符串read()函数
从输入文件流中读给定字节数据到指定的内存区域31输入流成员函数seekg()函数
用来设置输入文件流中读取数据位置的指针tellg()函数
返回当前文件读指针的位置,streamposclose()函数
关闭与一个输入文件流关联的磁盘文件32例11-5向文件输出#include<fstream>usingnamespacestd;structDate{intmo,da,yr;};intmain(){Datedt={6,10,92};
ofstreamtfile("date.dat",ios::binary);
tfile.write((char*)&dt,sizeofdt);tfile.close();}33使用read()和write()函数读写二进制文件
#include<iostream>#include<fstream>usingnamespacestd;intmain(){ intn[5]={1,2,3,4,5};inti;
ofstreamofile("test.bin",ios::out|ios::binary);//以二进制方式打开文件 if(!ofile) {cout<<"Cannotopenfile.\n";return1; }
ofile.write((char*)n,sizeofn);//向文件写数据块
ofile.close();
34for(i=0;i<5;i++) n[i]=0;
ifstreamifile("test.bin",ios::in|ios::binary);//以二进制方式打开文件 if(!ifile){cout<<"Cannotopenfile.\n";return1; }
ifile.read((char*)n,sizeof(n));
//从文件中读数据 for(i=0;i<5;i++) cout<<n[i]<<"";
ifile.close(); return0;}35classRMB{public:RMB(unsignedintd=0,unsignedintc=0); RMBoperator+(RMB&);RMB&operator++(); RMBoperator++(int);friendostream&operator<<(ostream&os,constRMB&r);friendistream&operator>>(istream&is,RMB&r);private:unsignedintyuan; unsignedint};36ostream&operator<<(ostream&os,constRMB&r) { os<<r.yuan<<''<<r.jf<<endl; returnos; }istream&operator>>(istream&is,RMB&r) { is>>r.yuan>>r.jf; returnis;}37intmain() {RMBd4,d5; cout<<"pleaseinput:yuanjf"<<endl;
cin>>d4>>d5; ofstreamofile("test"); if(!ofile) {cout<<"Cannotopenfile.\n"; return1; }
ofile<<d4<<d5<<endl;
ofile.close();
38
ifstreamifile("test"); if(!ifile) { cout<<"Cannotopenfile.\n"; return1; }
ifile>>d5>>d6; cout<<d5<<d6<<endl; ifile.close();39ofstreamofile1("test1.bin",ios::out|ios::binary); if(!ofile1) {cout<<"Cannotopenfile.\n"; return1; }ofile1.write((char*)&d4,sizeofd4);ofile1.write((char*)&d5,sizeofd5); ofile1.close();40ifstreamifile1("test1.bin",ios::in|ios::binary); if(!ifile1) {cout<<"Cannotopenfile.\n"; return1; }ifile1.read((char*)&d5,sizeofd5);ifile1.read((char*)&d6,sizeofd6);cout<<d5<<d6<<endl; ifile1.close();41设计文本文件的拷贝类CFileCopy
设计一个用于文本文件拷贝类CFileCopy,通过该类的使用,可以实现一个文件到另一个文件的拷贝功能。为了实现文件的拷贝需要使用get函数读取字符,用put函数写入字符,从而实现逐个字符进行复制。程序要求用户输入源文件名和目标文件
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电子商务产品代理权转让合同(二零二四年度)
- 二零二四年度办公设备采购及维护合同
- 二零二四年度版权兑换合同:文学作品版权交换协议
- 2024年度电站智能化升级改造合同
- 2024年度信息技术平台研发及运营合同
- 2024年体育赛事临时用电柴油发电机组租赁合同
- 2024年度委托合同标的及委托事务处理方式
- 2024年度广告发布合同:品牌宣传推广2篇
- 2024年度城市绿化用肥料采购与长期供应合同2篇
- 二零二四年度个人防护装备涂装协议
- 很全的化妆基础知识课件
- 初中物理人教版《质量》评课稿
- 大同重力储能设备项目可行性研究报告
- 小肽饲料专题
- 国开作业《机电控制与可编程序控制器技术》专题报告(占20%)-2021-5参考535
- 2022年高考日语真题全国卷(word版无答案)
- 桩基及基坑质量通病防治讲义PPT(105页)
- 水的流动沸腾课件
- 前台月度绩效考核表(KPI)
- 新生儿科护理技术操作规范
- 疲劳驾驶与交通安全管理培训(课堂PPT)
评论
0/150
提交评论