下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第七章 文件 与 结构体,文件是根据特定的目的而收集在一起的有关数据的集合。C+把每一个文件都看成是一个有序的字节流,每个文件都以文件结束标志结束,如果要操作某个文件,程序必须首先打开该文件。当一个文件被打开后,该文件就和一个流关联起来,这里的流实际上是一个字节序列。 C+将文件分为文本文件和二进制文件。二进制文件一般含有特殊的格式或计算机代码,如图像文件和可执行文件等。文本文件则是可以用任何文字处理程序阅读和编辑的简单ASCII文件。 下面我们学习如何编写C+代码来实现对文本文件的输入和输出。,第一节文件操作,C+语言提供了一批用于文件操作的标准函数,本节介绍的文件打开函数fopen和函数f
2、reopen,它们都包含于标准库cstdio中,文件操作基本步骤如下: (1)打开文件,将文件指针指向文件,决定打开文件类型; (2)对文件进行读、写操作; (3)在使用完文件后,关闭文件。,一、重定向版,【命令格式】 FILE * freopen ( const char * filename, const char * mode, FILE * stream ); 【参数说明】 filename: 要打开的文件名 mode: 文件打开的模式,和fopen中的模式(r/w)相同 stream: 文件指针,通常使用标准流文件(stdin/stdout/stderr) 其中stdin是标准输入流
3、,默认为键盘;stdout是标准输出流,默认为屏幕;stderr是标准错误流,一般把屏幕设为默认。通过调用freopen,就可以修改标准流文件的默认值,实现重定向。,【使用方法】 因为文件指针使用的是标准流文件,因此我们可以不定义文件指针。接下来我们使用freopen()函数以只读方式r(read)打开输入文件slyar.in。 格式:freopen(slyar.in, r, stdin); 然后使用freopen()函数以写入方式w(write)打开输出文件slyar.out。 格式:freopen(slyar.out, w, stdout);,接下来的事情就是使用freopen()函数的优
4、点了,我们不再需要修改scanf,printf,cin和cout。而是维持代码的原样就可以了。因为freopen()函数重定向了标准流,使其指向前面指定的文件,省时省力。最后只要使用fclose关闭输入文件和输出文件即可。 格式:fclose(stdin);fclose(stdout); 若要恢复句柄,可以重新打开标准控制台设备文件,只是这个设备文件的名字是与操作系统相关的。 格式:freopen(CON, r, stdin);,代码模版: #include freopen语句,须调用cstdio库 int main() freopen(slyar.in, r, stdin); freopen
5、(slyar.out, w, stdout); /* 中间按原样写代码,什么都不用修改 */ fclose(stdin);fclose(stdout); return 0; ,例7.1从in.txt文件中读入数据,把它们的和保存out.txt文件中。 #include int main() freopen(in.txt,r,stdin); /定义输入文件名 freopen(out.txt,w,stdout); /定义输出文件名 int temp,sum=0; while (scanf(%d, in.txt数据: 1 2 3 4 5 out.txt结果: 15 说明: while (cintem
6、p)和(scanf(%d, int main() FILE *fin,*fout; fin = fopen(in.txt,rb); /定义输入文件名 fout = fopen(out.txt,wb); /定义输出文件名 int temp,sum=0; while (fscanf(fin,%d, ,先声明变量fin和fout(暂且不用管FILE *为何物),把scanf改成fscanf,第一个参数为fin;把printf改成fprintf,第一个参数为fout,最后执行fclose,关闭两个文件。 重定向和fopen两种方法各有优劣。重定向的方法写起来简单、自然,但是不能同时读写文件和标准输入输
7、出;fopen的写法稍显繁琐,但是灵活性比较大(例如可以反复打开并读写文件)。顺便说一句,如 果把fopen版的程序改成读写标准输入输出,只需赋值fin=stdin;fout=stdout;即可,不要调用fopen和fclose。,例7.3程序如下: #include using namespace std; int main() FILE *fin,*fout; fin=stdin; fout=stdout; int temp,sum=0; while (fscanf(fin,%d, ,三、文件输入输出流 在C+中,文件输入流(ifstream)和文件输出流(ofstream)的类,它们的默
8、认输入输出设备都是磁盘文件。+可以在创建对象时,设定输入或输出到哪个文件。由于这些类的定义是在fstream中进行的,因此,在使用这此类进行输入输出操作时,必须要在程序的首部利用#include指令包进fstream头文件。 例如:若想用fin作为输入对象,fout作为输出对象,则可以使用如下定义: ifstream fin(输入文件名.扩展名); ofstream fout(输出文件名.扩展名);,例7.4程序如下: #include /使用文件输入输出流,对cin、cout语句适用 using namespace std; int main() ifstream fin(in.txt);
9、/定义输入文件名 ofstream fout(out.txt); /定义输出文件名 int temp,sum=0; while (fintemp) sum=sum+temp; /从输入文件中读入数据 foutsumendl; fin.close();fout.close(); /关闭文件,可省略 return 0; 如果想再次使用cin和cout,是否要逐个把程序中的所有fin和fout替换为cin和cout?不用这么麻烦,只需要把fin和fout的声明语句去掉,并加上这样两行即可: #define fin cin #define fout cout 用条件编译,还可以让程序在本机上读写标准输
10、入输出,比赛测试时读写文件(请读者自行实验)。,第二节 结构体,在实际问题中,一组数据往往具有不同的数据类型。例如,人口大普查时,我们需要记录每一位公民的姓名,年龄,性别,住址,身份证号码。这些信息分别要用整型,字符型,字符串型来记录。为了解决问题,C+语言给出了另一种构造数据类型“结构体”,它在数据存储方面相当于其他高级语言中的记录,但它有着面向对象的优势。,7.2.1 结构体定义和操作 1. 定义结构体及结构体变量 结构体变量的定义有两种方式: 定义结构体的同时定义结构体变量 struct 结构体名 /其中 struct 是关键字 成员表/可以有多个成员 成员函数/可以有多个成员函数,也可
11、以没有 结构体变量表; /可以同时定义多个结构体变量 结构体变量名列表的各个变量用“,”隔开。 例如: struct DATA int a2; /成员为一个数组 int c; data_a,data_b;,当然,我们也可以先定义结构体再定义结构体变量 struct 结构体名 成员表 成员函数 ; 结构体名 结构体变量表;/同样可以同时定义多个结构体变量 例如: struct DATA int a2; int c; ; DATA data_a,data_b;/这种定义方式与上一种方式的效果是相同的 在定义结构体变量时注意,结构体变量名和结构体名不能相同。在定义结构体时,系统对之不分配实际内存。只
12、有定义结构体变量时,系统才为其分配内存。,2.成员调用 结构体变量与各个成员之间引用的一般形式为: 结构体变量名. 成员名 对于上面定义的结构体变量,我们可以这样操作: cindata_a.a0data_a.a1; /一般情况下不能写 cindata_a; int a=data_a.a0+data_a.a1; /就像用整形变量一样用a0、a1 data_b=data_a;/结构体之间的相互赋值是合法的 data_a.c=0;/就如同给整形变量赋值 实际上结构体成员的操作与该成员类型所具有的操作是一致的。,成员运算符“.”在存取成员数值时使用,其优先级最高,并具有左结合性。在处理包含结构体的结构
13、体时,可记作: strua. strub. membb 这说名结构体变量 strua 有结构体成员 strub;结构体变量 strub 有成员 membb。 3.成员函数调用 结构体成员函数调用的一般形式为: 结构体变量名. 成员函数 结构体成员函数默认将结构体变量作为引用参数。,二、结构体操作实例 例7.5 现在,我们先定义一个简单的结构体,这个结构体将用来记录一个学生的大致情况,所以它的成员应该有学号、姓名、性别、年龄、成绩、家庭住址等。 #include using namespace std; struct student int num;/学号 char name21;/姓名 cha
14、r sex;/性别 int age;/年龄 float score;/成绩 char address51;/家庭住址 ; /此处不可忽略分号 student a,b; int main() a.sexa.agea.scorea.address; b.sexb.ageb.scoreb.address; couta.num a.sex a.age a.score a.addressendl; coutb.num b.sex b.age b.score b.addressendl; return 0; ,例7.6 这
15、里再举出一个的例子,希望读者能够举一反三,从中受益。 #include using namespace std; struct DATA int a2; /成员为一个数组 int c; /用来计算总和 int max() /定义成员函数 return a0a1?a0:a1; /默认该结构体变量的成员作为引用参数 data_a5; /我们可以定义结构体数组 /*结构体的初始化,按成员定义的顺序赋值,每个成员用“,”隔开*/ DATA data_b=15,20,35; /*每个成员初始化和同类型变量初始化方式相同*/,int main() coutdata_ai.a0data_ai.a1; dat
16、a_ai.c=data_ai.a0+data_ai.a1; for (int i=0;i5;+i) coutdata_ai.max() data_ai.cendl; return 0; 程序会先输出: 20 然后等待我们输入10个数,假设输入的数字为: 19 63 25 36 10 12 25 96 36 12 我们将得到如下输出: 63 82 36 61 12 22 96 121 36 48,从上述例子可以看出,结构体支持初始化,定义为数组,成员运算等多种操作。不仅如此,我们还可以通过重载运算符等方法使结构体的操作像int,double一样方便简洁。但由于那些内容过多的涉及面向对象编程,所以
17、在此省去。, ,结构体应用示例-a生日相同问题 Description 在一个有100人的大班级中,存在两个人生日相同的概率非常 大,现给出每个学生的学号,出生月日。试找出所有生日相 同的学生。 Input 第一行为整数n,表示有n个学生,n100。 此后每行包含一个字符串和两个整数,分别表示学生的学号 (字符串长度小于10)和出生月(1=m=12)日(1=d=31)。 学号、月、日之间用一个空格分隔。 Output 对每组生日相同的学生,输出一行, 其中前两个数字表示月和日,后面跟着所有在当天出生的学 生的学号,数字、学号之间都用一个空格分隔。 对所有的输出,要求按日期从前到后的顺序输出。
18、对生日相同的学号,按输入的顺序输出。,#include using namespace std; struct student char ID10; int month; int day; stu100; Int main () int i, j, k, n, flag, count100=0; cinn; for(int i=0; istui.ID stui.month stui.day; for(int m=1; m1) coutm d ; for(k=1; k=j;k +) cout stucountk.ID ; cout endl; return 0; ,枚举类型,枚举, 如果一个变量
19、只有几种可能的取值,则可以将该变量定义为 “枚举类型”。 定义,声明一个枚举数据类型weekday,enum weekday sun, mon, tue, wed, thu, fri, sat; 花括号中sun,mon,sat等称为枚举元素 定义枚举变量: enum weekday workday, weekend;,或,weekday workday, weekend;, 枚举变量赋值: workday = sun; weekend = mon;,枚举类型使用注意事项 1. 枚举元素按常量处理,不能对它们赋值。,sun = mon;,(错误),2. 枚举类型不能直接输出元素的名字. 例如 e
20、num color red, green,white,black; color cloth = red; cout white) count+; 4. 一个整型不能直接赋给一个枚举变量 workday = 2; /错误!, ,枚举类型 枚举元素有值 定义时枚举元素如未指定值,编译系统按定义顺 序取默认值依次为0,1,2,3 也可以给枚举值指定对应值 enum day Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat ; 这时,Sun=7,Mon=1,Tue=2,Wed=3 整数不能直接赋给枚举变量 如:workday = 2;错误!,应先进行强制类型转换如: workday =
21、( enum weekday ) 2;,枚举类型的使用 如何输出枚举型变量的内容 enum color red,green,blue,brown,white,black; enum color choice; switch(choice) case red: cout“redn”; break; case green: cout“greenn”; break; case blue: cout“bluen”; break; case brown: cout“brownn”;break; case white: cout“whiten”; break; case black: cout“black
22、n”; break; ,例7.7 枚举类型应用举例,问题,按计时工资方法计算一周的付费。每周有7个工作日, 周一至周五,按实际工作小时计算,周六工作时间按 实际工作小时的1.5倍计算,周日工作时间按实际工作 小时2.0倍计算。,用户输入,每小时正常应付工资金额, 周一至周日每天的工作时间 程序输出,计算出一周应付的工资。要求周一至周日用枚举类型 表示;,#include using namespace std; int main() enum day Mon,Tue,Wed,Thu,Fri,Sat,Sun; day workday; double times,wages=0,pay,hours
23、; cinpay; for (int i=0;ihours; switch (day) i ) case Sat:times=1.5*hours;break; case Sun:times=2.0*hours;break; default:times=hours; wages=wages+times*pay; coutwagesendl; return 0; , ,共用体 共用体是什么? 为了节省内存空间,可以将几种不同类型的变量 存放到同一段内存单元中,这段内存单元所对应 的数据结构称为共用体。 例如: 一个整型变量、一个字 符型变量、一个实型变 量可以放在同一个地址 开始的内存单元中。,共用体的定义,共用体的定义 union 共用体名 成员列表; 变量表列;,union data int i ; char ch ; float f ; a, b, c; 直接定义,union data int i ; char ch ; float f ; data a,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年青海交通职业技术学院单招职业倾向性测试题库附参考答案详解(预热题)
- 2026年陕西航空职业技术学院单招职业适应性测试题库带答案详解(精练)
- 国家事业单位招聘2023国家海洋技术中心招聘在职人员拟聘人员笔试历年参考题库典型考点附带答案详解
- 2025年中国江西国际经济技术合作有限公司公开招聘44人备考题库及答案详解1套
- 2026年闽江师范高等专科学校单招职业适应性考试题库附参考答案详解(综合卷)
- 2026年陕西省铜川市单招职业倾向性测试题库附答案详解
- 四川省2024年上半年四川省第六地质大队考核招聘工作人员(第二批)笔试历年参考题库典型考点附带答案详解
- 2025年海山乡便民服务中心招聘工作人员的备考题库有答案详解
- 2026年青海建筑职业技术学院单招职业适应性测试题库含答案详解(培优b卷)
- 2026年随州职业技术学院单招职业适应性测试题库附答案详解(达标题)
- 煤矿改扩建项目审批办理流程指南
- 2022年宜春幼儿师范高等专科学校单招笔试职业技能考试试题及答案解析
- GB/T 5286-2001螺栓、螺钉和螺母用平垫圈总方案
- GB/T 41093-2021机床安全车床
- GB/T 25102.1-2010电声学助听器第1部分:具有感应拾音线圈输入的助听器
- 医院运行与医疗业务指标数据统计收集管理规定
- 【高中地理课件】城市的辐射功能 课件 2022-2023学年高二地理人教版(2019)选择性必修二
- 测量管理体系记录表
- 供应商资质能力核实承诺书
- DB5301∕T 23-2019 园林绿化工程验收规范
- 导航学 第1章 导航系统概述
评论
0/150
提交评论