




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2023/1/311第7章输入输出流7.1C++的输入和输出7.2标准输出流7.3标准输入流7.4文件操作与文件流7.5字符串流2023/1/312【目的要求】1.理解I/O流的概念。2.
熟悉标准输出流。3.
熟悉标准输入流。4.使用流类库进行文件存取的方法。【重点】1.
流类库的概念。2.
文件操作与文件流。【难点】文件流2023/1/3137.1C++的输入和输出7.1.1输入输出的含义程序的输入:指的是从输入文件将数据传送给程序;程序的输出:指的是从程序将数据传送给输出文件。C++的输入与输出包括:(1)标准的输入输出,简称标准I/O。即从键盘输入数据,输出到显示器。(2)文件的输入输出,简称文件I/O。以外存文件为对象的输入输出。(3)字符串输入输出,简称串I/O。对内存中指定的空间进行输入和输出。2023/1/3147.1.2C++的I/O对C的发展——类型安全和可扩展性
在C++的输入输出中,编译系统对数据类型进行严格的检查,凡是类型不正确的数据都不可能通过编译,因此,C++的I/O操作是类型安全的。
C++的I/O操作是可扩展的,不仅可以用来输入输出标准类型的数据,也可以用于用户自定义类型的数据。可扩展性是C++输入输出的重要特点之一,它能提高软件的重要性,加快软件的开发过程。2023/1/3157.1.3C++的输入输出流流是一种抽象,它负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动。
在输入操作时,字节流从输入设备(如键盘、磁盘等)流向内存;在输出操作时,字节流从内存流向输出设备(如屏幕、打印机、磁盘等)。在C++中,输入输出被定义为类。C++的I/O库中的类称为流类,用流定义的2023/1/316对象称为流对象。1.iostream类库中有关的类2023/1/317输入输出流及其文件流见如图所示:输入文件流类输出文件流类通用输入流通用输出流通用输入输出流输入输出文件流类抽象基类2023/1/3182.与iostream类库有关的头文件头文件是程序与类库的接口,iostream类库的接口分别由不同的头文件来实现,常见的有:iostream包含了对输入输出流进行操作所需要的基本信息。fstream用于用户管理的文件的I/O操作。strstream用于字符串流I/O。stdiostream用于混合使用C和C++的I/O机制时,例如想将C程序转变为C++程序。iomanip在使用格式化I/O时应包含此文件。2023/1/319
当用户在自己的程序中用#include命令包含了上述有关的头文件就相当于在本程序中声明了所需要的用到的类。3.在iostream头文件中定义的流对象2023/1/31104.在iostream头文件中重载运算符在iostream头文件中对“<<”和“>>”(原意是:左位移位运算符和右位移位运算符)已经进行了重载,使它们能用作标准类型数据的输入和输出。所以,在用它们的程序中必须用#include命令把iostream包含到程序中:
#include<iostream>7.2标准输出流标准输出流是流向标准输出设备(显示器)的数据。ostream类定义了3个输出流对象,即cout、cerr、clog。2023/1/31111.cout流对象consoleoutput:在控制台(终端显示器)的输出2.cerr流对象consoleerror:在控制台(显示器)显示出错信息3.clog流对象consolelog:在终端显示器上显示出错信息。上面的cerr和clog都是标准出错流,区别:cerr是不经过缓冲区,直接向显示器上输出有关错误信息,而clog中的信息存放在缓冲区中,缓冲区满后或遇到endl时向显示器输出。2023/1/31127.2.2格式输出前面的所有程序在输出数据时,为简单起见,都没有指定输出的格式,由系统根据数据的类型采取默认的格式。如果要数据按指定的格式输出,可以采用:使用格式控制符;使用流对象的有关成员函数。1.使用控制符控制输出格式下表列出了输出数据的控制符。2023/1/31132023/1/3114注意:上表所示的控制符是在头文件iomanip中定义的,因而程序中要使用这些控制符时应当把此文件包含到程序中,即:
#include<iomanip>例7.2用控制符控制输出格式#include<iostream>#include<iomanip>usingnamespacestd;intmain(){inta;
cout<<"inputa:";cin>>a;2023/1/3115cout<<"dec:"<<dec<<a<<endl;//以10进制输出
cout<<"hex:"<<hex<<a<<endl;//以16进制输出
cout<<"oct:"<<setbase(8)<<a<<endl;//以8进制输出
char*pt="China";cout<<setw(10)<<pt<<endl;cout<<setfill('*')<<setw(10)<<pt<<endl;doublepi=22.0/7.0;cout<<setiosflags(ios::scientific)<<setprecision(8);cout<<"pi="<<pi<<endl;cout<<"pi="<<setprecision(4)<<pi<<endl;cout<<"pi="<<setiosflags(ios::fixed)<<pi<<endl;return0;}2023/1/31162.用流对象的成员函数控制输出格式通过流对象cout的成员函数来控制输出格式2023/1/31172023/1/3118例7.3
用流控制成员函数输出数据。#include<iostream>usingnamespacestd;intmain(){inta=21;cout.setf(ios::showbase);//设置输出时的基数符号
cout<<“dec:”<<a<<endl;//默认以10进制输出
cout.unsetf(ios::dec);//终止10进制输出
cout.setf(ios::hex);//设置以16进制输出
cout<<"hex:"<<a<<endl;cout.unsetf(ios::hex);//终止16进制输出2023/1/3119cout.setf(ios::oct);//设置以8进制输出
cout<<"oct:"<<a<<endl;char*pt="China";cout.width(10);//指定域宽为10cout<<pt<<endl;cout.width(10);//指定域宽为10
cout.fill(‘*’);//指定空白处以’*’填充
cout<<pt<<endl;doublepi=22.0/7.0;cout.setf(ios::scientific);//指定科学记数法输出
cout<<"pi=";2023/1/3120cout.width(14);//指定域宽为14cout<<pi<<endl;cout.unsetf(ios::scientific);//终止科学记数法
cout.setf(ios::fixed);//指定用定点形式输出
cout.width(12);//指定域宽为12cout.setf(ios::showpos);//在输出时显示+号
cout.setf(ios::internal);//数符出现在左侧
cout.precision(6);//保留6位小数
cout<<pi<<endl;return0;}2023/1/31217.2.3用流成员函数put输出字符(了解)7.3标准输入流
7.3.1cin流
cin是istream类的对象,它从标准输入设备(键盘)获取数据,程序中的变量通过流提取符“>>”从流中提取数据。流提取符“>>”从流中提取数据时通常跳过输入流中的空格、tab键、换行符等空白字符。
注意:只有在输入完数据再按回车键时,该行数据才被送入键盘缓冲区,形成输入流,提取运算符“>>”才能从中提取数据。当输入流cin处于出错状态时,其值为false2023/1/3122即cin为0值;如果输入流在正常状态,cin的值为ture,即cin的值为一个非0值。例7.5
通过测试cin的值,判断流对象是否处于正常状态。#include<iostream>usingnamespacestd;intmain(){floatgrade;cout<<"entergrade:";2023/1/3123while(cin>>grade)//如果能从cin流读取数据,cin为真,
//执行循环体
{if(grade>=85)cout<<grade<<"GOOD!"<<endl;if(grade<60)cout<<grade<<"fail!"<<endl;cout<<"entergrade:";}cout<<"Theend."<<endl;return0;}2023/1/3124
说明:变量grade从输入流中提取实型数据时,提取操作成功,此时cin流处于正常状态;但在变量grade准备提取一个实型数据时,遇到了字母等其它字符,显然提取操作失败,故程序结束。7.3.2用于字符输入的流成员函数(了解)1.用get函数读入一个字符P235
2.用成员函数getline函数读入一行字符
P2377.3.3istream类的其他成员函数(了解)1.eof函数
P2392.peek函数P2393.putback函数
P2394.ignore函数P2412023/1/31257.4文件操作与文件流
7.4.1文件的概念
前面讲座的输入输出是以系统指定的标准设备为对象的。在实际应用中,常以磁盘文件为对象,即从磁盘读取数据,将数据写入到磁盘文件。
所谓“文件”,指存储在外部介质上数据的集合。对用户来说,常用到的文件分为两大类,一类是程序文件;一类是数据文件。程序中的输入和输出的对象就是数据文件。
根据文件中数据的组织形式,文件又可分为ASCII文件和二进制文件。2023/1/3126
ASCII文件又称为文本文件,它的每一个字节放一个ASCII代码,代表一个字符。二进制文件又称内部格式文件或字节文件,是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。7.4.2文件流类与文件流对象文件流是以外存文件为输入输出对象的数据流。输出文件流是从内存流向外存文件的数据;输入文件流是从外存文件流向内存的数据。每一个文件流都有一个内存缓冲区与之对应。2023/1/3127
在C++的I/O类库中定义了几种文件类,专门用于对磁盘文件的输入输出操作。除了前面已经介绍过的标准输入输出流类istream,ostream和iostream类外,还有3个用于文件操作的文件类:(1)ifstream类,它是从istream类派生的,用来支持从磁盘文件的输入。(2)ofstream类,它是从ostream类派生的,用来支持向磁盘文件的输出。(3)fstream类,它是从iostream类派生的,用来支持对磁盘文件的输入输出。2023/1/3128
要以磁盘文件为对象进行输入输出,必须定义一个文件流类的对象,通过文件流对象将数据从内存输出到磁盘文件,或者通过文件流对象从磁盘文件将数据输入到内存。文件流对象是用文件流类定义的,而不是用istream和ostream类来定义的。可以用下面的方法建立一个输出文件流对象:
ofstreamoutfile;
也可以建立一个输入文件流对象:
ifstreaminfile;
2023/1/3129
虽然上面定义了一个输入或输出流文件对象,但还未指定它向哪一个磁盘文件输入或输出。7.4.3文件的打开与关闭
1.打开磁盘文件打开文件是指在文件读写之前做必要的准备工作,包括:
(1)为文件流对象和指定的磁盘文件建立关联,以便合文件流流向指定的磁盘文件。
(2)指定文件的工作方式,如:该文件是输入文件还是输出文件,是ASCII文件还是二进制文件等2023/1/3130方法一:调用文件流的成员函数open,如:
ofstreamoutfile;
//定义ofstream类(输出文件流类)对象outfile
outfile.open(“a1.dat”,ios::out);
//使文件流与a1.dat文件建立关联调用成员函数open的一般形式为:文件流对象.open(磁盘文件名,输入输出方式);其中,磁盘文件名可以包括路径,如缺省路径,则默认为当前目录下的文件。2023/1/3131方法二:在定义文件流对象时指定参数。
在声明文件流类时定义了带参数的构造函数,其中包含了打开磁盘文件的功能,因此,可以在定义文件流对象时指定参数,调用文件流类的构造函数来实现打开文件的功能。如:
ostreamoutfile(“a1.dat”,ios::out);
一般多用此方法,因为比较方便,其作用与open函数相同。上面两种方法中的输入输出方式见下表所示:2023/1/31322023/1/3133说明:(1)每一个打开的文件都有一个文件指针,该指针的初始位置由I/O方式指定,每次读写都从文件指针的当前位置开始。当文件指针移到最后,就会遇到文件结束EOF(文件结束符也占一个字节,其值为-1),此时流对象的成员函数eof的值为非0值(一般认为1),表示文件结束了。(2)如果打开操作失败,open函数的返回值为0(假),如果是用调用构造函数的方式打开文件,则流对象的值为0。可以据此测试打开是否成功。如:2023/1/3134
if(outfile.open(“a1.dat”,ios::app)==0cout<<“open.error”;或
if(!outfile.open(“a1.dat”,ios::app)) cout<<“open.error”;2.关闭磁盘文件在对已打开的磁盘文件的读写操作完成后,应关闭该文件。关闭文件用成员函数close。如:
outfile.close();
//将输出文件流所关联的磁盘文件关闭2023/1/31357.4.4对ASCII文件的操作对ASCII文件的读写操作可以用以下两种方法:(1)用流插入运算符“<<”和流提取运算符“>>”输入输出标准类型的数据。对磁盘文件的操作,可以通过文件流对象和流插入运算符“<<”和流提取运算符“>>”实现对磁盘的读写,如同用cin,cout和<<,>>对标准设备进行读写一样。(2)用文件流的put,get,getline等成员函数进行字符的输入输出。2023/1/3136例7.11
写入磁盘文件#include<iostream>#include<fstream>usingnamespacestd;intmain(){inta[10];
ofstreamoutfile("f1.dat“,ios::out);//定义文件流对象,打开磁盘文件f1.datif(!outfile)//如果打开失败,outfile返回0值
{cerr<<"openerror!"<<endl;exit(1);}2023/1/3137cout<<"enter10integernumbers:"<<endl;for(inti=0;i<10;i++){cin>>a[i];
outfile<<a[i]<<“”;//向磁盘文件f1.dat输出数据
}outfile.close();//关闭磁盘文件f1.datreturn0;}说明:(1)在VC中调试时必须包含头文件:fstream。2023/1/3138(2)
ofstreamoutfile(“f1.dat“,ios::out);语句中的参数ios::out可以省略,这是默认形式。即下面两种写法等价:
ofstreamoutfile("f1.dat“,ios::out);
ofstreamoutfile("f1.dat“);(3)如果打开成功,则文件流对象outfile的返回值为非0值;如果打开失败,则返回值为0(假)(4)函数exit(1)为系统函数,表示结束运行。其中的参数为任意整数,可用0,1或其他整数(5)
outfile<<a[i]<<“”;就是把标准输出流对象cout换成文件输出流对象outfile而已。2023/1/3139例7.12
读出例7.11的磁盘文件并找出最大数#include<iostream>#include<fstream>usingnamespacestd;intmain(){inta[10],max,i,order;
ifstream
infile("f1.dat",ios::in);
2023/1/3140if(!infile){cerr<<"openerror!"<<endl;
exit(1);}for(i=0;i<10;i++){infile>>a[i];cout<<a[i]<<"";}cout<<endl;max=a[0];order=0;2023/1/3141for(i=1;i<10;i++)if(a[i]>max){max=a[i];order=i;}cout<<"max="<<max<<endl<<"order=“<<order<<endl;
infile.close();return0;}2023/1/31427.4.5对二进制文件的操作二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件。对二进制文件的操作在使用时需要先打开文件,用完后要关闭二进制文件。在打开时要用ios::binary指定为以二进制形式传送和存储。二进制文件除了可以作为输入文件或输出文件外,还可以是既能输入又能输出的文件,这是和ASCII文件不同的地方。2023/1/31431.用成员函数read和write读写二进制文件对二进制文件的读写主要是用istream类的成员函数read和write来实现。这两个成员函数的原型为:
istream&read(char*buffer,intlen);
ostream&write(constchar*buffer,intlen);
其中字符指针buffer指向内存中的一段存储空间,len是读写的字节数。调用的方式为:
a.write(p1,50);
b.read(p2,30);式中的a是输出文件流对象,write函数将字符指针2023/1/3144p1所给出的地址开始的50个字节的内容不加转换地写到磁盘文件中。b是输入流对象,read函数从b所关联的磁盘文件中,读入30个字节,存放在字符指针p2所指的一段空间内。例7.14
将数据以二进制形式存放在磁盘文件中
#include<iostream>#include<fstream>usingnamespacestd;2023/1/3145structstudent{charname[20];intnum;intage;charsex;};intmain(){studentstud[3]={"Li",1001,18,'f',"Fun",1002,19,'m',"Wang",1004,17,'f‘};
ofstream
outfile("stud.dat",ios::binary);2023/1/3146if(!outfile){cerr<<"openerror!"<<endl;
abort();//退出程序
}for(inti=0;i<3;i++)outfile.write((char*)&stud[i],sizeof(stud[i]));outfile.close();return0;}2023/1/3147
说明:程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江苏省扬州市2025年中考道德与法治真题及答案
- 2025年中国主题公寓行业市场运行现状及投资战略研究报告
- 2025年中国电子线圈市场深度调查分析及投资前景研究预测报告
- 静脉输液管理
- 六反相缓冲器行业深度研究分析报告(2024-2030版)
- 趣味培训课件
- 2025年中国风力发电设备市场行情动态分析及发展前景趋势预测报告
- 2025年 云南行测考试试题附答案
- 【可行性报告】2025年电力测量仪表相关行业可行性分析报告
- 2025年 华新镇有关单位招聘考试笔试试题附答案
- 安全检查作业行为规范与专业知识 -改
- 学校信息化建设十五五规划方案
- 2025年保险专业知识能力测试题及答案
- 小学民法典主题班会教案
- 办公软件实操试题及详细答案
- 米粉项目可行性分析报告
- 腰痛中医护理查房
- 八五普法自查自评情况报告
- 竞彩资格考试试题及答案
- esg考试试题及答案
- 电机学II知到智慧树章节测试课后答案2024年秋广东工业大学
评论
0/150
提交评论