目录
字符方式读入文件
数据块方式读写文件
文件定位与随机读写
文件中数据的修改
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;
}