(6.48)-第47课(10.4节-文件使用举例)_第1页
(6.48)-第47课(10.4节-文件使用举例)_第2页
(6.48)-第47课(10.4节-文件使用举例)_第3页
(6.48)-第47课(10.4节-文件使用举例)_第4页
(6.48)-第47课(10.4节-文件使用举例)_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

文件使用举例文件操作文件操作小结在使用文件时,首先要定义一个文件指针,如:FILE*fp;然后通过该指针来操作相应的文件通过fopen这个函数,使文件指针fp和相应的文件建立了联系,通过fclose函数将fp和文件的联系切断文件可以以文本的方式打开也可以以二进制方式打开(“b”)从功能角度来说,fread()和fwrite()函数可以完成文件的任何数据读/写操作。但为方便起见,依下列原则选用:以一次一个字符的方式处理文件,需要用fgetc或者fputc函数以一次一行的方式处理文件,可以用函数fgets或者fputs函数整体读/写结构体变量或数组时:选用fread()和fwrite()函数读/写1个(或多个)含格式的数据时:选用fscanf()和fprintf()函数【例1:】将一个磁盘文件中的信息复制到另一个磁盘文件中解题思路从源文件中逐个读入字符,然后逐个输出到目标文件中程序实现#include<stdio.h>#include<stdlib.h>voidmain(){FILE*in,*out;charch,infile[10],outfile[10];//定义两个字符数组,分别存放两个文件名

printf("输入源文件的名字:");scanf("%s",infile);//输入一个要复制的源文件的名字

printf("输入目标文件的名字:");scanf("%s",outfile);//输入一个要复制得到的目标文件的名字

if((in=fopen(infile,"r"))==NULL)//打开源文件

{printf("无法打开此文件\n");exit(0);}if((out=fopen(outfile,"w"))==NULL)//打开目标文件

{printf("无法打开此文件\n");exit(0);}while((ch=fgetc(in))!=EOF)//从源文件中读入一个字符,放在变量ch中,如果未遇到结束标志则循环

{fputc(ch,out);//将ch写到目标文件中

putchar(ch);}

//将ch显示在屏幕上putchar(10);//显示完全部字符后换行

fclose(in);//关闭输入文件

fclose(out);//关闭输出文件

}【例2:】在磁盘文件上存有10个学生的数据。要求将第1,3,5,7,9个学生数据输入计算机,并在屏幕上显示出来解题思路按“二进制只读”的方式打开指定的磁盘文件,准备从磁盘文件中读取学生数据将文件位置指针指向文件中第1,3,5,7,9个学生的数据区的开头,从磁盘文件读入相应学生的信息,并把它显示在屏幕上关闭文件程序实现#include<stdlib.h>#include<stdio.h>structstudent//声明学生数据类型

{charname[10];intnum;charaddr[15];}st[10];voidmain(){inti;FILE*fp;if((fp=fopen("stu.dat","rb"))==NULL)//以只读方式打开二进制文件

{printf("cannotopenfile\n");exit(0);}for(i=0;i<10;i+=2){fseek(fp,i*sizeof(structstudent),0);//移动位置指针,分别定位在第1,3,5,7,9个学生数据位置处

fread(&st[i],sizeof(structstudent),1,fp);//读一个数据块到结构体变量中

printf("%-10s%4d%-15s\n",st[i].name,st[i].num,st[i].addr);//在屏幕上输出

}fclose(fp); }【例3:】声明学生结构体类型,存储学生的学号、姓名和3门课的成绩。函数modi的功能是:从文件中找出指定学号的学生数据,读入此学生数据,对该学生的分数进行修改,使每门课的分数加3分,修改后重写文件中该学生的数据,即用该学生的新数据覆盖原数据,其它学生数据保持不变;若找不到,则不做任何操作。在主函数中将N个学生的数据存入二进制文件student.dat中,先读出文件中的原数据并显示,再调用modi函数修改指定学号的学生数据,重新读出文件中的数据并显示。解题思路除主函数之外,设计三个函数:input();

其功能是将若干个学生信息写入二进制文件中

voidoutput(STUst[]);

其功能是将学生信息从二进制文件中读出并显示在屏幕上voidmodi(char*filename,intsno);

其功能是查找指定学号的学生记录(采用顺序查找算法),如果找到了,修改该学生的相关信息并将其重新写回文件中原来的位置程序实现#include<stdio.h>#defineN5typedefstructstudent//声明结构体类型{intsno;charname[10];floatscore[3];}STU;voidmain(){input();//声明函数原型voidoutput(STUst[]);//声明函数原型voidmodi(char*filename,intsno);//声明函数原型intno;STUt[N]={{10001,"MaChao",91,92,77},{10002,"CaoKai",75,60,88},{10003,"LiSi",85,70,78},{10004,"FangFang",90,82,87},{10005,"ZhangSan",95,80,88}};

output(t);//调用output函数,将若干个学生信息写入二进制文件中

printf(“原始数据为:\n");

input();//调用input函数,将学生信息从二进制文件中读出并显示在屏幕上printf(“\n请输入要查询的学号:\n");scanf(“%d",&no);

modi(“student.dat”,no);//调用modi函数,修改文件中指定学号的学生信息

printf(“\n修改后的数据:\n");

input();//调用input函数,将学生信息从二进制文件中读出并显示在屏幕上}voidmodi(char*filename,intsno){FILE*fp;STUt;inti,flag=0;//变量flag用于标记是否找到指定的学号:0-未找到,1-找到if((fp=fopen(filename,“rb+”))==NULL)//以读写方式打开文件

{printf(“openerror!\n”);return();}while(!feof(fp))

{fread(&t,sizeof(STU),1,fp);//依次读出每条记录if(t.sno==sno)//如果找到指定学号的学生记录,则将flag设置为1并结束查找{flag=1;break;}}if(flag)//如果找到了指定学号的学生记录,则修改其三门课程成绩{for(i=0;i<3;i++)t.score[i]+=3;fseek(fp,-sizeof(STU),SEEK_CUR);//定位读写位置fwrite(&t,sizeof(STU),1,fp);//将修改后的学生记录写回文件中的原位置}fclose(fp);}voidoutput(STUst[])//将若干个学生的信息写入二进制文件中{FILE*fp;fp=fopen("student.dat","wb");if(fp==NULL){printf(“openerror!\n”);return();}fwrite(st,sizeof(STU),N,fp);fclose(fp);}voidinput()//将学生信息从二进制文件中读出并显示在屏幕上{STUss[N];FILE*fp;inti,j;if((fp=fopen("student.dat","rb"))==NULL){printf(“openerror!\n”);return();}fread(ss,sizeof(ST

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论