基本操作
1.文件打开
// An highlighted block
FILE *fp;
fp=fopen("文件名","打开方式");
//打开方式1.r只读 2.w只写(存在文件覆盖,不存在新建)3.a附加(不存在也新建)
2.文件关闭
// An highlighted block
fclose(fp);
3.读文件
三种方式:1.读取一个字符;2.读取一个字符串;3.读取数据块
// An highlighted block
1.读取一个字符
char ch=fgetc(fp);
2.读取一个字符串
char* str;
fgets(str,20,fp);
//参数:1.读取字符串存放位置 2.字符个数(n-1) 3.文件名
//函数遇到换行符也会结束读入
3.数据块读入
struct student{
char name[10];
int age;
};
struct student stud;
fread(&stud,sizeof(stud),1,fp);
//参数:1.读取数据存放位置 2.单个读取数据大小 3.数据个数 4.文件名
4.写文件
三种方式:1.写一个字符;2.写入一个字符串;3.读取、写入数据块
// An highlighted block
1.写入一个字符
fputc(ch,fp);
2.写入一个字符串
char* str;
gets(str);
fputs(str,fp);
//参数:1.字符串存放位置 2文件名
3.数据块写入
struct student{
char name[10];
int age;
};
struct student stud;
gets(stud.name);
gets(stud.age)
fwrite(&stud,sizeof(stud),1,fp);
//参数:1.数据存放位置 2.单个数据大小 3.数据个数 4.文件名
5.文件的定位
主要有三个操作:1.移动文件位置指针 2.文件位置指针回到开头 3.返回当前位置
// An highlighted block
1.移动指针
fseek(fp,10L,0);
//参数:1.文件名 2.移动字节个数,向文件尾移动(可以为负号,向文件头移动)
//3.从哪里开始移动0:开头 1.当前位置 2.结尾
2.回到开头
rewind(fp);
3.返回当前指针(返回到开头的字节数)
long length =ftell(fp);
文件的增删改
1.文件的修改
例:已知文件中包含学生的:姓名、性别、成绩。给文件中所有女生加五分;
s思路:一次读取一个学生信息,将信息存入变量,对变量修改,在定位到该条数据的开始,进行写入
// An highlighted block
struct student{
char *name[10];
char sex;//取值M、F或者m、f
double score:
}
int main(){
FILE *fp;
struct student stu;
//文件是否正常打开
if((fp=fopen("stu.rec","r+b"))==0){//以二进制 读+写的方式打开
printf("无法打开文件");
exit(0);
}
while(fread(&stu,sizeof(stu),1,fp)==1){//按照数据块读入一个学生信息
if(stu.sex=='f'||stu.sex=='F'){
stu.score+=5;
//处理完数据后,需要将文件指针前移一个单位:因为当前数据已经读完,当前指针位于下一条数据的开始
fseek(fp,-sizeof(stu),1);
//写入修改后数据
fwrite(&stu,sizeof(stu),1,fp);
//为了下一次的读操作,需要对读操作重新定位
fseek(&fp,0,1);
}
}//
fclose(fp);
return 0;
}
2.文件数据的删除
例子:输入一个学生的姓名,将该学生的信息删除
思路:建立一个新文件,顺序读取记录,对于不需要的数据则不存如新文件;
注意字符串的比较
// An highlighted block
struct student{
char *name[10];
char sex;//取值M、F或者m、f
double score:
}
int main(){
FILE *fp,fp_new;
struct student stu;
//文件是否正常打开
if((fp=fopen("stu.rec","r+b"))==0){//以二进制 读+写的方式打开
printf("无法打开文件");
exit(0);
}
if((fp_new=fopen("stu2.rec","wb"))==0){//以二进制 读+写的方式打开
printf("无法创建文件");
exit(0);
}
char name[10];
printf("请输入要删除的学生姓名");
gets(name);
while(fread(&stu,sizeof(stu),1,fp)==1){//按照数据块读入一个学生信息
if(strcmp(&stu.name,name)!=0){
fwrite(&stu,sizeof(stu),1,fp_new);
}
}
fclose(fp);
fclose(fp_new);
remove("stu.rec");
rename("stu.rec","stu2.rec");
return 0;
}
3.文件的追加;
// An highlighted block
1.文件尾部插入
int main(){
FILE *fp,fp_new;
struct student x, stu={"wang",'f','360'};
//文件是否正常打开
if((fp=fopen("stu.rec","r+b"))==0){//以二进制 读+写的方式打开
printf("无法打开文件");
exit(0);
}
fseed(fp,0,2);
fwrite(&stu,sizeof(stu),1,fp);
fclose(fp);
return 0;
}
2.其他位置和删除操作相似,创建新文件,删除位置之前的写入新文件,插入数据写入新文件,插入之后的写入新文件
校对、统计、排序
例子:按照学生的成绩排序,并统计每个成绩的人数,打印如下形式:
//======================================
成绩 人数
233 5
、
、
、
共2000人
// An highlighted block
struct student{
char *name[10];
char sex;//取值M、F或者m、f
double score:
}Stu
void bubbleSort(Stu a[],int n){//升序排序
int i,j;
Stu temp;
for(i=1;i<n;i++){
for(j=0;j<n-i;j++){
if(a[j].score>a[j+1].score){
temp=a[j];a[j]=a[j+1];a[j+1]=temp;
}
}
}
}
int main(){
Stu a[81],b[81];
FILE *fp;
fp=fopen("students.dat","wb");
//学生信息的输入
printf("是否输入学生信息");
char c;int i, num;
scanf("%c",&c);
for(i=0,sum=0;c=='Y';i++,sum++){
printf("请输入姓名");
scanf("%s",&a[i].name);
printf("请输入性别");
scanf("%c",&a[i].sex);
printf("请输入成绩");
scanf("%lf",&a[i].score);
fwrite(&a[i],sizeof(Stu),1,fp);
printf("是否继续输入Y/N");
scanf("%c",&c);
}
fclose(fp);
//读取数据,对数据进行排序,统计
fp=fopen("students.dat","rb");
for(i=0;i<sum;i++){
fread(&b[i],sizeof(Stu),1,fp);
}
fclose(fp);
bubbleSort(b,sum);
int fast=0,low=0,count=1;//双指针进行统计
while(fast<sum){
count=1;low=fast;fast=fast+1;
while(b[fast].score==b[fast-1].score) {count++;fast++}
printf("%lf\t%d",b[low].score,count);
}
printf("共%d人",sum);
}
例子从文本文件student.txt中查询出成绩为成绩为236的第一位同学,打印该同学的信息
文件存储格式:
wang;M;299
li;w;236
liu;M;246
、
、
// An highlighted block
struct student{
char *name[10];
char sex;//取值M、F或者m、f
double score:
}Stu
int main(){
Stu a[81];
FILE *fp;
fp=fopen("students.txt","rt");
int i=0;
double score;char *name;char sex;
while(fscanf(fp,"%s;%c;%d",&a[i].name,&a[i].sex,&a[i].score)!=EOF) i++;
printf("请输入一个成绩");
scanf("%lf",score);
int sum=i,flag=0;//flag用来标记文件是否有
for(i=0;i<sum;i++){
if(a[i].score==score){
flag==1;
break;
}
}
if(flag==1) printf("存在,姓名为%s",a[i].name);
else printf("文件没有这个成绩");
}