主要是对结构体和fread函数使用规则的不熟悉,导致该段程序能过编译但运行出错。目前属于一筹莫展的状态,从断点的执行的结果来看,问题出在第一次使用fread函数时。对文件使用二进制ab+写入还是用w+直接写入都无法避免该问题,之前看到sizeof不能用于二进制的长度计算,但好像也不是该问题。求各位看看问题在哪,谢谢了。
#define N 100 //最大容量为100
typedef struct student //定义一个结构
{
char name[10];
char number[15];
char category[10];
char address[20];
char birthday[10];
}people;
struct student stu[N];
//菜单
void menu() //目录
{
system("cls"); //清屏
printf(" 欢迎使用手机通讯录 \n");
printf(" 1.添加联系人 \n");
printf(" 2.查询联系人 \n");
printf(" 3.修改联系人 \n");
printf(" 4.删除联系人 \n");
printf(" 5.拨号 \n");
printf(" 6.生日查询 \n");
printf(" 0.退出 \n");
printf("\n");
printf("请选择相应的功能:");
}
void input()
{
FILE* fp; //定义文件指针
people ry, s; // 定义两个people结构体的量
int size=0;
if ((fp = fopen("people.dat", "w+")) == NULL)
{
printf("can't open file!\n"); exit(0);
}
printf("\n录入格式为\n姓名:号码:类别:邮箱:生日:\n");
while ((fp = fopen("people.dat", "w+")) != NULL);
{
printf("请输入姓名:");
scanf_s("%s", &ry.name,100);//100避免造成溢出
printf("请输入电话号码:");
scanf_s("%s", &ry.number,100);
printf("请输入类别(A办公类B个人类C商务类):");
scanf_s("%s", &ry.category,100);
printf("请输入邮箱地址:");
scanf_s("%s", &ry.address,100);
printf("请输入生日:");
scanf_s("%s", &ry.birthday,100);
fseek(fp, 0, SEEK_SET);//指针定位到文件开始位置
** fread(&s, sizeof(people), 1, fp);//s**
while (!feof(fp))//条件不是文件尾时执行后续代码
{
if (strcmp(s.number, ry.number) == 0)
{
printf("号码已经存在,不能记录.\n"); break;
}//遇到有相同的号码
fread(&s, sizeof(people), 1, fp);//s;
}
if (feof(fp)) //读取后如没有相同的号码
fwrite(&ry, sizeof(people), 1, fp); //将信息写入文件
}
fclose(fp); //关闭文件
getchar(); //接受一个输入
}
