C语言文件操作总结

目录

字符方式读入文件

数据块方式读写文件

文件定位与随机读写

文件中数据的修改


字符方式读入文件

1.向文件中写入(输入字符)

        用 fputc 函数或 puts 函数可以把一个字符写到磁盘文件中去。

int fputc(int ch,FILE * fp)

        ch 是要输出的字符,他可以是一个字符常量,也可以是一个字符变量;fp是文件指针变量,已经指向了一个由fopen函数打开的文件。

        功能:fputc(ch,fp)函数将字符输入到fp所指向的流式文件中去。如果输出成功,返回值就是输入的字符,失败则返回EOF。

从键盘输入遗传字符,以回车符\n结束,然后输入到磁盘文件中去

#include
#include
int main()	
{
	//从键盘输入遗传字符,以回车符\n结束,然后输入到磁盘文件中去
	FILE * fp;
	char ch;
	if((fp=fopen("output1.txt","w"))==NULL)
	{
		printf("无法创建文件!");
		exit(0); 
	}
	while((ch=getchar())!='\n')
	{
		fputc(ch,fp);
	}
	fclose(fp);
	return 0;
}

2.从文件中读出一个字符

        用 fgetc 函数或者 getc 函数可以从磁盘中读出一个字符。

int fgetc(FILE * fp)

        从磁盘文键逐个读入字符,并在终端输出

#include
#include
int main()
{
	//从磁盘文键逐个读入字符,并在终端输出
	FILE * fp;
	char ch;
	if((fp=fopen("output1.txt","r"))==NULL)
	{
		printf("无法打开文件!\n");
		exit(0);	
	} 
	while((ch=fgetc(fp))!=EOF)
	{
		putchar(ch);
	}
	fclose(fp);
	return 0;
}

3.向文件中写入一个字符串

        用 fputs 函数可以把一个字符串输入到指定的流式文件中,其原型为

int fputs(char * fp,FILE * stream)

        其中,string为字符串,stream为文件指针。

 把指针string所指向的字符串输出到文件指针stream所指向的文件中,但字符串结束符‘\0’不输出

 从键盘输入若干行字符,把他们输出到磁盘文件中保存起来。

#include
#include
int main()
{
	//从键盘输入若干行字符,把他们输出到磁盘文件中保存起来。
	FILE * fp;
	char string[81];
	if((fp=fopen("data.txt","w"))==NULL)
	{
		printf("未找到此文件!");
		exit(0);	
	} 
	while(gets(string)!=NULL)//ctrl+Z结束 
	{
		fputs(string,fp);
		fputc('\n',fp);//在每个字符串后加一个换行符 
	}
	fclose(fp);
	return 0;
}

数据块方式读写文件

使用数据块的方式对二进制问价进行读写操作,涉及的函数有两个:fread() 和 fwrite() 。

建立学生档案文件,每个记录包括学生的姓名,性别,年龄和入学总分 

#include
#include
struct student
{
	char name[10];
	char sex;
	int age;
	float score;
};
int main()
{
	FILE * fp;
	struct student stud;
	char str[80],ch='y';
	if((fp=fopen("stud2.rec","wb"))==NULL)//二进制只写方式打开 
	{
		printf("无法打开文件!\n");
		exit(0);
	}
	while(ch=='y'||ch=='Y')
	{
		printf("输入姓名:");
		gets(stud.name);
		printf("输入性别:");
		gets(str);stud.sex=str[0];
		printf("输入年龄:");
		gets(str);stud.age=atoi(str);//年龄:将字符串转换为整型 
		printf("输入分数:");
		gets(str);stud.score=atof(str);//分数:将字符串转换为浮点型
		fwrite(&stud,sizeof(stud),1,fp);//写入数据到文件
		do
		{
			printf("继续输入:(y/n)?  ");
			gets(str);
			ch=str[0];
		} while(!(ch=='y'||ch=='n'||ch=='Y'||ch=='N'));
	}
	fclose(fp);
	return 0;
}

从磁盘文件按记录读取数据,并显示读入的内容,直到文件尾

#include
#include
struct student
{
	char name[10];
	char sex;//'M',或'F' 
	int age;
	float score;
};
int main()
{
	//从磁盘文件按记录读取数据,并显示读入的内容,直到文件尾
	struct student stud;
	FILE * fp;
	if((fp=fopen("stud2.rec","rb"))==NULL)	
	{
		printf("无法打开文件stud2.rec!\n");
		exit(0); 
	}
	while(fread(&stud,sizeof(stud),1,fp)==1)
	{
		printf("\n姓名:%s",stud.name);
		printf("\n性别:%c",stud.sex);
		printf("\n年龄:%d",stud.age);
		printf("\n分数:%.2f",stud.score);
	} 
	printf("\n");
	fclose(fp);
	return 0;
}

文件定位与随机读写

文件的定位:利用fesk()和ftell()函数编写程序测量一个文件的长度 

#include
#include 
//文件的定位
//利用fesk()和ftell()函数编写程序测量一个文件的长度 
long filesize(FILE * fp)
{
	long curpos,length;//当前文件读写位置指针相当于文件开头的位移量 
	curpos=ftell(fp);//保存文件的当前读写位置指针 
	fseek(fp,0L,SEEK_END);//文件读写位置指针置于文件尾端
	length=ftell(fp);//求文件长度
	fseek(fp,curpos,SEEK_SET);//恢复文件的原读写位置的指针
	return length; 
}
long filesize(FILE * stream);
int main()
{
	FILE * stream;
	char filename[10];
	printf("\n输入文件名:");
	scanf("%s",filename);
	if((stream=fopen(filename,"rb"))==NULL)
	{
		printf("无法打开文件:%s\n",filename);
		exit(0);
	}
	printf("%s的文件大小是%ld(byte)\n",filename,filesize(stream));
	fclose(stream);
	return 0;
}

随机读写: 

由之前建立的学生入学档案的磁盘文件stud.rec中,假设学生按照分数升序排列。
现要求设计一个程序,输入一个整型值给n,输出分数最高的n个学生记录,即排在尾部的n个学生记录 

#include
#include
struct student
{
	char name[10];
	char sex;//'M',或'F' 
	int age;
	float score;
};
//由之前建立的学生入学档案的磁盘文件stud.rec中,假设学生按照分数升序排列。
//现要求设计一个程序,输入一个整型值给n,输出分数最高的n个学生记录,即排在尾部的n个学生记录 
int main()
{
	FILE * fp;
	struct student stud;
	int n;
	if((fp=fopen("stud.rec","rb"))==NULL)
	{
		printf("无法打开文件");
		exit(0);	
	} 
	printf("\n请输入一个整数:");
	scanf("%d",&n);
	fseek(fp,-n*sizeof(stud),SEEK_END); //定位到倒数第n个学生记录
	while(fread(&stud,sizeof(stud),1,fp)==1)
	{
		printf("\n姓名:%s",stud.name);
		printf("\n性别:%c",stud.sex);
		printf("\n年龄:%d",stud.age);
		printf("\n分数:%.2f",stud.score);	
	} 
	return 0;
}

文件中数据的修改

将之前的成绩表中的女生成绩加五分

#include
#include
struct student
{
	char name[10];
	char sex;//'M',或'F' 
	int age;
	float score;
};
int main()
{
	//从磁盘文件按记录读取数据,并显示读入的内容,直到文件尾
	struct student stud;
	FILE * fp;
	if((fp=fopen("stud.rec","rb"))==NULL)	
	{
		printf("无法打开文件stud2.rec!\n");
		exit(0); 
	}
	while(fread(&stud,sizeof(stud),1,fp)==1)
	{
		printf("\n姓名:%s",stud.name);
		printf("\n性别:%c",stud.sex);
		printf("\n年龄:%d",stud.age);
		printf("\n分数:%.2f",stud.score);
	} 
	printf("\n");
	fclose(fp);
	return 0;
}

输入一个学生的姓名,编写程序将stud.rec中该学生的记录删除 

#include
#include
#include 
struct student
{
	char name[10];
	char sex;//'M',或'F' 
	int age;
	float score;
};
//输入一个学生的姓名,编写程序将stud.rec中该学生的记录删除 
int main()
{
	char name[10];
	FILE * fp_old,* fp_new;
	struct student stud;
	if((fp_old=fopen("stud.rec","rb"))==0)//读方式打开原数据文件 
	{
		printf("\n不能打开文件");
		exit(0); 
	}
	if((fp_new=fopen("stud3.rec","wb"))==0)//写方式创建新数据文件 
	{
		printf("\n不能创建文件");
		exit(0); 
	} 
	printf("请输入要删除的学生姓名:");
	gets(name);
	while(fread(&stud,sizeof(stud),1,fp_old)==1)
	{
		//在原文件中读取一个学生记录在stud中
		if(strcmp(stud.name,name)!=0)
		{
			fwrite(&stud,sizeof(stud),1,fp_new);	
		} 
	} 
	fclose(fp_old);
	fclose(fp_new);
	remove("stud.rec");//删除原文件
	rename("stud3.rec","stud.rec"); //将新文件重命名 
	return 0;
}

向文件中插入数据

#include
#include
#include
struct student
{
	char name[10];
	char sex;//'M',或'F' 
	int age;
	float score;
};
int main()
{
	FILE * fp;
	struct student x,t={
		"Alex",'f',20,566
	};
	if((fp=fopen("stud.rec","a+b"))==0)
	{
		printf("\n\t无法打开文件!\n");
		exit(0);
	}
	fread(&x,sizeof(struct student),1,fp);//从文件中读一条学生记录
	fseek(fp,0L,SEEK_END); 
	fwrite(&t,sizeof(struct student),1,fp);//将t中的数据追加到文件尾
	
	rewind(fp);
	while(fread(&x,sizeof(struct student),1,fp)==1)
	{
		printf("\n%15s%4c%8d%8.2f",x.name,x.sex,x.age,x.score);	
	} 
	fclose(fp);
	return 0;
}

你可能感兴趣的:(C语言程序设计,c语言,开发语言)