实验 13 文件操作
一、 实验学时:2课时
二、 实验目标
1. 掌握文件及缓冲文件系统、文件指针的概念。
2. 学会使用文件打开、关闭、读、写等文件操作函数。
3. 学会用缓冲文件系统对文件进行简单的操作。
三、 实验要求:
1. 备。
在上实验课之前,每一个同学必须将实验的题目、程序编写完毕,做好充分的准
2. 所有实验环节均由每位同学独立完成,严禁抄袭他人实验结果,若发现有结果雷
同者,按实验课考核办法处理。
四、 实验步骤和内容
【启动Visual C++】
【新建工程】
选中【C++ Source File】项,【新建源程序文件】
编辑程序
执行程序
1 编写一个程序,设计一个文件student.bin,其结构如下:
struct student
{
char no[10]; /*学号*/
char name[20]; /*姓名*/
char score[50]; /*成绩*/
}
要求实现学生记录添加、输出、查找(按学号进行)、修改(按学号进行)和删除(按学号进行)等功能。
2 编程要求
1)采用文字提示方式限定用户选择,如:>>1:新添 2:输出 3:查找 4:修改 5:
删除 0:退出 选择:用户输入对应的数字并按回车键后执行相应的功能。
2)用户可以循环操作直到选择退出为止。
3)程序的提示信息均以“>>”开头,运行结果不以“>>”开头。
输入如下代码:
/*
源文件名:ShiYan.c
功能:实现在文件中记录某一门课的成绩信息
*/
#include #include #include /*定义结构体*/ struct student { char no[10]; char name[20]; char score[50]; }; char filename[100]=\"student.bin\"; FILE *fp; void creat(); /*创建函数声明*/ void append(); /*添加函数声明*/ void search(); /*查找函数声明*/ void delete(); /*删除函数声明*/ void modify(); /*修改函数声明*/ void output(); /*输出函数声明*/ void main() { int num; // creat(); /*先创建文件的内容*/ while(1) { printf(\">>单击任意键进入目录......\\n\"); getch(); printf(\" >>***********欢迎使用学生成绩系统***********\\n\\n\"); printf(\" >>* 1.添加记录,请按1 *\\n\"); printf(\" >>* 2.查找记录,请按2 *\\n\"); printf(\" >>* 3.修改记录,请按3 *\\n\"); printf(\" >>* 4.删除记录,请按4 *\\n\"); printf(\" >>* 5.输出记录,请按5 *\\n\"); printf(\" >>* 0.退出系统,请按0 *\\n\"); printf(\">>选择:\"); scanf(\"%d\ if(num>=0&&num<=5) { switch(num) { case 1:append();break; case 2:search();break; case 3:modify();break; case 4:delete();break; case 5:output();break; case 0:exit(1); } printf(\"\\n\\n>>操作完毕,请再次选择!\"); } else printf(\"\\n\\n>>选择错误,请再次选择!\"); } getch(); } /*创建记录*/ void creat() { struct student one; printf(\"\\n>>请输入文件名称:\"); scanf(\"%s\ if((fp=fopen(filename,\"w\"))==NULL) { printf(\"\\n>>对不起,不能建立文件!\"); exit(1); } fprintf(fp,\"%-10s%-20s%-50s\\n\学号\姓名\成绩\"); printf(\"\\n>>请输入学号、姓名及成绩(以0结束)\\n\"); scanf(\"%s\ while(strcmp(one.no,\"0\")) { scanf(\"%s%s\ fprintf(fp,\"%-10s%-20s%-50s\\n\ scanf(\"%s\ } fclose(fp); } /*添加记录*/ void append() { struct student one; if((fp=fopen(filename,\"a\"))==NULL) { printf(\"\\n>>对不起,不能打开文件!\"); exit(1); } printf(\"\\n>>请输入要添加的学号、姓名及成绩\\n\"); scanf(\"%s%s%s\ fprintf(fp,\"%-10s%-20s%-50s\\n\ fclose(fp); } /*查找记录*/ void search() { int k=0; char nokey[10]; struct student one; printf(\"\\n>>请输入学号:\"); scanf(\"%s\ if((fp=fopen(filename,\"rb\"))==NULL) { printf(\"\\n>>对不起,不能打开文件!\"); exit(1); } while(!feof(fp)) { fscanf(fp,\"%s%s%s\\n\ if(!strcmp(nokey,one.no)) { printf(\"\\n\\n>>已查找到,该记录为:\"); printf(\"\\n%-10s%-20s%-50s\ k=1; } } if(!k) printf(\"\\n\\n>>对不起,文件中没有此人的记录。\"); fclose(fp); } /*修改记录*/ void modify() { int k=0; long offset; char nokey[10]; struct student one; printf(\"\\n>>请输入学号:\"); scanf(\"%s\ if((fp=fopen(filename,\"r+\"))==NULL) { printf(\"\\n>>对不起,不能打开文件!\"); exit(1); } while(!feof(fp)) { offset=ftell(fp); fscanf(fp,\"%s%s%s\\n\ if(!strcmp(nokey,one.no)) { k=1; break; } } if(k) { printf(\"\\n\\n>>已查找到,该记录为:\"); printf(\"\\n%-10s%-20s%-50s\ printf(\"\\n>>请输入新的学号、姓名及成绩:\"); scanf(\"%s%s%s\ fseek(fp,offset,SEEK_SET); printf(\"%ld\ fprintf(fp,\"%-10s%-20s%-50s\\n\ } else printf(\"\\n\\n>>对不起,文件中没有此人的记录。\"); fclose(fp); } /*删除记录*/ void delete() { int m,k=0; long offset; char nokey[10]; struct student one; printf(\"\\n>>请输入学号:\"); scanf(\"%s\ if((fp=fopen(filename,\"r+\"))==NULL) { printf(\"\\n>>对不起,不能打开文件!\"); exit(1); } while(!feof(fp)) { offset=ftell(fp); fscanf(fp,\"%s%s%s\\n\ if(!strcmp(nokey,one.no)) { k=1; break; } } if(k) { printf(\"\\n\\n>>已查找到,该记录为:\"); printf(\"\\n%-10s%-20s%-50s\ printf(\"\\n>>确实要删除记录,请按1;不删除记录,请按0:\"); scanf(\"%d\ if(m) { fseek(fp,offset,SEEK_SET); fprintf(fp,\"%-10s%-20s%-50s\\n\ } } else printf(\"\\n\\n>>对不起,文件中没有此人的记录。\"); fclose(fp); } /*输出记录*/ void output() { struct student one; if((fp=fopen(filename,\"r\"))==NULL) { printf(\"\\n>>对不起,不能打开文件!\"); exit(1); } printf(\"\\n\\n%20s\\n\文件\"); while(!feof(fp)) { fscanf(fp,\"%s%s%s\\n\ printf(\"%-10s%-20s%-50s\ } fclose(fp); } 编译、连接、和运行程序。程序运行后,观查屏幕显示结果。 五、 思考题 1. 文件操作函数fscanf()和scanf()区别 2. 文件操作函数fprintf()和printf()区别 六、 实验小结: 因篇幅问题不能全部显示,请点此查看更多更全内容