文件
函数调用形式 说明
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个学生的成绩等信息,要遍历这些信息,对其进行成绩输出、排序、查找等工作时,
我们就把这些信息先读入到一个结构数组中,再对这个数组进行操作。如下例
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #include<stdlib.h> 3 #define N 30 4 typedef struct student/*定义储存学生成绩信息的数组*/ 5 { 6 char *name; 7 int chinese; 8 int maths; 9 int phy; 10 int total; 11 }ST; 12 13 void Output(ST*a); 14 void Bubble(ST*a); 15 void Find(ST*a); 16 17 int main(int argc, char* argv[]) 18 { 19 ST a[N];/*存储N个学生信息的数组*/ 20 FILE *fp; 21 void(*process[3])(ST*)={Output,Bubble,Find};/*实现相关功能的三个函数*/ 22 int choice,i=0; 23 Show(); 24 printf("\nChoose:\n?"); 25 scanf("%d",&choice); 26 while(choice>=0 && choice<=2) 27 { 28 fp=fopen("aa.dat","rb"); 29 for(i=0;i<N;i++) 30 fread(&a[i],sizeof(ST),1,fp);/*把文件中储存的信息逐个读到数组中去*/ 31 fclose(fp); 32 (*process[choice])(a);/*前面提到的指向函数的指针,选择操作*/ 33 printf("\n"); 34 Show(); 35 printf("\n?"); 36 scanf("%d",&choice); 37 } 38 } 39 void Show() 40 { 41 printf("\n****Choices:****\n0.Display the data form\n1.Bubble it according to the total score\n2.Search\n3.Quit!\n"); 42 } 43 void Output(ST *a)/*将文件中存储的信息逐个输出*/ 44 { 45 int i,t=0; 46 printf("Name Chinese Maths Physics Total\n"); 47 for(i=0;i<N;i++) 48 { 49 t=a[i].chinese+a[i].maths+a[i].phy; 50 a[i].total=t; 51 printf("%4s%8d%8d%8d%8d\n",a[i].name,a[i].chinese,a[i].maths,a[i].phy,a[i].total); 52 } 53 } 54 void Bubble(ST*a)/*对数组进行排序,并输出结果*/ 55 { 56 int i,pass; 57 ST m; 58 for(pass=0;pass<N-1;pass++) 59 for(i=0;i<N-pass-1;i++) 60 if(a[i].total<a[i+1].total) 61 { 62 m=a[i];/*结构互换*/ 63 a[i]=a[i+1]; 64 a[i+1]=m; 65 } 66 Output(a); 67 } 68 void Find(ST*a) 69 { 70 int i,t=1; 71 char m[20]; 72 printf("\nEnter the name you want:"); 73 scanf("%s",m); 74 for(i=0;i<N;i++) 75 if(!strcmp(m,a[i].name))/*根据姓名匹配情况输出查找结果*/ 76 { 77 printf("\nThe result is:\n%s, Chinese:%d,Maths:%d, Physics:%d,Total:%d\n",m,a[i].chinese,a[i].maths,a[i].phy,a[i].total); 78 t=0; 79 } 80 if(t) 81 printf("\nThe name is not in the list!\n"); 82 }