文件:
我们在想既然是通讯录就应该把信息记录下来,只有我们自己选择删除数据的时候,数据才不复存在。
这就涉及到了数据持久化的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据
库等方式
使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。
文件的打开和关闭:
缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名
字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统
声明的,取名FILE
当然我们使用的时候,只知道他是个文件指针就行了。
保存方法:
首先我们知道通讯录退出的时候保存一下,所以我们可以这样做。
//保存通讯录。 void save_contact(contact* pc) { assert(pc); //打开文件 FILE* pf = fopen("contact.dat", "wb"); if (pf == NULL) { perror("Save_contact::fopen"); return; } //写文件 int i = 0; for (i = 0; i < pc->sz; i++) { fwrite(pc->pos + i, sizeof(peoInfo), 1, pf); } //关闭文件 fclose(pf); pf = NULL; }
我们保存了,那么我们就需要读一下。那么在哪里读那,当然在初始化的时候。
//文件形式。 void LoadContact(contact* pc) { //打开文件。 FILE* pf = fopen("contact.dat", "rb"); if (pf == NULL) { perror("LoadContact::fopen"); return; } //读文件。 peoInfo tmp = { 0 }; while (fread(&tmp, sizeof(peoInfo), 1, pf)) { CheckCapacity(pc); pc->pos[pc->sz++] = tmp; } //关闭文件。 fclose(pf); pf = NULL; } void Init_cotact(contact* pc) { assert(pc); pc->sz = 0; pc->capacity = NUME_CAP; pc->pos = (peoInfo*)malloc(pc->capacity * sizeof(peoInfo));//堆上开辟空间。 if (pc->pos == NULL) { perror("Init_cotact::malloc"); return; } memset(pc->pos, 0, pc->capacity * sizeof(peoInfo));//初始化为0。 //加载文件信息到通讯录里面。 LoadContact(pc); }
注意(知识点):
文件使用方式 含义 如果指定文件不存在
“rb”(只读) 为了输入数据,打开一个二进制文件 出错 “wb”(只写) 为了输出数据,打开一个二进制文件 建立一个新的文件