ZERO246 2021-07-20 17:18 采纳率: 100%
浏览 67
已结题

向文件中增删改数据后文件变成乱码

我的代码是关于信息管理系统的。有增删查改等功能,如果先查数据打印到屏幕上,数据显示没有问题。

img
如果增加成员,增加的那个成员变成乱码,且打印到屏幕上也是乱码。其他正常

img
如果删除和修改代码,文件里所有的数据全变成乱码,且打印到屏幕上也是乱码

img

相关代码如下:
//添加成员信息
FILE* ip;
linklist stuff;
if ((ip = fopen("stuff.txt", "a+")) == NULL)
{
printf("ERROR!\n");
exit(0);
}
printf("请输入员工姓名:>\n");
scanf("%s", stuff.name);
printf("请输入员工年龄:>\n");
scanf("%d", &stuff.age);
printf("请输入员工性别:>\n");
scanf("%s", stuff.sex);
printf("请输入员工电话:>\n");
scanf("%s", stuff.tele);
printf("请输入员工部门:>\n");
scanf("%s", stuff.sectionname);
printf("请输入员工迟到早退数量:>\n");
scanf("%d", &stuff.latawork);
printf("请输入员工加班次数:>\n");
scanf("%d", &stuff.workextra);
printf("请输入员工个人创收:>\n");
scanf("%d", &stuff.achieve);
printf("请输入员工地址:>\n");
scanf("%s", stuff.addr);
printf("请输入员工学历:>\n");
scanf("%s", stuff.educ);
if (fwrite(&stuff, sizeof(stuff), 1, ip))
{
printf("员工信息添加成功!\n");
}
fclose(ip);
break;

//删除成员信息
char id[tele1];
printf("请输入要删除的员工电话:>\n");
scanf("%s", id);
linklist* L;
linklist* p;
linklist* q;
L = totallist();
int flag = 0;
q = L;
if (L->next == NULL)
{
L = NULL;
flag = 1;
}
else
{
while (q != NULL)
{
if (!strcmp(q->tele, id))
{
if (q == L)
{
p = L = q->next;
q = L->next;
}
else
{
p->next = q->next;
q = q->next;
}
flag = 1;
break;
}
p = q;
q = q->next;
}
}
if (!flag)
{
printf("电话号码不存在!\n");
break;
}
q = L;
FILE* np;
if (q == NULL)
{
np = fopen("stuff.txt", "w");
printf("删除成功!\n");
break;
}
if ((np = fopen("stuff.txt", "w")) == NULL)
{
printf("警告!员工信息数据库丢失,请尽快找回\n");
exit(0);
}
while (p != NULL)
{
fwrite(p, sizeof(linklist), 1, np);
p = p->next;
}
printf("删除成功!\n");
fclose(np);
break;
}
}
break;
}

//删除函数里面调用的函数
linklist* totallist()
{
FILE* ip;
linklist stuff;
if ((ip = fopen("stuff.txt", "r")) == NULL)
{
printf("警告!员工信息数据库丢失,请尽快找回\n");
exit(0);
}
char buf[200] = { 0 };
fgets(buf, 200, ip);//将np中的信息读到buf里
sscanf(buf, "%s %d %s %s %s %d %d %d %s %s", stuff.name, &stuff.age, stuff.sex, stuff.tele, stuff.sectionname, &stuff.latawork, &stuff.workextra, &stuff.achieve, stuff.addr, stuff.educ);//将buf里的数据赋值到pname里
linklist* L;
linklist* p;
linklist* q;
q = (linklist*)malloc(sizeof(stuff));
int n = 0;
L = NULL;
while (!feof(ip))
{
n++;
strcpy(q->name, stuff.name);
q->age = stuff.age;
strcpy(q->sex, stuff.sex);
strcpy(q->tele, stuff.tele);
strcpy(q->sectionname, stuff.sectionname);
q->latawork = stuff.latawork;
q->workextra = stuff.workextra;
q->achieve = stuff.achieve;
strcpy(q->addr, stuff.addr);
strcpy(q->educ, stuff.educ);
if (n == 1)
{
L = q;
}
else
{
p->next = q;
}
p = q;
q = (linklist*)malloc(sizeof(linklist));
fgets(buf, 200, ip);//将np中的信息读到buf里
sscanf(buf, "%s %d %s %s %s %d %d %d %s %s", stuff.name, &stuff.age, stuff.sex, stuff.tele, stuff.sectionname, &stuff.latawork, &stuff.workextra, &stuff.achieve, stuff.addr, stuff.educ);//将buf里的数据赋值到pname里
}
fclose(ip);
p->next = NULL;
return L;
}
求大家能告诉我这是怎么回事

  • 写回答

2条回答 默认 最新

  • 砻谷踏碓 2021-07-20 17:35
    关注

    存为utf-8的txt,搞定

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月15日
  • 已采纳回答 8月7日
  • 修改了问题 7月20日
  • 修改了问题 7月20日
  • 展开全部

悬赏问题

  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题