电话号码管理程序-----文件项目

一、程序功能分析

        一个电话管理程序,需要读电话号码进行添加、删除、保存、打开等操作。这个程序需要完成下面这些功能。

        (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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值