A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

在写通讯录时,如果打开一个空文件,这句话为什么还是要执行一次循环体,求教。while (!feof(fp)) {
。。。
}

4 个回复

倒序浏览

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define NAMELEN 21
#define TELELEN 21

//定义联系人结构体
typedef struct contact{

    char name[NAMELEN]; //姓名
    char tele[TELELEN]; //电话号码
    struct contact *next;//指向下一个联系人

}Contact,*P_List,*Pcontact;

int main(int argc, const char * argv[]) {
    //函数声明
    void readfile(P_List head);
    void showACont(P_List head);
    void addCont(P_List head);
    void deletCont(P_List head);
    void modiCont(P_List head);
    void seekCont(P_List head);
    int exitSys();
    //表头
    P_List head = (P_List)malloc(sizeof(Contact));
    head->next = NULL;

    //读取数据文件的内容
    readfile(head);

    int funNum;//功能序号

    //整体while循环
    while(1){
        //输出界面,提示用户输入相应功能编号
        printf("******************************\n");
        printf("*******  欢迎使用通讯录  *******\n");
        printf("******* 1.添加联系人    *******\n");
        printf("******* 2.删除联系人    *******\n");
        printf("******* 3.修改联系人    *******\n");
        printf("******* 4.查看所有联系人 *******\n");
        printf("******* 5.搜索联系人    *******\n");
        printf("******* 6.退出系统      *******\n");
        printf("******************************\n");

        //判断序号是否在范围内
        printf("请输入功能序号:");
        scanf("%d",&funNum);

        while(funNum < 1 || funNum > 6){
            printf("功能序号非法,请重新输入:");
            scanf("%d",&funNum);

        }

//switch来调用相应功能
        switch (funNum) {
            case 1:
                addCont(head);
                break;
            case 2:
                deletCont(head);
                break;
            case 3:
                modiCont(head);
                break;
            case 4:
                showACont(head);
                break;
            case 5:
                seekCont(head);
                break;
            case 6:
                if (exitSys()==0)
                    return 0;
                break;
            default:
                break;
        }
    }
    return 0;
}



回复 使用道具 举报
/**
*  打开文件,读取内容
*
*  @param head 链表头指针
*/
void readfile(P_List head){
    FILE *fp;//文件指针
    P_List last=head;
    //尝试打开文件,读取内容
    fp = fopen("contactsIfo.data", "rb");

    if (fp == NULL) {
        printf("未找到文件。\n");
        fp = NULL;
        fp = fopen("contactsIfo.data", "wb");
        if (fp != NULL) {
            printf("新数据文件新建成功!\n");
        }else{
            printf("新数据文件新建失败!\n");
        }
        fclose(fp);
    }else{
        //读取文件内容
        printf("读取文件内容.\n");

        //first->next=NULL;
        fp = fopen("contactsIfo.data", "rb");

        while (!feof(fp)) {      //此处为什么会多执行一次
            Pcontact p ;
            p= (Pcontact)malloc(sizeof(Contact));

            fread(p, sizeof(Contact), 1, fp);
            if (strcmp(p->tele, p->name)!=0) {
                last->next=p;
                p->next=NULL;
                last = last->next;
            }
        }
    }
    fclose(fp);
}
/**
*  添加新的联系人
*
*  @param head 链表头指针
*/
void addCont(P_List head){
    P_List h=head;

    Pcontact newContact=(Pcontact)malloc(sizeof(Contact));

    printf("添加联系人.\n");
    //用户输入新联系人姓名号码

    printf("请输入新联系人姓名:");
    scanf("%s",newContact->name);

    printf("请输入新联系人号码:");
    scanf("%s",newContact->tele);

    //保存到链表中
    //循环到最后一个
    while (h->next) {
        h=h->next;
    }
    h->next=newContact;
    newContact->next=NULL;
    //写入文件中
    FILE *fp;
    fp = fopen("contactsIfo.data", "ab");
    if (fp != NULL) {
        fwrite(newContact, sizeof(Contact), 1, fp);
        printf("add name=%s,tele=%s",newContact->name,newContact->tele);
        printf("写入成功!\n");
    }else{
        printf("新联系人写入文件失败\n");
    }
   //关闭文件
    fclose(fp);
}



回复 使用道具 举报
本帖最后由 果壳里的果冻 于 2015-6-22 16:08 编辑

/**
*  删除联系人
*
*  @param head 链表头指针
*/
void deletCont(P_List head){
    P_List h=head,l=head;
    char name[NAMELEN];
    printf("请输入删除联系人姓名:");
    scanf("%s",name);

    //进行匹配
    if (h->next!=NULL) {
        h=h->next;
        while (h) {
            if (strcmp(h->name, name)==0) {
                //删除节点
                l->next=h->next;
                printf("联系人删除成功!\n");
                //重新写入文件
                h=head;

                FILE *fp;
                fp = fopen("contactsIfo.data", "wb");
                if (h->next!=NULL) {
                    h=h->next;
                    while (h) {
                        if (fp != NULL) {
                            fwrite(h, sizeof(Contact), 1, fp);
                            printf("readd name=%s,tele=%s",h->name,h->tele);
                            printf("写入成功!\n");
                            h=h->next;
                        }else
                            printf("新联系人写入文件失败\n");
                     }
                }
                //关闭文件
                fclose(fp);
                break;
            }
            h=h->next;l=l->next;
        }
    }else{
        printf("没有该联系人!\n");
    }
}


/**
*  修改联系人
*
*  @param head 链表头指针
*/
void modiCont(P_List head){
    int i=0;//统计修改处的位置
    P_List h=head;
    char name[NAMELEN];

    printf("请输入修改联系人姓名:");
    scanf("%s",name);

    //进行匹配
    if (h->next!=NULL) {
        h=h->next;
        while (h) {
            if (strcmp(h->name, name)==0) {
                //输出原联系人姓名及号码
                printf("原姓名:%s,原号码:%s\n",h->name,h->tele);
                //Pcontact p = (Pcontact)malloc(sizeof(Contact));
                printf("请输入新姓名:");
                scanf("%s",h->name);
                printf("请输入新号码:");
                scanf("%s",h->tele);

                //重新写入文件
                h=head;

                FILE *fp;
                fp = fopen("contactsIfo.data", "wb");
                if (h->next!=NULL) {
                    h=h->next;
                    while (h) {
                        if (fp != NULL) {
                            fwrite(h, sizeof(Contact), 1, fp);
                            printf("readd name=%s,tele=%s",h->name,h->tele);
                            printf("写入成功!\n");
                            h=h->next;
                        }else
                            printf("新联系人写入文件失败\n");
                    }
                }
                //关闭文件
                fclose(fp);
                break;
            }
            h=h->next;i++;
        }
    }else  printf("没有该联系人!\n");
}

回复 使用道具 举报
/**
*  打印所有联系人
*
*  @param head 链表头指针
*/
void showACont(P_List head){
    P_List h=head;
    if (h->next!=NULL) {
        h=h->next;
        printf("姓名       号码\n");
        while (h) {
            printf("%-10s%-10s\n",h->name,h->tele);
            h=h->next;
        }
    }
    else
        printf("联系人为空!\n");
}

/**
*  查找联系人
*
*  @param head 链表头指针
*/
void seekCont(P_List head){
    P_List h=head;

    char name[NAMELEN];

    printf("请输入修改联系人姓名:");
    scanf("%s",name);

    //进行匹配
    if (h->next!=NULL) {
        h=h->next;
        while (h) {
            if (strcmp(h->name, name)==0) {
                //输出原联系人姓名及号码
                printf("所查找人->姓名:%s,号码:%s\n",h->name,h->tele);
                break;
            }
            h=h->next;
        }
    }else  printf("没有该联系人!\n");
}

/**
*  退出程序
*
*  @return 返回0则表示退出程序
*/
int exitSys(){
    return 0;
}


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马