用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