《C语言程序设计第五次(2.10)实验报告(共13页).doc》由会员分享,可在线阅读,更多相关《C语言程序设计第五次(2.10)实验报告(共13页).doc(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上 C语言程序设计 实验报告专业 班级 日期 11月26日 成绩 实验组别 第 3(2.7) 次实验 指导教师 李开 学生姓名 学号 同组人姓名 实验名称 实验10 文件实验 一、实验目的(1)熟悉文本文件和二进制文件在磁盘中的存储方式;(2)熟练掌握流式文件的读写方法。二、实验任务1文件类型的程序验证2源程序修改替换3程序设计三、实验步骤及结果1文件类型的程序验证设有程序:#include void main(void)short a=0x253f,b=0x7b7d;char ch;FILE *fp1,*fp2;fp1=fopen(d:abc1.bin,wb+); f
2、p2=fopen(d:abc2.txt,w+);fwrite(&a,sizeof(short),1,fp1);fwrite(&b,sizeof(short),1,fp1); fprintf(fp2,%hx %hx,a,b); rewind(fp1); rewind(fp2);while(ch = fgetc(fp1) != EOF) putchar(ch);putchar(n);while(ch = fgetc(fp2) != EOF) putchar(ch);putchar(n);fclose(fp1);fclose(fp2);(1) 请思考程序的输出结果,然后通过上机运行来加以验证。运行结
3、果:(2) 将两处sizeof(short)均改为sizeof(char)结果有什么不同,为什么? 运行结果:少了%和原因:在当char的情况下,传入1*sizeof(char)个字节(即1个字节)到&a和&b指向的文件中,比1*sizeof(short)少了一半,所以得到的字符也少了一半,缺失了%和(3) 将fprintf(fp2,%hx %hx,a,b) 改为 fprintf(fp2,%d %d,a,b)结果有什么不同。结果如下:(不同显而易见,一个十六进制,一个十进制)2源程序修改替换将指定的文本文件内容在屏幕上显示出来,命令行的格式为:type filename(1) 源程序中存在什么
4、样的逻辑错误(先观察执行结果)?对程序进行修改、调试,使之能够正确完成指定任务。#include#includevoid main(int argc, char* argv)char ch;FILE *fp;if(argc!=2)printf(Arguments error!n);exit(-1);if(fp=fopen(argv1,r)=NULL) /* fp 指向 filename */printf(Cant open %s file!n,argv1);exit(-1);while(ch=fgetc(fp)!=EOF) /* 从filename中读字符 */ putchar(ch); /*
5、 向显示器中写字符 */fclose(fp); /* 关闭filename */(未将程序名改为type)输出结果如下:#include#includeint main(int argc, char* argv)char ch;FILE *fp;if(argc!=2)printf(Arguments error!n);exit(-1);if(fp=fopen(argv1,r)=NULL) /* fp 指向 filename */printf(Cant open %s file!n,argv1);exit(-1);while(ch=fgetc(fp)!=EOF) /* 从filename中读字符
6、 */ putchar(ch); /* 向显示器中写字符 */fclose(fp); /* 关闭filename */ return 0;(2)用输入输出重定向freopen改写main函数。#include#includeint main(int argc, char* argv) char ch;if(argc!=2)printf(Arguments error!n);exit(-1);if(freopen(argv1,r,stdin)=NULL) /* fp 指向 filename */printf(Cant open %s file!n,argv1);exit(-1);while(ch
7、=getchar()!=EOF)putchar(ch);fclose(stdin); return 0;3程序设计(1)从键盘输入一行英文句子,将每个单词的首字母换成大写字母,然后输出到一个磁盘文件“test”中保存。#include#include#includeint main() int ch; freopen(d:test.txt,w+,stdout);while(ch=getchar()!=EOF) if(isalpha(ch) putchar(toupper(ch); else putchar(ch); return 0;(2) 设计一个通信录管理程序,程序应有以下9个选项: 录入
8、每个联系人的基本信息(至少应有姓名、单位、电话、邮件地址) 从磁盘文件中读取记录到内存 保存记录到磁盘文件 修改记录 插入一条记录 删除一条记录 显示所有的记录 查找某条记录(用二分法) 按姓名对记录升序排序 退出要求:1) 用链表结构;2) 采用结构化程序设计,将每个功能定义成函数; 3) 应有用户界面,提供菜单选项。#include#include#include#define BUFLEN 80#define LEN 20#define N 200struct record char nameLEN+1; char addLEN+1; char telLEN+1; char mailLE
9、N+1;stuN;int k=1,n,m;void readfile();void seek();void modify();void insert();void del();void display();void save();void menu();int main() while(k) menu(); system(pause); return 0;void readfile() char *p=student.dat; FILE *fp; int i=0; if (fp=fopen(d:student.dat,r)=NULL) printf(Open file %s error!,p)
10、; system(pause); exit(0); while(fscanf(fp,%s %s %s %s,stui.name,stui.add,stui.tel,stui.mail)=4) i+; fclose(fp); n=i; printf(录入完毕!n);void seek()int i,item,flag; char s1LEN+1;printf(-n);printf(1.按姓名查询n);printf(2.退出本菜单n);printf(-n);while(1) printf(请选择子菜单编号:); scanf(%d,&item); flag=0; switch(item) case
11、1: printf(请输入要查询的学生的姓名:n); scanf(%s,s1); for(i=0;in;i+) if(strcmp(stui.name,s1)=0) flag=1; printf(姓名,办公地,电话,E-mail 分别为:n); printf(%s %s %s %sn,stui.name,stui.add,stui.tel,stui.mail); if(flag=0) printf(该姓名不存在!n); break; case 2:return; default:printf(请在1-2之间选择n); void modify()int i,item,num; char s1LE
12、N+1,s2LEN+1; printf(请输入要要修改的学生的姓名:n); scanf(%s,s1); for(i=0;in;i+) if(strcmp(stui.name,s1)=0) num=i;printf(-n);printf(1.修改工作地址n);printf(2.修改电话号码n);printf(3.修改E-mail地址n);printf(4.退出本菜单n);printf(-n);while(1) printf(请选择子菜单编号:); scanf(%d,&item); switch(item) case 1: printf(请输入新的工作地址:n); scanf(%s,s2); st
13、rcpy(stunum.add,s2); break; case 2: printf(请输入新的电话号码:n); scanf(%s,s2); strcpy(stunum.tel,s2); break; case 3: printf(请输入新的E-mail地址:n); scanf(%s,s2); strcpy(stunum.mail,s2); break; case 4:return; default:printf(请在1-4之间选择n); save();void insert() int i=n,j,flag; printf(请输入待增加的学生数:n); scanf(%d,&m); do fl
14、ag=1; while(flag) flag=0; printf(请输入第 %d 个学生的姓名:n,i+1); scanf(%s,stui.name); for(j=0;ji;j+) if(strcmp(stui.name,stuj.name)=0) printf(已有该姓名,请检查后重新录入!n); flag=1; break; printf(请输入第 %d 个学生的工作地:n,i+1); scanf(%s,stui.add); printf(请输入第 %d 个学生的电话:n,i+1); scanf(%s,stui.tel); printf(请输入第 %d 个学生的E-mail:n,i+1)
15、; scanf(%s,stui.mail); if(flag=0) i+; while(in+m); n+=m; printf(录入完毕!nn); save();void del() int i,j,flag=0; char s1LEN+1; printf(请输入要删除学生的姓名:n); scanf(%s,s1); for(i=0;in;i+) if(strcmp(stui.name,s1)=0) flag=1; for(j=i;jn-1;j+) stuj=stuj+1; if(flag=0) printf(该姓名不存在!n); if(flag=1) n-; printf(删除成功,显示结果请
16、选择菜单6n); save();void display() int i; printf(所有学生的信息为:n); for(i=0;in;i+) printf(%s %s %s %sn,stui.name,stui.add,stui.tel,stui.mail); void save() int i; FILE *fp; fp=fopen(d:student.dat,w); for(i=0;in;i+) fprintf(fp,%s %s %s %sn,stui.name,stui.add,stui.tel,stui.mail); fclose(fp);void menu(FILE* fp) i
17、nt num; printf( nn简易通讯录nn); printf(*系统功能菜单*n); printf(-n); printf(1.读入学生信息n); printf(2.查询学生信息n); printf(3.修改学生信息n); printf(4.增加学生信息n); printf(5.按学号删除信息n); printf(6.显示当前信息n); printf(7.退出系统n); printf(-n); printf(请选择菜单编号:); scanf(%d,&num); switch(num) case 1:readfile();break; case 2:seek();break; case 3:modify();break; case 4:insert();break; case 5:del();break; case 6:display();break; case 7:k=0;break; default:printf(请在1-7之间选择n); 四、实验体会文件是个应用性很强的功能,这一块相对有趣,但是一定不能大意,对文件的读写操作稍有不慎就会酿成大错,所以一定要小心。专心-专注-专业