文件操作相关题目

基本操作

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("文件没有这个成绩")}
  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值