一、程序功能分析
一个电话管理程序,需要读电话号码进行添加、删除、保存、打开等操作。这个程序需要完成下面这些功能。
(1)进行程序以后,需要一个选择菜单。
(2)需要添加电话号码,实现数据的输入。
(3)需要删除电话号码,实现数据的管理。
(4)需要进行数据列表,显示所有的电话号码信息。
(5)需要根据一个姓名进行查找,查看这个姓名的数据。
(6)使用文件进行操作,把信息保存到文件上。
(7)要有文件的读取功能,从文件中读取以前的数据。
二、程序的函数
这个程序是一个较为复杂的程序,需要把这些功能写成不同的函数模块。这样可以把一个复杂程序拆分成几个独立的简单模块,然后用主函数将这些程序组织到一起。这个程序需要编写以下这些函数。
◆ 菜单函数,完成菜单的显示和选择
int menu();
◆显示学生函数,参数是一个结构体,显示结构体的信息
void shownum(struct telnum t);
◆添加电话函数,完成一个电话号码的添加,返回一个结构体
struct telnum addnum();
◆查找函数,用户输入一个姓名,查找到这个用户的电话
void selectbyname();
◆删除电话号码函数,用户输入一个姓名,删除这个用户的电话号码
void delenum();
◆保存信息功能,将所欲电话保存到文件上
void savetofile();
◆导入电话号码。从文件中读取一起的文件信息
void loadfromfile();
◆主函数。完成各个函数的调用
int main();
三、包含文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<errno.h>
四、数据的定义
程序中的电话号码和姓名之间存在着一对一的联系,需要定义一个结构体来体现这种关系。
struct telnum{
char name[11];
char tel[13];//电话号码
};
五、函数的实现
◆菜单函数:
程序中有很多功能,需要把这些功能用一个菜单共用户选择。这个菜单有一个编号,用户从键盘输入相对应的编号。函数对输入编号进行判断,如果输入有效,则返回这个选项。如果输入选项为0,则退出这个程序。如果输入的选项无效,则显示错误,需用户重新选择。
int menu(){
int j=0;
while(1){
printf("\n*************************************************\n");
printf("\n******** 1:add a number *********\n");
printf("\n******** 2:all the number *********\n");
printf("\n******** 3:select a number by name *********\n");
printf("\n******** 4:delete a number by name *********\n");
printf("\n******** 5:save to file *********\n");
printf("\n******** 6:load number from file *********\n");
printf("\n******** 0:exit *********\n");
printf("\n*************************************************\n");
printf("please select a menu:\n");
scanf("%d",&j);
if(j==0){
printf("byebye\n");
exit(1);
}
if(j<0||j>6){
printf("error ,continue\n");
continue;
}else{
return j;
}
}
}
◆显示电话信息函数:
这个函数的左右是显示一各电话信息结构体。函数返回这个结构体的成员变量,输出这些信息。完成数据的输出以后,自动结束程序,没有返回值。
void shownum(struct telnum t){
printf("Name : %s\n",t.name);
printf("tel : %s\n",t.tel);
}
◆添加电话号码函数:
这个函数的作用是提示用户输入电话和姓名信息。返回一个电话号码的结构体。
struct telnum addnum(){
struct telnum numtmp;
char na[11],tel[13];
printf("add a telephone number:\n");
printf("please input the name:\n");
scanf("%s",na);
printf("please input the num:\n");
scanf("%s",tel);
strcpy(numtmp.name,na);
strcpy(numtmp.tel,tel);
return numtmp;
}
◆按姓名查找函数
这个函数的作用是,提示用户输入一个姓名,函数调用for循环语句,访问电话号码数组中的每一条数据。将每个姓名与当前输入的姓名作比较,如果相同输出这条记录。
void selectbyname(){
char na[20];
int n,j;
n=0;
printf("select number by name:\n");
printf("please input a name:\n");
scanf("%s",na);
for(j=0;j<i;++j){
if(strcmp(num[j].name,na) == 0){
shownum(num[j]);
n++;
}
}
if(n == 0){
printf("no such a name\n");
}
}
◆删除电话号码函数:
这个函数的作用是,从电话号码数组中删除一条电话号码信息。
void delenum(){
char na[20];
int j,n;
n=0;
printf("delete a num by name:\n");
printf("please input a name:\n");
scanf("%s",na);
for(j=0;j<i;++j){
if(strcmp(num[j].name,na) == 0){
n++;
for(;j<i;j++){
num[j] = num[j+1];
}
--i;
break;
}
}
if(n == 0){
printf("no such a name\n");
}
}
◆保存到文件函数 :
这个函数的作用,是将用户输入的所有电话号码,保存到一个文本文件中,函数没有参数和返回值。需要保存的内容在全局变量中,这个函数可以访问全局变量的内容。
void savetofile(){
int j ,fd;
char path[] = "/home/chaiyandong/BAT/LINUX/基础IO/N_M/tel.txt";
extern int errno;
//O_TRUNC:如果文件已经存在,则将文件的长度截为0
fd = open(path,O_WRONLY|O_TRUNC|O_CREAT);
if(fd != -1){
printf("opened file %s\n",path);
}else{
printf("cann't open file %s\n",path);
printf("errno:%d\n",errno);
printf("ERR:%s\n",strerror(errno));
}
for(j = 0; j<i;++j){
printf("%d %s\n",j,num[j].name);
write(fd,&num[j],sizeof(struct telnum));
}
printf("saved\n");
close(fd);
◆从文件导入信息函数:
本函数的作用,是从以前保存的文件中读取电话号码和姓名信息,并将这些信息保存到全局变量数组中。在导入信息时,依次读取若干个字符。如果读取的字符个数不为0,则在结构体数组中添加一条记录。
void loadfromfile(){
int j = 0,fd ,t;
char na[11];
char tel[13];
i = 0;
char file[] = "/home/chaiyandong/BAT/LINUX/基础IO/N_M/tel.txt";
extern int errno;
fd = open(file,O_RDONLY);
if(fd != -1){
printf("opened file %s\n",file);
}else{
printf("cann't open file %s\n",file);
printf("errno:%d\n",errno);
printf("ERR:%s\n",strerror(errno));
}
while(read(fd,&num[i],sizeof(struct telnum))>0){
++i;
}
close(fd);
}
◆主函数
这个函数的作用,是将上面的这些函数用一定的关系组织起来,统一完成一个程序的功能。在程序开始时,进入一个while循环。在循环中反复调用menu函数来进行功能选择,然后根据返回值来调用相关的子函数。
//主函数
int main(){
//printf("hha");
//menu();
int s,j;
printf("*******TelePhone Notebook***********\n");
while(1){
s = menu();
if(s == 1){
num[i] = addnum();
++i;
}
if(s == 2){
for(j=0;j<i;++j){
shownum(num[j]);
}
}
if(s == 3){
selectbyname();
}
if(s == 4){
delenum();
}
if(s == 5){
savetofile();
}
if(s == 6){
loadfromfile();
}
}
return 0;
}