文件:
函数调用形式 说明
fopen("路径","打开方式") 打开文件
fclose(FILE *) 防止之后被误用
fgetc(FILE *) 从文件中读取一个字符
fputc(ch,FILE *) 把ch代表的字符写入这个文件里
fgets(FILE *) 从文件中读取一行
fputs(FILE *) 把一行写入文件中
fprintf(FILE *,"格式字符串",输出表列) 把数据写入文件
fscanf(FILE *,"格式字符串",输入表列) 从文件中读取
fwrite(地址,sizeof(),n,FILE *) 把地址中n个sizeof大的数据写入文件里
fread(地址,sizeof(),n,FILE *) 把文件中n个sizeof大的数据读到地址里
rewind(FILE *) 把文件指针拨回到文件头
fseek(FILE *,x,0/1/2) 移动文件指针。第二个参数是位移量,0代表从头移,1代表从当前位置移,2代表从文件尾移。
feof(FILE *) 判断是否到了文件末尾
文件打开方式 说明
r 打开只能读的文件
w 建立供写入的文件,如果已存在就抹去原有数据
a 打开或建立一个把数据追加到文件尾的文件
r+ 打开用于更新数据的文件
w+ 建立用于更新数据的文件,如果已存在就抹去原有数据
a+ 打开或建立用于更新数据的文件,数据追加到文件尾
注:以上用于文本文件的操作,如果是二进制文件就在上述字母后加“b”。
我们用文件最大的目的就是能让数据保存下来。因此在要用文件中数据的时候,就是要把数据读到一个结构(一般保存数据多用结构,便于管理)中去,再对结构进行操作即可。例如,文件aa.data中存储的是30个学生的成绩等信息,要遍历这些信息,对其进行成绩输出、排序、查找等工作时,我们就把这些信息先读入到一个结构数组中,再对这个数组进行操作。如下例:
#include<stdio.h>
#include<stdlib.h>
#define N 30
typedef struct student /*定义储存学生成绩信息的数组*/
{
char *name;
int chinese;
int maths;
int phy;
int total;
}ST;
main()
{
ST a[N]; /*存储N个学生信息的数组*/
FILE *fp;
void (*process[3])(ST *)={Output,Bubble,Find}; /*实现相关功能的三个函数*/
int choice,i=0;
Show();
printf("\nChoose:\n?");
scanf("%d",&choice);
while(choice>=0&&choice<=2)
{
fp=fopen("aa.dat","rb");
for(i=0;i<N;i++)
fread(&a,sizeof(ST),1,fp); /*把文件中储存的信息逐个读到数组中去*/
fclose(fp);
(*process[choice])(a); /*前面提到的指向函数的指针,选择操作*/
printf("\n");
Show();
printf("\n?");
scanf("%d",&choice);
}
}
void Show()
{
printf("\n****Choices:****\n0.Display the data form\n1.Bubble it according to the total score\n2.Search\n3.Quit!\n");
}
void Output(ST *a) /*将文件中存储的信息逐个输出*/
{
int i,t=0;
printf("Name Chinese Maths Physics Total\n");
for(i=0;i<N;i++)
{
t=a.chinese+a.maths+a.phy;
a.total=t;
printf("%4s%8d%8d%8d%8d\n",a.name,a.chinese,a.maths,a.phy,a.total);
}
}
void Bubble(ST *a) /*对数组进行排序,并输出结果*/
{
int i,pass;
ST m;
for(pass=0;pass<N-1;pass++)
for(i=0;i<N-1;i++)
if(a.total<a[i+1].total)
{
m=a; /*结构互换*/
a=a[i+1];
a[i+1]=m;
}
Output(a);
}
void Find(ST *a)
{
int i,t=1;
char m[20];
printf("\nEnter the name you want:");
scanf("%s",m);
for(i=0;i<N;i++)
if(!strcmp(m,a.name)) /*根据姓名匹配情况输出查找结果*/
{
printf("\nThe result is:\n%s, Chinese:%d, Maths:%d, Physics:%d,Total:%d\n",m,a.chinese,a.maths,a.phy,a.total);
t=0;
}
if(t)
printf("\nThe name is not in the list!\n");
} |