weixin_52232954
2021-06-07 16:54
采纳率: 100%
浏览 31

c语言通讯录,清空函数不行

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
struct list                    //建立结构体list用来存放一个联系人的信息 
{
    char name[20];
    char sex[20];
    char year[5];
    char phone[12];
    char home[20]; 
}info[100];                  //并定义了一个结构体数组info(information的缩写),一共可以存放100个联系人的信息,如果不够用可以再加。 
//设置函数声明,便于调用相关函数。 
void f1();            //添加联系人信息         //
void f2();            //删除指定联系人信息     // 
void f3();            //查找指定联系人信息     //
void f4();            //修改指定联系人信息     //
void f5();            //显示所有联系人信息     //
void f6();            //清空所有联系人         //
void f7();            //以名字排序所有联系人(按字典顺序)     //
void menu()
{
system("cls");
printf("\n\n\n\n\t\t\t\t\t   通讯录\n");
printf(" \t\t\t\t\t\t\t\t\t\t\t作者:待写");
printf("\n\t\t\t*--*--*--*--*--*--||菜单||--*--*--*--*--*--*--*\n\t\t\t|\t\t\t\t\t      |");
printf("\n\t\t\t* \t1.添加联系人信息\t\t      *\n\t\t\t|\t\t\t\t\t      |");
printf("\n\t\t\t* \t2.删除指定联系人信息\t\t      *\n\t\t\t|\t\t\t\t\t      |");
printf("\n\t\t\t* \t3.查找指定联系人信息\t\t      *\n\t\t\t|\t\t\t\t\t      |");
printf("\n\t\t\t* \t4.修改指定联系人信息\t\t      *\n\t\t\t|\t\t\t\t\t      |");
printf("\n\t\t\t* \t5.显示所有联系人信息\t\t      *\n\t\t\t|\t\t\t\t\t      |");
printf("\n\t\t\t* \t6.清空所有联系人\t\t      *\n\t\t\t|\t\t\t\t\t      |");
printf("\n\t\t\t* \t7.以名字排序所有联系人(按字典顺序)    *\n\t\t\t|\t\t\t\t\t      |");
printf("\n\t\t\t* \t8.退出\t\t\t\t      *\n\t\t\t|\t\t\t\t\t      |");
printf("\n\t\t\t*--*--*--*--*--*--*------*--*--*--*--*--*--*--*");
printf("\n\n\t\t\t\t  请输入选项:");

}
void f1()                                              //f1函数用来添加联系人信息。相关文件函数作用说明可参考红皮书第10章 
{    int i,count=0;                                    //定义一个循环变量以及记录通讯录中联系人个数的变量
    char ch[2];                                      //字符数组用来记录用户的输入
    FILE *fp;                                       //定义指向文件的指针变量
    if((fp=fopen("data.txt","a+"))==NULL)          //调用fopen函数创建一个新的文本来保存联系人信息,具体作用说明可参考红皮书335页 
    {
        printf("不能打开!\a\n");
        exit(0);
    }
    while (!feof(fp))                            //判断文件是否结束
    {
        if (fread(&info[count], sizeof(struct list), 1, fp)==1)//使用fread函数将文件中的记录逐条读取到结构体数组
            count++;
    }
    fclose(fp);                                     //关闭文件
    if (count==0)                                   //判断当前通讯录是否为空
        printf("当前通讯录中无联系人!\n");
    else
    {
        system("cls");                              //清屏
        f5();                                 //显示联系人的所有信息
    }
    if ((fp=fopen("data.txt", "wb"))==NULL)       //如果打开文件失败
    {
        printf("打开文件失败!\n");
        exit(0);
    }
    //将之前已经保存的联系人信息重写入磁盘
    for (i = 0; i < count; i++)
        fwrite(&info[i], sizeof(struct list), 1, fp);
    printf("是否要添加新联系人的信息:(y—是,n—否)");//提示用户输入
    scanf("%s", ch);
    system("cls"); 
    while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)//判断用户是否需要输入
    {
        printf("姓名:");
        scanf("%s", &info[count].name);
        //判断用户输入姓名在通讯录中是否存在
        for(i=0;i<count;i++)
            if (strcmp(info[i].name, info[count].name) == 0)
            {
                printf("该联系人已存在,按任意键退出");
                getch();                     //输入一个字符但不显示在屏幕上,其函数声明在头文件conio中。 
                fclose(fp);
                return;
            }
        printf("性别:");
        scanf("%s", &info[count].sex);
        printf("年龄:");
        scanf("%s", &info[count].year);
        printf("电话:");
        scanf("%s", &info[count].phone);
        printf("地址:");
        scanf("%s", &info[count].home);
        if (fwrite(&info[count],sizeof(struct list) , 1, fp) != 1)//将新建联系人信息保存到磁盘
        {
            printf("保存失败");
            getch();                       
        }
        else
        {
            printf("%s 已保存!\n", info[count].name);
            count++;
        }
        printf("是否要继续添加新联系人的信息:(y—是,n—否):");
        scanf("%s", ch);
    }
    fclose(fp);
    printf("完成!\n");
}

void f2()
{
    int count = 0,i,j,sign=0;
    char Del_name[20];
    FILE* ptr = fopen("data.txt", "r");
    if (!ptr) {
        printf("文件打开失败,按任意键以继续\n");
        getch();
        return;
    }
    while (!feof(ptr)) {
        if (fread(info, sizeof(struct list), 1, ptr) == 1)
            count++;
    }
    fclose(ptr);
    printf("请输入要删除人的姓名:\n");
    scanf("%s", Del_name);
    for (i = 0; i < count; i++) {
        if (strcmp(info[i].name, Del_name) == 0) {
            sign = 1; break;
        }
    }
    if (!sign) {
        printf("对不起,没有找到所删除联系人,按任意键以继续...\n");
    }
    else {
        for (j = i; j < count&&j<100; j++) {
            strcpy(info[j].name, info[j + 1].name);
            strcpy(info[j].sex, info[j + 1].sex);
            strcpy(info[j].year, info[j + 1].year);
            strcpy(info[j].phone, info[j + 1].phone);
            strcpy(info[j].home, info[j + 1].home);
        }
        printf("已删除%s的信息,按任意键以继续...\n", Del_name);
    }
    getch();
    system("cls");
}

void f3()
{
    FILE *p;//读取已有文件 
    int count=0;
    if((p=fopen("data.txt","a+"))==NULL)
    {
        printf("打开文件失败!\a\n");
    }
    while(!feof(p))
    if(fread(&info[count],sizeof(struct list),1,p)==1)
    count++;//计算已有联系人数量 
    fclose(p);
    if(count==0)
    printf("当前通讯录为空!\n");
    else
    system("cls");//清空初始界面 
    
    char name[20]={0};//开始查找联系人 
    printf("请输入要查找的联系人姓名\n");
    scanf("%s",name);
    int i,x=0;//利用变量x判断输入的联系人是否存在 
    for(i=0;i<=count;i++)
    {
        if(strcmp(info[i].name,name)==0)
        x=i;
    }
    if(x==0)//输出查找结果 
    {
    printf("此联系人不存在\n");
    }
    else
    { 
        printf("以下为查找结果\n");
        printf("姓名: %s\n",info[x].name);
        printf("性别: %s\n",info[x].sex);
        printf("年龄: %s\n",info[x].year);
        printf("电话: %s\n",info[x].phone);
        printf("住址: %s\n",info[x].home);        
    }
printf("按任意键退出 "); 
getch();
fclose(p);//关闭文件 
}

void f4()
{
}

void f5()
{
}


void f6()
    
{struct list t[100];
    int i,j,sign=0;    int count=0; 

    char Del_name[20];

        FILE* ptr = fopen("data.txt", "r");    //读取已有文件

          if (!ptr) {        printf("文件打开失败,按任意键以继续\n");                  

            getch();

                return;    }//判断文件是否正确    

                       while (!feof(ptr))

                    if (fread(info, sizeof(struct list), 1, ptr) == 1)        
                         count++;    //计算已有联系人数量    

                         fclose(ptr);    //关闭文件 
       int n=0;
       
         for(i=0;i<count;i++)
                            {
                            for (j = i; j < count; j++) {
                        
                            strcpy(info[j].name, info[j + 1].name);
        
            strcpy(info[j].sex, info[j + 1].sex);
        
            strcpy(info[j].year, info[j + 1].year);
        
            strcpy(info[j].phone, info[j + 1].phone);
            
            strcpy(info[j].home, info[j + 1].home);}
            }
     
      printf("all contacts have been deleted!\n"); getch();                             
    
    system("cls");

}
                
void f7()
{
    struct list t;     //排序时的结构体类型的交换变量
    int count=0;      
    FILE *f;            //读文件
    if((f=fopen("data.txt","a+"))==NULL)
    {
        printf("无法打开文件!\n\a");
    }
    while(!feof(f))
    if(fread(&info[count],sizeof(struct list),1,f)==1)
    count++ ;
    fclose(f);
    if(count==0)
    printf("\n通讯录中暂无联系人.");
    
    for(int i=0;i<count-1;i++)           //排序 
    for(int j=i+1;j<count;j++)
    {
        if(strcmp(info[i].name,info[j].name)>0)
        {
            t=info[j];
            info[j]=info[i];
            info[i]=t;
        }
    }
            
    if((f=fopen("data.text","wb"))==NULL)    //写文件 
    {
        printf("无法打开文件!\n\a");
    }
    system("cls");          //清屏 
    printf("\n\n\n\n\t\t\t以下为排序结果:\n\n");
    for(int i=0;i<count;i++)
    if(fwrite(&info[i],sizeof(struct list),1,f)==1)
    {
        printf("\t第%d位:%s\t%s\t%s\t%s\t%s",i+1,info[i].name,info[i].sex,info[i].year,info[i].phone,info[i].home);
        printf("\n\n");
    }
    else printf("\n无法保存!");
    fclose(f);
    printf("\n\t\t\t已成功保存!");
    printf("\n\n\t\t\t按任意键退出!\n");
    getch();
}


int main()
{
int type;
menu();
int n;
scanf("%d",&n);
if(n==8) n=0;
while(n)
{
switch(n)
{
type=0;
case 1:f1();break;
case 2:f2();break;
case 3:f3();break;
case 4:f4();break;
case 5:f5();break;
case 6:f6();break;
case 7:f7();break;
case 8:type=1;break;
default :break;
}
if(type==1) break;
menu();
scanf("%d",&n);
}
}

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • qzjhjxj 2021-06-08 16:56
    已采纳

    清空函数这么写,供参考:

    void f6()
    {
        struct list t[100];
        int i,j,sign=0;
        int count=0;
        char Del_name[20];
    
        FILE* ptr = fopen("data.txt", "w");
        if (!ptr) {
            printf("文件打开失败,按任意键以继续\n");
            getch();
            return;
        }//判断文件是否正确
    
        fwrite(NULL, NULL, NULL, ptr);
        fclose(ptr);    //关闭文件
    
        printf("all contacts have been deleted!\n"); getch();
        system("cls");
    }

    另提个建议,每个函数里不需要打开文件、保存文件,可以在主函数系统运行初始加载文件内容到数组,然后中间工作都做完后,退出运行前再统一保存一次文件,就可以了。

    1 打赏 评论
  • qzjhjxj 2021-06-08 10:51

    清空函数,是想清空文件里的内容,还是只清空已读入内存中内容。

    打赏 评论

相关推荐 更多相似问题