磁盘文件读出出现乱码

文件读出出现乱码,请各位帮我看看怎么回事

这是打印到磁盘文件的代码:
Status Writelist(Link L)
{
if (L.head->next == NULL)
{
cout << "错误,无法存储数据!" << endl;
return error;
}
FILE* fp;
errno_t err;
LinkList p = L.head->next;
if ((err = fopen_s(&fp, "test", "w")) != 0)
{
printf("error,cannot open this file\n");
return error;
exit(1);
}
while (p != NULL)
{
fprintf(fp, "姓名:%s", p->data.name);
fprintf(fp, " 年龄:%s", p->data.age);
fprintf(fp, " 学号:%s", p->data.num);
fprintf(fp, " 性别:%s", p->data.sex);
fprintf(fp, " 籍贯:%s\n", p->data.place);
p = p->next;
}
cout << "数据存储成功!" << endl;
fclose(fp);
return OK;
}//存储数据

这是从磁盘文件读出并打印到调试窗口的代码
Status Readlist()
{
LinkList p;
p = new LNode[1];
FILE* fp;
errno_t err;
if ((err = fopen_s(&fp, "test", "r")) != 0)
{
printf("error,cannot open this file\n");
return error;
exit(1);
}
rewind(fp);
if (!feof(fp))
{
while (!feof(fp))
{
/LinkList current = (LinkList)malloc(sizeof(LNode));
if (current == NULL)
{
printf("No memory!");
exit(0);
}
current->next = NULL;/
fscanf_s(fp, "%s(还有4个%s未写出,因为审核过不了,只能这样)", p->data.name,10, p->data.age,10 ,p->data.num,15, p->data.sex,10, p->data.place,20);/fread(&(current->data), sizeof(Person), 1, fp);/
fscanf_s(fp, "\n");
cout << p->data.name << endl;

    cout << p->data.age << endl;

    cout << p->data.num << endl;

    cout << p->data.sex << endl;

    cout << p->data.place << endl;
    /*if (feof(fp))
    {
        free(current);
        break;
    }*/
}
fclose(fp);
cout << "历史数据读取成功!" << endl;
return OK;

}
else
{
cout << "无历史数据,读取失败!" << endl;
return error;
}
}//从文件读取数据

img

img

img

我想要达到的结果
正常从磁盘文件读出

2022.5.30 ,今天重新做了修改完善,后附运行的截图,供参考:

#include <string.h>
#include <stdio.h>
#include <iostream>
#define OK 1
#define error 0
using namespace std;
typedef int Status;
typedef struct Person
{
char name[10];
char age[10];
char num[15];
char sex[4];
char place[20];
}Person;

typedef struct lnode {
    Person data;
    struct lnode* next;
}LNode, * LinkList, Link;

Status Writelist(LinkList L)
{
    if (L->next == NULL){
        cout << "错误,无法存储数据!" << endl;
        return error;
    }
    FILE* fp;
    errno_t err;
    LinkList p = L->next;
    if ((err = fopen_s(&fp, "test", "w")) != 0){
        printf("error,cannot open this file\n");
        return error;
        exit(1);
    }
    while (p != NULL){
        fprintf(fp, "姓名:%s 年龄:%s 学号:%s 性别:%s 籍贯:%s\n",
            p->data.name, p->data.age, p->data.num, p->data.sex, p->data.place);
        p = p->next;
    }
    cout << "数据存储成功!" << endl;
    fclose(fp);
    return OK;
}//存储数据

//这是从磁盘文件读出并打印到调试窗口的代码
Status Readlist(LinkList* head)
{
    FILE* fp;
    errno_t err;
    if ((err = fopen_s(&fp, "test", "r")) != 0){
        printf("error,cannot open this file\n");
        return error;
        exit(1);
    }
    if (!feof(fp)){
        char buff[1003] = { 0 };
        LinkList phead = NULL, p = NULL;
        phead = (*head) = (LinkList)malloc(sizeof(LNode));
        (*head)->next = NULL;
        while(1) //(!feof(fp))
        {
            memset(buff, 0, 1003);
            if (fgets(buff, 1003, fp) == NULL) break;
            p = (LinkList)malloc(sizeof(LNode));
            if (p == NULL){
                printf("No memory!");
                exit(0);
            }
            p->next = NULL; 
            int ret = sscanf(buff, "%*[^:]:%s %*[^:]:%s %*[^:]:%s %*[^:]:%s %*[^:]:%s", 
                         p->data.name, p->data.age, p->data.num, p->data.sex, p->data.place);
            if (ret == 5) {
                phead->next = p;
                phead = p;

                cout << p->data.name << endl;
                cout << p->data.age  << endl;
                cout << p->data.num  << endl;
                cout << p->data.sex  << endl;
                cout << p->data.place << endl;
            }
            else
                free(p);
        }
        fclose(fp);
        cout << "历史数据读取成功!" << endl;
        return OK;
    }
    else
    {
        fclose(fp);
        cout << "无历史数据,读取失败!" << endl;
        return error;
    }
}//从文件读取数据

int main()
{
    int i, n = 3;
    Link* L = (LinkList)malloc(sizeof(LNode)), * q = L;
    L->next = NULL;
    for (i = 0; i < n; i++) {    //输入3个学生的信息
        LinkList p = (LinkList)malloc(sizeof(LNode));
        p->next = NULL;
        printf("姓名:");
        scanf("%s", p->data.name);
        printf("年龄:");
        scanf("%s", p->data.age);
        printf("学号:");
        scanf("%s", p->data.num);
        printf("性别:");
        scanf("%s", p->data.sex);
        printf("籍贯:");
        scanf("%s", p->data.place);
        q->next = p;
        q = p;
    }
    Writelist(L);  //写入文件
    q = NULL;
    Readlist(&q);  //文件读出到链表
    while (q->next) { //主函数显示读取的文件内容到链表
        printf("%s %s %s %s %s\n", q->next->data.name, q->next->data.num, 
                q->next->data.age, q->next->data.sex, q->next->data.place);
        q = q->next;
    }
    return 0;
}

img

img