- 1.09 MB
- 2022-04-29 14:27:03 发布
- 1、本文档共5页,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
- 文档侵权举报电话:19940600175。
'C++NOIP竞赛7
第一节 文件操作C++语言提供了一批用于文件操作的标准函数,本节介绍的文件打开函数fopen和函数freopen,它们都包含于标准库cstdio中,文件操作基本步骤如下:(1)打开文件,将文件指针指向文件,决定打开文件类型;(2)对文件进行读、写操作;(3)在使用完文件后,关闭文件。
一、重定向版【命令格式】FILE*freopen(constchar*filename,constchar*mode,FILE*stream);【参数说明】filename:要打开的文件名mode:文件打开的模式,和fopen中的模式(r/w)相同stream:文件指针,通常使用标准流文件(stdin/stdout/stderr)其中stdin是标准输入流,默认为键盘;stdout是标准输出流,默认为屏幕;stderr是标准错误流,一般把屏幕设为默认。通过调用freopen,就可以修改标准流文件的默认值,实现重定向。
例7.1 从in.txt文件中读入数据,把它们的和保存out.txt文件中。#includeintmain(){freopen("in.txt","r",stdin);//定义输入文件名freopen("out.txt","w",stdout);//定义输出文件名inttemp,sum=0;while(scanf("%d",&temp)==1)//(cin>>temp)从输入文件中读入数据//在C++中非0为真{sum=sum+temp;}printf("%dn",sum);//cout<>temp)和(scanf("%d",&temp)==1)主要是用于判断数据是否已经读完,以便及时终止循环。还可以用成员函数eof来判断是否达到数据流的末尾。对scanf、printf和cin、cout语句都适用。
二、fopen版重定向用起来很方便,但并不是所有算法竞赛都允许读写文件。甚至有的竞赛允许访问文件,但不允许使用freopen这样的重定向方式读写文件,可以使用fopen版,对scanf和printf语句适用。程序如下:例7.2#includeusingnamespacestd;intmain(){FILE*fin,*fout;fin=fopen("in.txt","rb");//定义输入文件名fout=fopen("out.txt","wb");//定义输出文件名inttemp,sum=0;while(fscanf(fin,"%d",&temp)==1)//从输入文件中读入数据{sum=sum+temp;}fprintf(fout,"%dn",sum);//cout<usingnamespacestd;intmain(){FILE*fin,*fout;fin=stdin;fout=stdout;inttemp,sum=0;while(fscanf(fin,"%d",&temp)==1)//从输入文件中读入数据{sum=sum+temp;}fprintf(fout,"%dn",sum);return0;}
三、文件输入输出流在C++中,文件输入流(ifstream)和文件输出流(ofstream)的类,它们的默认输入输出设备都是磁盘文件。C++可以在创建对象时,设定输入或输出到哪个文件。由于这些类的定义是在fstream中进行的,因此,在使用这此类进行输入输出操作时,必须要在程序的首部利用#include指令包进fstream头文件。例如:若想用fin作为输入对象,fout作为输出对象,则可以使用如下定义:ifstreamfin("输入文件名.扩展名");ofstreamfout("输出文件名.扩展名");
例7.4程序如下:#include//使用文件输入输出流,对cin、cout语句适用usingnamespacestd;intmain(){ifstreamfin("in.txt");//定义输入文件名ofstreamfout("out.txt");//定义输出文件名inttemp,sum=0;while(fin>>temp)sum=sum+temp;//从输入文件中读入数据fout<>data_a.a[0]>>data_a.a[1];//一般情况下不能写cin>>data_a;inta=data_a.a[0]+data_a.a[1];//就像用整形变量一样用a[0]、a[1]data_b=data_a;//结构体之间的相互赋值是合法的data_a.c=0;//就如同给整形变量赋值实际上结构体成员的操作与该成员类型所具有的操作是一致的。
成员运算符“.”在存取成员数值时使用,其优先级最高,并具有左结合性。在处理包含结构体的结构体时,可记作:strua.strub.membb这说名结构体变量strua有结构体成员strub;结构体变量strub有成员membb。3.成员函数调用结构体成员函数调用的一般形式为:结构体变量名.成员函数结构体成员函数默认将结构体变量作为引用参数。
二、结构体操作实例例7.5现在,我们先定义一个简单的结构体,这个结构体将用来记录一个学生的大致情况,所以它的成员应该有学号、姓名、性别、年龄、成绩、家庭住址等。#includeusingnamespacestd;structstudent{intnum;//学号charname[21];//姓名charsex;//性别intage;//年龄floatscore;//成绩charaddress[51];//家庭住址};//此处不可忽略分号studenta,b;intmain(){cin>>a.num>>a.name>>a.sex>>a.age>>a.score>>a.address;cin>>b.num>>b.name>>b.sex>>b.age>>b.score>>b.address;cout<usingnamespacestd;structDATA{inta[2];//成员为一个数组intc;//用来计算总和intmax()//定义成员函数{returna[0]>a[1]?a[0]:a[1];//默认该结构体变量的成员作为引用参数}}data_a[5];//我们可以定义结构体数组/*结构体的初始化,按成员定义的顺序赋值,每个成员用“,”隔开*/DATAdata_b={{15,20},35};/*每个成员初始化和同类型变量初始化方式相同*/
intmain(){cout<>data_a[i].a[0]>>data_a[i].a[1];data_a[i].c=data_a[i].a[0]+data_a[i].a[1];}for(inti=0;i<5;++i)cout<usingnamespacestd;structstudent{charID[10];intmonth;intday;}stu[100];Intmain(){inti,j,k,n,flag,count[100]={0};cin>>n;for(inti=0;i>stu[i].ID>>stu[i].month>>stu[i].day;for(intm=1;m<=12;m++)for(intd=1;d<=31;d++){flag=0;j=0;for(inti=0;i1){cout<white)count++;4.一个整型不能直接赋给一个枚举变量workday=2;//错误!
枚举类型枚举元素有值定义时枚举元素如未指定值,编译系统按定义顺序取默认值依次为0,1,2,3…也可以给枚举值指定对应值enumday{Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat};这时,Sun=7,Mon=1,Tue=2,Wed=3……整数不能直接赋给枚举变量如:workday=2;错误!应先进行强制类型转换如:workday=(enumweekday)2;
枚举类型的使用如何输出枚举型变量的内容enumcolor{red,green,blue,brown,white,black};enumcolorchoice;switch(choice){casered:cout<<“redn”;break;casegreen:cout<<“greenn”;break;caseblue:cout<<“bluen”;break;casebrown:cout<<“brownn”;break;casewhite:cout<<“whiten”;break;caseblack:cout<<“blackn”;break;}
例7.7枚举类型应用举例问题按计时工资方法计算一周的付费。每周有7个工作日,周一至周五,按实际工作小时计算,周六工作时间按实际工作小时的1.5倍计算,周日工作时间按实际工作小时2.0倍计算。用户输入每小时正常应付工资金额周一至周日每天的工作时间程序输出计算出一周应付的工资。要求周一至周日用枚举类型表示;
#includeusingnamespacestd;intmain(){enumday{Mon,Tue,Wed,Thu,Fri,Sat,Sun};dayworkday;doubletimes,wages=0,pay,hours;cin>>pay;for(inti=0;i<7;i++){cin>>hours;switch((day)i){caseSat:times=1.5*hours;break;caseSun:times=2.0*hours;break;default:times=hours;}wages=wages+times*pay;}cout<#includeusingnamespacestd;intmain(){struct{stringname;stringnum;charsex;charjob;union{chargrade[5];charposition[5];}p;//定义了一个共同体变量}person[2];//定义了一个结构体数组变量inti=0;cout<<"nametnumtsextjobtclass/position"<>person[i].name>>person[i].num>>person[i].sex>>person[i].job;if(person[i].job=="s")cin>>person[i].p.grade;elsecin>>person[i].p.position;}i=0;cout<<"===========showdata==========="<
您可能关注的文档
- 最新bennett骨折(1)课件PPT.ppt
- 最新Blood-Gas-Measurements血液气体测量课件PPT.ppt
- 最新BLDC以及霍尔位置传感器驱动设计..课件PPT.ppt
- 最新BIOS修改设计的基础性教程课件PPT.ppt
- 最新Book-1-Module-5-基础知识课件PPT.ppt
- 最新Book-2-Module-5-作业评讲课件PPT.ppt
- 最新Bone Resorption and RANK Ligand Inhibition:骨吸收和抑制RANK配体课件PPT.ppt
- 最新Book7unit2reading公开课课件PPT.ppt
- 最新BP神经网络PPT课件PPT.ppt
- 最新C++学期末复习资料课件PPT.ppt
- 最新C++从入门到精通教学ppt课件PPT.ppt
- 最新B超影像尿动力学评估子宫颈癌手术后膀胱尿道的功能【医疗课件】课件PPT.ppt
- 最新C6 胆碱受体激动药 毛果芸香碱(匹鲁卡因) 选择性激动M受体,对 …课件PPT.ppt
- 最新CAD绘图教程培训讲义建筑立面图绘制课件PPT.ppt
- 最新CAD说课课件PPT.ppt
- 最新Cart肿瘤免疫疫苗对于血液实体肿瘤探究进展课件PPT.ppt
- 最新CAN接口要点课件PPT.ppt
- 最新CC2530的中断系统和定时器原理课件PPT.ppt