要實現文件存儲,首先需要了解幾個函數
- fopen :FILE *fopen( const char *filename, const char *mode );
作用:fopen函數打開指定的文件文件名。;參數filename字符串表示打開文件的文件名。參數mode字符串表示打開方式;
今天我們用到了兩個打開方式: “r+”和“w”
“r+”:打開對閱讀和寫作。該文件必須存在。(這裏也可以用”r”);
“w”:讀寫打開一個空文件。如果給定的文件存在,它的內容被破壞。 fprintf 和 fscanf
int fprintf( FILE *stream, const char *format [, argument ]…);
int fscanf( FILE *stream, const char *format [, argument ]… );
用法和printf(fscanf)其實相同,只是前面加了一個文件結構體指針stream,把在在鍵盤上讀換成文件中讀,把往屏幕上寫換成往文件中寫。介紹完我們使用的函數,先介紹下我的思想:
代碼有三個文件項組成:
adder.h
adder.c
test.c
//adder.h 這裏面就是定義了一些常量,和函數
#ifndef __ADDER_H__
#define __ADDER_H__
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#define MAX_CON 2
#define MAX_name 20
#define MAX_sex 7
#define MAX_tele 15
#define MAX_add 20
typedef struct Contacts
{
char name[MAX_name];
char sex[MAX_sex];
int age;
char tele[MAX_tele];
char add[MAX_add];
}Contacts;
typedef struct Pcon
{
int MAX_data;
int sz;
Contacts *adder;
}Pcon;
void read_exe(Pcon *Pconer);//讀取文件中數據
void Add_contact(Pcon* pconer);//增添聯繫人
void Del_contact(Pcon* pconer);//刪除聯繫人
void Find_contact(Pcon* pconer);//查找聯繫人
void Mod_contact(Pcon* pconer);//刪除聯繫人
void Acc_contact(Pcon* pconer);//修改聯繫人
void Remov_contact(Pcon* pconer);//清除通訊錄
void Sort_contact(Pcon* pconer);//按姓名排序通訊錄
void write_exe(Pcon *Pconer);//退出程序前寫入文件中
#endif //__ADDRE_H__
//test.c
#include "adder.h"
void memu()
{
printf("**************************************************************\n");
printf("******************** 通訊錄選項 **********************\n");
printf(" 1. 添加聯繫人信息 2 刪除指定聯繫人信息\n");
printf(" 3. 查找指定聯繫人信息 4. 修改指定聯繫人信息\n");
printf(" 5. 顯示所有聯繫人信息 6. 清除所有聯繫人信息\n");
printf(" 7. 以名字排序所有聯繫人信息 0. 退出通訊錄 \n");
printf("**************************************************************\n");
printf("**************************************************************\n");
}
int main()
{
int number = 0;
void (*fun[8])(Pcon *) = { NULL,Add_contact,
Del_contact, Find_contact,
Mod_contact, Acc_contact,
Remov_contact,Sort_contact};
Pcon Pconer; //創建結構體,保存通訊錄人數,大小,內容
read_exe(&Pconer); //函數讀數據
do
{
memu();
scanf("%d",&number);
if(number == 0)
break;
else if(number < 8)
fun[number](&Pconer);
else
{
printf("輸入有誤:>");
}
}while(1);
write_exe(&Pconer); //寫數據
return 0;
}
//adder.c
#include "adder.h"
void INIT(Pcon *Pconer)
{
Pconer->adder = (Contacts *)malloc(sizeof(Contacts)*MAX_CON);
if(Pconer->adder == NULL)
{
perror("use malloc ");
exit(1);
}
Pconer->sz = 0;
Pconer->MAX_data = MAX_CON;
}
void read_exe(Pcon *Pconer) //讀取數據
{
FILE *pf = fopen("adder.txt", "r+");
int i = 0;
fscanf(pf, "%d %d" , &(Pconer->sz), &(Pconer->MAX_data));//我們首先讀出文件中存儲了多少個聯繫人
//這裏解釋爲什麼一開始我們創建文件時要初始化 0 0
//第一次使用時,若沒有初始化讀取數據時就會讀取錯誤
if(Pconer->MAX_data == 0)
{
INIT(Pconer);
}
else
{
Pconer->adder = (Contacts *)malloc(sizeof(Contacts)*(Pconer->MAX_data));
}
if(Pconer->adder == NULL)
{
perror("use malloc ");
exit(1);
}
for(i=0;i<(Pconer->sz);i++)
{
fscanf(pf,"%s %s %d %s %s",Pconer->adder[i].name,Pconer->adder[i].sex,(&Pconer->adder[i].age),
Pconer->adder[i].tele,Pconer->adder[i].add);
}
fclose(pf);
}
void check_adder(Pcon **pconer) //判斷內存是否已滿,若滿了則增加空間
{
if((*pconer)->sz >= (*pconer)->MAX_data )
{
(*pconer)->adder = (Contacts *)realloc((*pconer)->adder, sizeof(Contacts)*((*pconer)->MAX_data+MAX_CON));
(*pconer)->MAX_data += MAX_CON;
printf("空間增加成功\n");
}
}
void Add_contact(Pcon *pconer) //1.添加聯繫人;
{
check_adder(&pconer);
printf("請輸入聯繫人姓名:> ");
scanf("%s",(pconer->adder[pconer->sz]).name);
printf("請輸入聯繫人性別:> ");
scanf("%s",(pconer->adder[pconer->sz]).sex);
printf("請輸入聯繫人年齡:> ");
scanf("%d",&((pconer->adder[pconer->sz]).age));
printf("請輸入聯繫人電話號碼:> ");
scanf("%s",(pconer->adder[pconer->sz]).tele);
printf("請輸入聯繫人住址:> ");
scanf("%s",(pconer->adder[pconer->sz]).add);
++pconer->sz;
printf("添加完成\n");
}
void Del_contact(Pcon* pconer) //2.刪除指定聯繫人
{
int i = 0;
char buf[MAX_name]= {0};
printf("請輸入刪除的聯繫人名:> ");
scanf("%s",buf);
while(i<pconer->sz)
{
if(strcmp(buf,(pconer->adder[i]).name) == 0)
break;
i++;
}
if(i == pconer->sz)
{
printf("無此人信息!\n");
return;
}
while(i<pconer->sz)
{
pconer->adder[i] = pconer->adder[i+1];
++i;
}
--pconer->sz;
}
void Find_contact(Pcon* pconer)//3.查找聯繫人
{
int i = 0;
char buf[MAX_name];
scanf("%s",buf);
while(i<pconer->sz)
{
if(strcmp(buf,pconer->adder[i].name) == 0)
break;
++i;
}
if(i == pconer->sz)
{
printf("無此人信息!\n");
return;
}
printf("姓名:%-10s, 性別:%-5s,年齡:%-4d, 電話:%15-s, 住址:%20-s\n",
pconer->adder[i].name,pconer->adder[i].sex,
pconer->adder[i].age,pconer->adder[i].tele,pconer->adder[i].add);
}
void Mod_contact(Pcon* pconer)//4.修改聯繫人
{
int i = 0;
int number = 0;
char buf[MAX_name];
scanf("%s",buf);
while(i<pconer->sz)
{
if(strcmp(buf,pconer->adder[i].name) == 0)
break;
++i;
}
if(i == pconer->sz)
{
printf("無此人信息!\n");
return;
}
printf("修改項目:1 姓名 2 性別 3 年齡 4 電話 5 住址\n");
scanf("%d",&number);
printf("請輸入修改後的內容:");
switch(number)
{
case 1:
scanf("%s",pconer->adder[i].name);
break;
case 2:
scanf("%s",pconer->adder[i].sex);
break;
case 3:
scanf("%d",&pconer->adder[i].age);
break;
case 4:
scanf("%s",pconer->adder[i].tele);
break;
case 5:
scanf("%s",pconer->adder[i].add);
break;
}
}
void Acc_contact(Pcon* pconer) //5.顯示所有聯繫人
{
int i = 0;
for(i=0; i<pconer->sz; ++i)
{
printf("姓名:%-10s性別:%-5s年齡:%-4d電話:%-15s住址:%-20s\n",
pconer->adder[i].name,pconer->adder[i].sex,
pconer->adder[i].age,pconer->adder[i].tele,pconer->adder[i].add);
}
}
void Remov_contact(Pcon* pconer)//6.清除所有聯繫人信息
{
pconer->sz = 0;
}
int compare(const void *str1, const void* str2) //qsort 排序
{
return strcmp( ((Contacts *)str1)->name,((Contacts *)str2)->name );
}
void Sort_contact(Pcon* pconer) //以名字排序通訊錄
{
qsort((pconer->adder),pconer->sz,sizeof(Contacts),compare );
}
void write_exe(Pcon *Pconer)
{
FILE *pf = fopen("adder.txt", "w");
int i = 0;
fprintf(pf, "%d %d ", Pconer->sz, Pconer->MAX_data);
for(i=0; i<Pconer->sz; i++)
{
fprintf(pf,"%s %s %d %s %s ",Pconer->adder[i].name,
Pconer->adder[i].tele,Pconer->adder[i].add);
}
fclose(pf);
}