读写文件的时候数据出错 c++

用reinterpret_cast<char*>(&x)向文件中写内容的时候,先写一个int 再写入10条结构体。之后再从文件中读取第一个结构体的时候,结构体中的第一个成员变量的数据和我写进去的时候不一样。在写前9条结构体的时候都不会出错,一旦写入第10条就会出错。

struct In_Out {
    long long ID;//申请人学号
    int Type;//申请类型
    char Campus[20] = { 0 };//校区
    _Date In_Date;//入校日期
    _Date Out_Date;//出校日期
    char Reason[150] = { 0 };//申请事由
};

struct _Date {
    int Year = 2019;//年
    int Month = 1;//月
    int Day = 1;//日
};

这是两个结构体

void submitApplication()
{
    
    int no=0;
    fstream outfile("Application.txt");
    outfile.seekg(0);
    outfile.read(reinterpret_cast<char*>(&no), sizeof(int));
    system("cls");
    cout << "请输入学号\n";
    In_Out* p = new In_Out;
    cin >>p->ID;

    cout << "请选择您所在的校区(输入“0”代表闵行校区,输入“1”代表徐汇校区)\n";
    int campus;
    bool isValid = true;
    do
    {
        isValid = true;
        cin >> campus;
        cin.get();
        switch (campus)
        {
        case 0:
            strcpy(p->Campus, "闵行");
            break;
        case 1:
            strcpy(p->Campus, "徐汇");
            break;
        default:
            isValid = false;
            cout << "输入无效,请重试";
            break;
        }
    } while (!isValid);

    cout << "请选择您的申请类型(输入“0”代表仅进校,输入“1”代表仅出校,输入“2”代表进出校)\n";
    do
    {
        isValid = true;
        cin >> p->Type;
        cin.get();
        if (!(p->Type == 0 || p->Type == 1 || p->Type == 2))
        {
            cout << "输入无效,请重试";
            isValid = false;
        }
    } while (!isValid);

    char year[5];
    char month[3];
    char day[3];
    switch (p->Type)
    {
    case 0:
        cout << "请输入您的进校日期(如2022年9月7日则输入“20220907”)\n";
        for (int i = 0; i < 4; i++)
        {
            cin.get(year[i]);
        }
        for (int i = 0; i < 2; i++)
        {
            cin.get(month[i]);
        }
        for (int i = 0; i < 2; i++)
        {
            cin.get(day[i]);
        }
        cin.get();
        p->In_Date.Year = atoi(year);
        p->In_Date.Month = atoi(month);
        p->In_Date.Day = atoi(day);
        break;
    case 1:
        cout << "请输入您的出校日期(如2022年9月7日则输入“20220907”)\n";
        for (int i = 0; i < 4; i++)
        {
            cin.get(year[i]);
        }
        for (int i = 0; i < 2; i++)
        {
            cin.get(month[i]);
        }
        for (int i = 0; i < 2; i++)
        {
            cin.get(day[i]);
        }
        cin.get();
        p->Out_Date.Year = atoi(year);
        p->Out_Date.Month = atoi(month);
        p->Out_Date.Day = atoi(day);
        break;
    case 2:
        cout << "请输入您的进校日期(如2022年9月7日则输入“20220907”)\n";
        for (int i = 0; i < 4; i++)
        {
            cin.get(year[i]);
        }
        for (int i = 0; i < 2; i++)
        {
            cin.get(month[i]);
        }
        for (int i = 0; i < 2; i++)
        {
            cin.get(day[i]);
        }
        cin.get();
        p->In_Date.Year = atoi(year);
        p->In_Date.Month = atoi(month);
        p->In_Date.Day = atoi(day);
                cout << "请输入您的出校日期(如2022年9月7日则输入“20220907”)\n";
        for (int i = 0; i < 4; i++)
        {
            cin.get(year[i]);
        }
        for (int i = 0; i < 2; i++)
        {
            cin.get(month[i]);
        }
        for (int i = 0; i < 2; i++)
        {
            cin.get(day[i]);
        }
        cin.get();
        p->Out_Date.Year = atoi(year);
        p->Out_Date.Month = atoi(month);
        p->Out_Date.Day = atoi(day);
    default:
        break;
    }

    cout << "请输入您的申请事由(以换行结束)\n";
    cin.getline(p->Reason, 150, '\n');

    outfile.seekp(sizeof(int) + no * sizeof(In_Out));
    outfile.write(reinterpret_cast<char*>(p), sizeof(*p));
    delete p;
    p = NULL;

    no++;
    outfile.seekp(0);
    outfile.write(reinterpret_cast<char*>(&no), sizeof(int));
    outfile.close();
    system("cls");
    cout << "您已成功提交申请\n";
    cout << endl;
}

这是写入文件的函数

void inquireApplication()
{
    system("cls");
    cout << "请输入您要查询的学号\n";
    long long ID;
    cin >> ID;
    cin.get();
    int i;
    bool flag = false;
    int no;
    fstream outfile("Application.txt");
    outfile.seekg(0);
    outfile.read(reinterpret_cast<char*>(&no), sizeof(int));
    In_Out temp;
    for (i = 0; i < no; i++)
    {
        outfile.seekg(sizeof(int) + i * sizeof(In_Out));
        outfile.read(reinterpret_cast<char*>(&temp), sizeof(In_Out));
        if (ID == temp.ID)
        {
            flag = true;
            break;
        }
    }
    if (flag)
    {
        system("cls");
        cout << "您所在的校区是:" << temp.Campus << endl;
        cout << "您的申请类型是:";
        switch (temp.Type)
        {
        case 0:
            cout << "仅进校" << endl;
            break;
        case 1:
            cout << "仅出校" << endl;
            break;
        case 2:
            cout << "进出校" << endl;
            break;
        default:
            break;
        }
        switch (temp.Type)
        {
        case 0:
            cout << "您的进校日期为:";
            cout << temp.In_Date.Year << "年" << temp.In_Date.Month << "月" << temp.In_Date.Day << "日" << endl;
            break;
        case 1:
            cout << "您的出校日期为:";
            cout << temp.Out_Date.Year << "年" << temp.Out_Date.Month << "月" << temp.Out_Date.Day << "日" << endl;
            break;
        case 2:
            cout << "您的进校日期为:";
            cout << temp.In_Date.Year << "年" << temp.In_Date.Month << "月" << temp.In_Date.Day << "日" << endl;
            cout << "您的出校日期为:";
            cout << temp.Out_Date.Year << "年" << temp.Out_Date.Month << "月" << temp.Out_Date.Day << "日" << endl;
            break;
        }
        cout << "您的申请事由为:";
        cout << temp.Reason << endl;
        cout << endl;
    }
    else
    {
        cout << "该学号无申请记录\n";
        cout << endl;
        bool isValid = false;
        while (!isValid)
        {
            cout << "是否重新输入?(输入“y”代表确认重新输入,输入“n”代表退出删除申请界面)\n";
            char choice;
            cin >> choice;
            cin.get();
            if (choice == 'y')
            {
                system("cls");
                inquireApplication();
                isValid = true;
            }
            else if (choice == 'n')
            {
                system("cls");
                return;
            }
            else
            {
                cout << "无效输入,请重试\n";
                cout << endl;
            }
        }
    }
    return;
}

这是读文件的函数

可否贴一下报错,好方便debug

说半天不如上代码,包括输入输出内容截图

把你的错误贴图吧

你没有贴报错的,也不好帮你查看
帮你找了两篇,可以看看如有帮助,望采纳
C++文件读写详解
https://www.cnblogs.com/zhengfa-af/p/8145443.html
https://blog.csdn.net/qq_42676511/article/details/126057849

s