上节的通讯录是什么呢,加了一个动态内存开辟Contact结构体中新加了当前通讯录的最大容量

为什么要加呢,因为一次开辟一千个空间会i产生不必要的浪费,初始化开辟三个,最大容量也可以设置为三,在查找函数里面如果成员大于最大容量则用realloc调整空间,

接着最大容量自加2,每次增加检查一次后面又加了文件相关

文件操作

磁盘上的文件就是文件,文件有程序文件和数据文件两种,

程序文件:就是包括源文件(后缀为.c)目标文件(windows环境后缀为.obj),可执行程序(Windows环境后缀为.exe)

数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件

文件名包括三个部分,文件路径,文件名主干,文件后缀,如c;\code\test.txt,

文件类型:根据数据的组织形式,数据文件称为文本文件和二进制文件,

数据在内存中以二进制的形式存储,不加转换的输出到外存,就是二进制文件

如果要求在内存上以ASCII码的形式存储,则需要在存储前转换,以ASCIIC字符的形式存储的文件就是文本文件

 文件缓冲区,缓存文件系统指系统自动地在内存中为程序中每一个正在使用的文件开辟一块文件缓冲区,

  从内存向装满磁盘输出数据会先送到文件的缓冲区,装满缓冲区后一起送到磁盘上。如果从磁盘向计算机读入数据,则从

磁盘文件中读取数据输入到内存缓冲区(存满缓冲区),然后在从缓冲区逐个送入程序数据区,

文件指针:struct_iobuf  FILE,不同c编译器对FILE类型包括的内容不完全相同

这是一个结构体里面有文件的信息,每次打开一个文件时,系统会根据文件的情况自动创建一个file结构的变量,并填充其中的信息,使用者不必留心细节

一般都是通过一个FILE*指针变量来维护这个FILR结构的变量

FILE*pf//文件指针

打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的连系

FILE*fopen(const char*filrnamr,const char*mode);mode打开模式“r”只读,

int fclose(FILR*stream);关闭文件函数fclose;

打开文件失败会返回一个空指针,fputs可以写进去字符串。fputc写进去字符

fgetc,fgets,读文件返回int   fgets读取一行,puts()天生有换行输出到屏幕

FILE * fopen ( const char * filename, const char * mode );

int fclose ( FILE * stream );        int fputc ( int character, FILE * stream );           int fgetc ( FILE * stream );

int fputs ( const char * str, FILE * stream );       char * fgets ( char * str, int num, FILE * stream );

int getc ( FILE * stream );    char * gets ( char * str );  int getchar ( void );

int putc ( int character, FILE * stream );  int puts ( const char * str );  int putchar ( int character );

fscanf从文件里面放例如结构体中,fprintf放到文件里面写入

fred, fseek可以参考库函数文件的随机读写rewind让文件回到起始位置

end of file-EOF是文件结束标志,

feof不能用feof函数的返回值直接判断文件的是否结束,而是应该用于

文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束


加文件的必要性是上次输进去的东西还可以直接写入当前代码通讯录中,

定义一个save函数,把每次写的通讯录存进去文件中,在定义一个加载函数把每次文件里面的东西加载进去当前代码通讯录中如最后两个定义代码都是关于文件的