m51755 2017-04-20 16:29 采纳率: 33.3%
浏览 983
已采纳

自己写的C语言通讯录,存在问题,求指点

显示和查找功能都有问题
是文件读写问题吗。。
#include
#include
#include
#include
#define SIZE 100
struct addr{
char name[10];
int phone[10];
char address[30];
int zip[10];
char email[30];
}contact[SIZE];
FILE *fp;
int n = 0;
void fileread()
{
if((fp=fopen("contact.txt","r")) == NULL)
{
printf("文件不存在!\n");
if((fp=fopen("contact.txt","w")) == NULL)
{
printf("文件写入失败!\n");
exit(0);
}
exit(0);
}
fseek(fp,0,2);
if(ftell(fp) > 0)
{
rewind(fp);
for (n = 0; !feof(fp) && fread(&contact[n],sizeof(struct addr),1,fp); n++);
}
}
void menu()
{
system("cls");
printf("[1]显示联系人\n");
printf("[2]查找联系人\n");
printf("[3]新建联系人\n");
printf("[4]删除联系人\n");
printf("[5]修改联系人\n");
printf("[0]退出\n");
printf("请输入你的选项:");
}
void new_contact()
{
if(n == SIZE)
printf("联系人已满!\n");
printf("请输入姓名:");
scanf("%s", contact[n].name);
printf("电话号码:");
scanf("%d", contact[n].phone);
printf("地址:");
scanf("%s", contact[n].address);
printf("邮政编码:");
scanf("%d", contact[n].zip);
printf("email:");
scanf("%s", contact[n].email);
n++;

int i;
if((fp=fopen("contact.txt", "w")) == NULL)
    printf("打开文件失败!\n");
for(i = 0; i < n; i++)
    if(fwrite(&contact[i],sizeof(struct addr),1,fp) != 1)
        printf("写入文件失败!\n");
fclose(fp);
//exit(0);

}
void search_contact()
{
int i, flag = 0;
char name[10];
system("cls");
//if(n == 0)
//printf("没有联系人");
//else
//{
printf("请输入要查找的联系人姓名:");
scanf("%s", name);
for(i = 0; i < n; i++)
if(strcmp(contact[i].name,name) == 0)
{
printf("姓名:%s", contact[i].name);
printf("电话号码:%d", contact[i].phone);
printf("地址:%s", contact[i].address);
printf("邮政编码:%d", contact[i].zip);
printf("email:%s", contact[i].email);
flag = 1;
}
//}
if(flag == 0)
printf("不存在该联系人");
}
void display_contact()
{
int i;
system("cls");
if(n == 0)
printf("没有联系人");
else
{
printf("姓名\t 电话号码\t 地址\t 邮政编码\t email\n");
for(i = 0; i < n; i++)
{
printf("%s\t", contact[i].name);
printf("%d\t", contact[i].phone);
printf("%s\t", contact[i].address);
printf("%d\t", contact[i].zip);
printf("%s\n", contact[i].email);
}
}
}
void update_contact()
{
int i, flag = 0;
char name[10];
system("cls");
if(n == 0)
printf("没有联系人");
printf("请输入要修改的联系人姓名:");
scanf("%s", &name);
for(i = 0; i < n; i++)
if(strcmp(contact[i].name,name) == 0)
{
printf("以下是要修改的联系人信息:");
printf("姓名\t 电话号码\t 地址\t 邮政编码\t email\n");
printf("%s\t", contact[i].name);
printf("%d\t", contact[i].phone);
printf("%s\t", contact[i].address);
printf("%d\t", contact[i].zip);
printf("%s\n", contact[i].email);
printf("是否修改?(Y/N)");
if((getchar() == 'y') || (getchar() == 'Y'))
{
flag++;
printf("请输入新姓名:");
scanf("%s", contact[i].name);
printf("请输入新的电话号码:");
scanf("%d", contact[i].phone);
printf("请输入新的地址:");
scanf("%s", contact[i].address);
printf("请输入新的邮政编码:");
scanf("%d", contact[i].zip);
printf("请输入新的email:");
scanf("%s", contact[i].email);
}
else
return;
}
if(flag == 0)
printf("不存在该联系人");
}
void delete_contact()
{
int m, i, flag = 0;
char name[10];
system("cls");
if(n == 0)
printf("没有联系人");
printf("请输入你要删除的联系人姓名:");
scanf("%s", name);
for(i = 0; i < n; i++)
if(strcmp(contact[i].name,name) == 0)
{
printf("确定删除此联系人?(Y/N)");
if((getchar() == 'y') || (getchar() == 'Y'))
{
for(m = i; m < n-1; m++)
contact[m] = contact[m+1];
n--;
flag++;
printf("删除成功!\n");
}
else
return;
}
if(flag == 0)
printf("不存在该联系人");
}
int main()
{
int choice;
fileread();
while(1)
{
menu();
scanf("%d", &choice);
switch(choice)
{
case 1: display_contact(); break;
case 2: search_contact(); break;
case 3: new_contact(); break;
case 4: delete_contact(); break;
case 5: update_contact(); break;
case 0: exit(0);
default: printf("输入不合法!\n"); break;
}
}
return 0;
}

  • 写回答

1条回答

  • 战在春秋 2017-04-20 22:16
    关注

    是文件读写方式的问题。fopen如果用w方式打开,会覆盖旧文件。

    Create an empty file for output operations. If a file with the same name already exists, its contents are discarded and the file is treated as a new empty file.

     void fileread()
    {
        if ((fp = fopen("contact.txt", "a+")) == NULL)
        {
            printf("文件写入失败!\n");
        }
        else
        {
            fseek(fp, 0, 2);
            if (ftell(fp) > 0)
            {
                rewind(fp);
                for (n = 0; !feof(fp) && fread(&contact[n], sizeof(struct addr), 1, fp); n++);
            }
        }
    }
    

    另外调试中发现另外一个问题,menu函数中不要清屏,否则看不到结果,即注释掉menu函数中:

     //system("cls");
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 Stata 面板数据模型选择
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用