版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
输入输出流输入输出流基本概念基本I/O流类重载提取和插入运算符文件
教学内容基本概念教学内容基本概念基本概念输入/输出(I/O):程序与外设之间的数据交换。输入:程序从外设接收字节序列并转换为指定格式数据。输出:程序将数据转换为字节序列输出到外设。C/C++语言没有专门的I/O语句。C语言的编译系统提供I/O函数库,支持I/O操作。C++语言的编译系统提供I/O类库,支持I/O操作。输入/输出(I/O):程序与外设之间的数据交换。13.1基本概念13.1.1字节流字节流数据的字节序列。字符流(文本流)二进制流
将字节流的每个字节按ASCII码字符解释。缺点:在数据传输时需作转换,效率低。优点:因ASCII码是标准的,故字符流可直接编 辑、显示和打印,通行于各类计算机。源程序文件和文本文件都是。将字节流的每个字节按二进制数解释。优点:在数据传输时不做转换,效率高。缺点:因二进制数据在各类计算机中的存放格式 有差异,故其可移植性差,且难以阅读。13.1基本概念13.1.1字节流字节流数据的13.1基本概念13.1.2文件文件:相关数据的字节序列集合。程序、数据、文档常以文件形式存于外存。输入/输出设备具有字节流特征,也是文件。 如:键盘是输入文件,显示器、打印机是输出文件。不同的文件所允许的操作可能不同。
如:磁盘文件可写入/取出;打印机文件只能写入。文件名:为文件取的名字,以别于其它文件。程序可通过文件名来使用文件。文件名通常使用标识符。13.1基本概念13.1.2文件文件:相关数据的13.1基本概念13.1.3缓冲缓冲区:系统在内存中开辟的、用来临时存放输入/输出数
据的区域。缓冲区的作用:提高CPU的使用效率。I/O流分为缓冲流和非缓冲流。缓冲流:仅当缓冲区满或当前送入的数据为新的一行字 符时,才做处理(称为刷新)。较常用。非缓冲流:一旦数据送入缓冲区,立即处理。13.1基本概念13.1.3缓冲缓冲区:系统在内基本I/O流类基本I/O流类13.2基本I/O流类C++的I/O操作是以流的形式实现的。在数据从一个对 象流动到另一个对象的过程中,无论是否对数据进行缓 冲或对数据进行格式变换,这种流动都被抽象为流(程 序员与程序所访问的设备之间的一个统一的接口,使程 序的输入输出设计尽可能地与具体设备无关)。13.2基本I/O流类C++的I/O操作是以流的13.2基本I/O流类流在使用前要被建立,在使用后要被删除,使用特定的操 作能从流中获取数据或向流中添加数据。从流中获取数据 操作称为提取操作,向流中添加数据的操作称为插入操作。C++系统提供了一个用于输入/输出操作的类体系:类体系提供了对预定义类型进行输入/输出操作的能力;程序员可利用这个类体系进行自定义类型的I/O出操作。13.2基本I/O流类流在使用前要被建立,在使用后要被类istream和ostream的公有派生类,并未增加新成员,支持输入和输出操作。类ios的公有派生类,提供输入操作。类ios的公有派生类,提供输出操作。虚基类提供流的格式化I/O和出错处理,并通过指向类streambuf的对象的指针成员来管理流缓冲区。
提供对流的缓冲支持。对文件进行提取和插入操作对文件进行提取和插入操作对文件进行提取和插入操作对文件进行提取和插入操作对文件进行提取和插入操作从序列中取字符或将字符放入序列中13.2基本I/O流类公共基类公共基类类istream和ostream的公有派生类,类13.2基本I/O流类13.2.1预定义的标准流对象预定义的标准流对象:cin、cout、cerr、clog。cin为标准输入流对象,用来处理标准输入即键盘输入。cout为标准输出流对象,用来处理标准输出即屏幕输出。
cerr为标准错误输出流对象,无缓冲。clog为标准错误输出流对象,有缓冲。
例:cout是ostream流类的对象,它在iostream.h头文件 中作为全局对象定义:ostreamcout(stdout);13.2基本I/O流类13.2.1预定义的标准流对#include<iostream>usingnamespacestd;voidmain(){
floata,b; cerr<<"请输入a和b的值:"<<endl; cin>>a>>b;
if(b) cout<<a<<'/'<<b<<'='<<a/b<<endl; else cerr<<"除数为零!"<<endl;}13.2基本I/O流类13.2.1预定义的标准流对象friend
ostream&operator<<(ostream&,char*)friend
istream&operator>>(istream&,float)friend
ostream&operator<<(ostream&,float)#include<iostream>13.2基本I/13.2基本I/O流类13.2.2I/O流的状态检测检测I/O流操作状态的I/O流类的成员函数:intrdstate():读取I/O状态字。intbad():若非法操作,返回非零,否则返回0。voidclear(int=0):清除流中的错误。inteof():到文件尾,返回非零,否则返回0。intfail():I/O操作错,返回非零,否则返回0。intgood():I/O操作正常,返回非零,否则返回0。在I/O操作后,应及时检测是否发生I/O错误。在处理I/O 错误后,应使用clear函数清除流中的错误,以便进行后 续I/O操作。13.2基本I/O流类13.2.2I/O流的状态检重载提取和插入运算符重载提取和插入运算符回顾#include<iostream>usingnamespacestd;voidmain(){ floatX,Y; cin>>X>>Y; cout<<X<<','<<Y<<endl; cout<<"ABCDEF"<<endl;}12↙1,2ABCDEF回顾#include<iostream>12↙13.3重载提取和插入运算符#include<iostream>usingnamespacestd;classPoint{
floatX,Y;public: Point(floatx=0,floaty=0){X=x;Y=y;}};voidmain(){
Pointp1,p2; cout<<p1<<p2<<endl;}nooperatordefinedwhichtakesaright-handoperandoftype'classPoint'(orthereisnoacceptableconversion)13.3重载提取和插入运算符#include<ios13.3重载提取和插入运算符#include<iostream>usingnamespacestd;classPoint{
floatX,Y;public: Point(floatx=0,floaty=0){X=x;Y=y;}};ostream&operator<<(ostream&os,Point&p){ os<<p.X; os<<p.Y;
returnos;}voidmain(){
Pointp1,p2; cout<<p1<<p2<<endl;}cannotaccessprivatememberdeclaredinclass'Point'13.3重载提取和插入运算符#include<ios13.3重载提取和插入运算符#include<iostream>usingnamespacestd;classPoint{public:
floatX,Y; Point(floatx=0,floaty=0){X=x;Y=y;}};ostream&operator<<(ostream&os,Point&p){ os<<p.X; os<<p.Y;
returnos;}voidmain(){
Pointp1,p2; cout<<p1<<p2<<endl;}运行结果:000013.3重载提取和插入运算符#include<ios13.3重载提取和插入运算符#include<iostream>usingnamespacestd;classPoint{
floatX,Y;public: Point(floatx=0,floaty=0){X=x;Y=y;} ostream&operator<<(ostream&os,Point&p) { os<<p.X; os<<p.Y;
returnos; }};voidmain(){
Pointp1,p2; cout<<p1<<p2<<endl;}'operator<<'hastoomanyparameters13.3重载提取和插入运算符#include<ios13.3重载提取和插入运算符#include<iostream>usingnamespacestd;classPoint{
floatX,Y;public: Point(floatx=0,floaty=0){X=x;Y=y;}
friendostream&operator<<(ostream&os,Point&p) { os<<p.X; os<<p.Y;
returnos; }};voidmain(){
Pointp1,p2; cout<<p1<<p2<<endl;}运行结果:000013.3重载提取和插入运算符#include<ios13.3重载提取和插入运算符例13.2:重载提取和插入运算符,直接输入/输出对象。
#include<iostream>usingnamespacestd;classPoint{
floatX,Y;public: Point(floatx=0,floaty=0){X=x;Y=y;}
friendistream&operator>>(istream&,Point&);
friendostream&operator>>(ostream&,Point&);};voidmain(){
Pointp1,p2; cout<<"请输入两点坐标:"; cin>>p1>>p2; cout<<p1<<','<<p2<<endl;}istream&operator>>(istream&is,Point&p){ is>>p.X>>p.Y; returnis;}ostream&operator<<(ostream&os,Point&p){ ps<<'('<<p.X<<','<<p.Y<<')';
returnos;}运行结果:
1234↙12,3413.3重载提取和插入运算符例13.2:重载提取和插入标准流只能直接输入/输出基本类型的数据,自定义类型的数 据只有转化成基本类型的数据后才可使用标准流。直接输入/输出类类型的数据,需重载“<<”和“>>”运算符。重载提取运算符的格式:
friendistream&operator>>(istream&,ClassName&);重载插入运算符的格式:
friendostream&operator<<(ostream&,ClassName&);因左操作数非本类ClassName的对象,故该运算符只能重载为类的友元。返回值类型必须是istream&
以便续做“>>”运算。13.3重载提取和插入运算符标准流只能直接输入/输出基本类型的数据,自定义类型的数因左文件文件13.4文件根据对字节内容的不同解释,文件可分为:
文本文件(ASCII码文件):每个字节为字符。二进制文件:每个字节为二进制数据。 例:10000若解释为short类型数据,则占2个字节。 若解释为字符数据,则占5个字节。文件流类:
ifstream:输入文件流类,用于文件输入;ofstream:输出文件流类,用于文件输出;fstream:输入/输出文件流类,用于文件输入/输出。文件流对象:与预定义的标准流对象相似。区别在于:文件流对象需用户定义后方可使用。文件流对象可与用户指定的文件关联。13.4文件根据对字节内容的不同解释,文件可分为:文件流对象的成员函数13.4文件13.4.1文件流的用法包含头文件ifstream、ofstream或fstream。建立流,即声明一个文件流对象。
例:ofstreamout;
ifstreamin;
fstreamiofile;用open()函数或构造函数,打开指定文件。
例:out.open("f1.txt");//使文件f1.txt与流对象out相联系。用文件流对象的提取、插入运算符或成员函数读写文件。
例:in>>ch;文件使用结束,用open()函数关闭文件。
例:in.close();文件流对象的成员函数文件流对象13.4文件13.4.1文件流的用法文件的打开方式:缺省值:输入文件流:ios_base::in输出文件流:ios_base::out|ios_base::trunc输入输出文件流:ios_base::in|ios_base::out13.4文件13.4.2文件的打开用文件流类的成员函数open()打开文件:
open()函数原型:
voidopen(const
unsignedchar*filename,
intios_base::openmodemode,
intaccess=filebuf::openprot);指定文件名:
可含盘符和路径如:d:\\t\\f1.dat文件的访问方式:0 普通文件只读文件隐含文件4 系统文件8 备份文件文件的打开方式:13.4文件13.4.2文件的打开作用方式二进制方式打开文件。与输入或输出方式组合使用。ios_base::binary清空文件。单用时与ios_base::out等价ios_base::trunc输出方式打开文件。若文件不存在,则产生一新文件;若存在,则清空文件。
ios_base::out输入方式打开文件。若文件不存在,则打开出错。ios_base::in添加输出方式打开文件后,文件指针最
初指向文件尾,但随后可改变指向。ios_base::ate追加输出方式打开文件后,文件指针始终指向文件尾,所有输出写入文件尾。若文件不存在,则产生一个新文件。ios_base::app表13-1文件的打开方式文件指针初值文件尾文件尾0文件头000作用方式二进制方式打开文件。与输入或输出方ios_ba文件打开方式说明:
若不矛盾,则可用位或运算“|”将几种打开方式组合使用。不以二进制方式打开的文件,都是文本文件。文件指针从0开始连续编号(0代表文件头),以字节为单 位,用于指示文件的读
/
写位置。文件每读
/
写一个字节,文 件指针就后移一个字节。文件指针的初值由文件打开方式指 定。若文件打开方式含ios_base::app或ios_base::ate,则文 件指针指向文件尾,否则指向文件头。13.4文件13.4.2文件的打开文件打开方式说明:13.4文件13.4.2文件的13.4文件13.4.2文件的打开用文件流类的构造函数打开文件:
文件流类ifstream、ofstream、fstream的构造函数所带参 数与其成员函数open()所带参数完全相同。因此,在说 明这三种文件流类的对象时,通过调用各自的构造函数, 也能打开文件。读方式打开文件:ifstream
f1("file1.dat");写方式打开文件:ofstream
f2("file2.txt");读方式打开文件:fstream
f3("file3.dat",ios_base::in); 等价于:fstream
f3; f3.open("file3.dat",ios_base::in);13.4文件13.4.2文件的打开用文件流类的构因在ios类中重载了取反运算符“!”:intios::operator!(){returnfail();}这样,若文件打开成功,则“!f1”为0,否则为非0。此处亦可用f1.fail()。13.4文件13.4.2文件的打开文件打开与否的判断:
文件打开后,应判断打开是否成功。若不成功,则后续的文 件读
/
写操作就没有实际意义。
例:ifstream
f1("C:\\my\\file.dat");
if(!f1) {cout<<"不能打开文件:C:\\my\\file.dat\n");
exit(1); }因在ios类中重载了取反运算符“!”:13.4文件13.4文件13.4.3文件的关闭用文件流对象的析构函数关闭文件: 在文件流对象被撤消时系统自动调用析构函数关闭仍打开 的文件。用文件流对象的成员函数close()关闭文件: 例:ifstreaminfile("f1.dat");
infile.close();及时关闭文件的好处:及时释放文件流对象所占资源。使一个文件流对象可分时与多个文件关联。使有限的可同时打开的文件总数得到充分利用。13.4文件13.4.3文件的关闭用文件流对象的13.4文件13.4.4文本文件的使用通过提取运算符“>>”和插入运算符“<<”读写文件。
文件流ifstream、ofstream、fstream对文件的操作是通过 调用其基类的成员函数实现的,因此,文件流对象的基本 操作与标准流对象的操作相同。
13.4文件13.4.4文本文件的使用通过提取运in>>ch的返回值为in,成为while语句的条件。因不是基本类型数据,无法直接运算,除非做类型转换。ios类仅重载了一个类型转换函数:
operatorvoid*(){returnfail()?0:this;}隐式类型转换:(void*)in→fail()?0:this例13.3:复制源文件到目标文件。#include<iostream>#include<fstream>usingnamespacestd;
voidmain(){ charch,f1[256],f2[256]; cout<<"源文件名?"; cin>>f1; cout<<"目标文件名?"; cin>>f2;
ifstream
in(f1);
ofstream
out(f2);
if(!in){cout<<"\n不能打开源文件:"<<f1; return1;}
if(!out){cout<<"\n不能打开目标文件:"<<f2;return1;} in>>noskipws;
while(in>>ch) out<<ch;
in.close(); out.close();}in>>ch的返回值为in,成例13.3:复制源文件到目例13.4:设文本文件data.txt中有若干实数,每个实数之间用空 格或换行符隔开。求出文件中的这些实数的平均值。#include<iostream>#include<fstream>usingnamespacestd;
intmain(){ floatsum=0,t;
intcount=0;
ifstream
in("data.txt");
if(!in){cout<<"不能打开输入文件:\n"; return1;}
while(in>>t) sum+=t,count++;
cout<<"实数的平均值="<<sum/count <<",实数的个数="<<count<<endl;
in.close();
return0;}例13.4:设文本文件data.txt中有若干实数,每个实数13.4文件13.4.5二进制文件的使用用二进制文件方式读
/写数据时,数据不做变换直接传送。
二进制文件的读/写操作:使用读/写字符的文件流的成员函数。使用文件流的成员函数read()和write()。成员函数read()的原型:
istream&istream::read(char*t,intn); istream&istream::read(unsignedchar*t,intn); istream&istream::read(signedchar*t,intn);成员函数write()的原型: istream&istream::write(char*t,intn); istream&istream::write(unsignedchar*t,intn); istream&istream::write(signedchar*t,intn);功能:从二进制文件中读取n个字节数据到t指针所指内存。功能:将t所指内存的前
n个字节数据写入二进制文件。13.4文件13.4.5二进制文件的使用用二进制例13.5:将1~50之间的所有偶数存入二进制文件data.dat中。#include<iostream>#include<fstream>usingnamespacestd;
intmain(){ ofstream
out("data.dat",
ios_base::out|ios_base::binary);
if(!out){cout<<"不能打开data.dat:\n";return1;}
for(inti=2;i<50;i+=2) out.write((char*)&i,sizeof(int)); out.close(); return1;}例13.5:将1~50之间的所有偶数存入二进制文件data例13.6:从例13.5产生的数据文件data.dat中读取二进制数据, 按每行10个数的形式显示。
#include<iostream>#include<fstream>usingnamespacestd;
intmain(){ ifstream
in("data.dat",
ios_base::in|ios_base::binary);
if(!in){cout<<"不能打开data.dat:\n";return1;}
for(inta,i=1;
in.read((char*)&a,sizeof(int));i++) { cout<<a<<'\t';
if(i%10==0) cout<<endl; } in.close(); return1;}例13.6:从例13.5产生的数据文件data.dat中13.4文件13.4.5二进制文件的使用随机读写文件的函数:
顺序读写:按先后顺序读/写文件中的数据。随机读写:从文件的任何指定位置读/写数据,主要用于 二进制文件。随机读/写的前提是移动文件指针。
移动输入流文件指针的成员函数: istream&seekg(streampos); //参考点为文件头 istream&seekg(streamoff,ios::seek_dirdir);
文件指针移动:设有二进制输入文件流对象f。 f.seekg(-50,ios::cur)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年常德科技职业技术学院单招职业技能测试题库含答案详解(培优)
- 2026年广西制造工程职业技术学院单招综合素质考试题库参考答案详解
- 2026年广西安全工程职业技术学院单招职业倾向性测试题库含答案详解(突破训练)
- 2026年广西工业职业技术学院单招职业技能测试题库带答案详解(精练)
- 2026年广州城建职业学院单招综合素质考试题库附答案详解(b卷)
- 2026年广东科贸职业学院单招职业倾向性考试题库附参考答案详解(研优卷)
- 2026年广西城市职业大学单招职业技能测试题库及答案详解(各地真题)
- 2026年广州民航职业技术学院单招职业适应性测试题库含答案详解(轻巧夺冠)
- 2026年嵩山少林武术职业学院单招综合素质考试题库带答案详解(新)
- 2026年广东省惠州市单招职业适应性测试题库附参考答案详解ab卷
- 泌尿外科品管圈
- 《准备单元雪地上的“足迹”》教学课件
- (正式版)JBT 14682-2024 多关节机器人用伺服电动机技术规范
- 心理健康家庭教育指导活动
- 2023年6月新高考天津卷英语试题真题及答案解析(精校打印版)
- 红楼梦林黛玉进贾府原文朗读
- 生命的起源与早期演化课件
- 上海市市西中2024学年高三下学期精英联赛英语试题含解析
- 2023年全国高校体育单招考试英语试卷试题及答案详解1
- 满族文化-大学课件
- GB/T 38119-2019邵氏硬度计的检验
评论
0/150
提交评论