文件:
| 函数调用形式 | 说明 |
| 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 /*定义储存学生成绩信息的数组*/ main() void Show() void Output(ST *a) /*将文件中存储的信息逐个输出*/ void Bubble(ST *a) /*对数组进行排序,并输出结果*/ void Find(ST *a) |
链表:
链表是C语言中另外一个难点。牵扯到结点、动态分配空间等等。用结构作为链表的结点是非常适合的,例如:
| struct node { int data; struct node *next; }; |
其中next是指向自身所在结构类型的指针,这样就可以把一个个结点相连,构成链表。
链表结构的一大优势就是动态分配存储,不会像数组一样必须在定义时确定大小,造成不必要的浪费。用malloc和free函数即可实现开辟和释放存储单元。其中,malloc的参数多用sizeof运算符计算得到。
链表的基本操作有:正、反向建立链表;输出链表;删除链表中结点;在链表中插入结点等等,都是要熟练掌握的,初学者通过画图的方式能比较形象地理解建立、插入等实现的过程。
| typedef struct node { char data; struct node *next; }NODE; /*结点*/ 正向建立链表: NODE *create() { char ch='a'; NODE *p,*h=NULL,*q=NULL; while(ch<'z') { p=(NODE *)malloc(sizeof(NODE)); /*强制类型转换为指针*/ p->data=ch; if(h==NULL) h=p; else q->next=p; ch++; q=p; } q->next=NULL; /*链表结束*/ return h; } |

逆向建立:
| NODE *create() { char ch='a'; NODE *p,*h=NULL; while(ch<='z') { p=(NODE *)malloc(sizeof(NODE)); p->data=ch; p->next=h; /*不断地把head往前挪*/ h=p; ch++; } return h; } |

用递归实现链表逆序输出:
| void output(NODE *h) { if(h!=NULL) { output(h->next); printf("%c",h->data); } } |
插入结点(已有升序的链表):
| NODE *insert(NODE *h,int x) { NODE *new,*front,*current=h; while(current!=NULL&&(current->data<x)) /*查找插入的位置*/ { front=current; current=current->next; } new=(NODE *)malloc(sizeof(NODE)); new->data=x; new->next=current; if(current==h) /*判断是否是要插在表头*/ h=new; else front->next=new; return h; } |

删除结点:
| NODE *delete(NODE *h,int x) { NODE *q,*p=h; while(p!=NULL&&(p->data!=x)) { q=p; p=p->next; } if(p->data==x) /*找到了要删的结点*/ { if(p==h) /*判断是否要删表头*/ h=h->next; else q->next=p->next; free(p); /*释放掉已删掉的结点*/ } return h; } |

经常有链表相关的程序填空题,做这样的题要注意看下面提到的变量是否定义了,用到的变量是否赋初值了,是否有给分配空间的没有分配空间,最后看看返回值是否正确。
笔者水平有限,难免有疏漏、错误的地方,浅显之处,还望指正见谅。上述内容仅是个提示作用,并不包括C语言的全部内容。







