自己写的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个回答

是文件读写方式的问题。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");
fight_in_dl
战在春秋 我的回答对您有帮助吗? 如果有帮助,请采纳答案好吗,您的反馈是对我最大的鼓励, 谢谢....!
2 年多之前 回复
u011617830
m51755 谢谢
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!