class Student
{
public:
Student *prev;
char S_Name[15];
char F_Name[15];
int Reg_Num;
char Section;
char MAoI[15];
float CGPA;
Student *next;
}
我有上面的类,我想在退出程序时将数据写入链接列表的二进制文件,并在程序运行时再次将其读回并形成链接列表。 我曾尝试但多次尝试都失败了!
输入数据的代码`Student * Add_Entry() { 学生*临时=新学生();
char s_Name[15];
char f_Name[15];
int reg_Num;
char section;
char mAoI[15];
float cGPA;
cout <<"**********************Menu***************************\n ";
cout<<"\nEnter the Studets name \"";
cin>>s_Name;
cout<<"\nEnter Father`s name \"";
cin>>f_Name;
cout<<"\nEnter the Registration Number \"";
cin>>reg_Num;
cout<<"\nEnter the Section \"";
cin>>section;
cout<<"\nEnter the Major Area of Interest \"";
cin>>mAoI;
cout<<"\nEnter the Current CGPA \"";
cin>>cGPA;
strcpy_s(temp->S_Name,s_Name);
strcpy_s(temp->F_Name,f_Name);
temp->Reg_Num=reg_Num;
temp->Section=section;
strcpy_s(temp->MAoI,mAoI);
temp->CGPA=cGPA;
temp->next=NULL;
temp->prev=NULL;
return temp;
//temp=Create_node(s_Name,f_Name,reg_Num,section,mAoI,cGPA);
}`
要从文件中读取,请使用`char * buffer;
ifstream reader;
reader.open("student.bin",ios::in | ios::binary);
if(reader.is_open)
{
do
{
reader.read(buffer,ch);
if(Header==NULL)
{
Header=(Student)*buffer;
temporary=Header;
}
else
{
temporary->next=(Student)*buffer;
temporary=temporary->next;
}
}while(buffer!=NULL);
}
`
编写我使用`temporary = Header; //备份条目 作者; writer.open(“student.bin”,ios :: out | ios :: binary);
while(temporary!=NULL)
{
writer.write((char)* temporary,sizeof(temporary));
temporary=temporary->next;
}
writer.close();
`
答案 0 :(得分:0)
这一行:
Header=(Student)*buffer;
意思是:获取缓冲区,它可能是指向char的指针,并取消引用它,以获得char
。然后将char
投射到Student
。编译器不知道如何将char
转换为Student
。
如果你这样做:
Header= *((Student *)buffer);
它会将指针强制转换为正确类型的指针,然后取消引用它以提供可以复制的结构。
你到处都这样做。
此外,在阅读时,您不会填写最后一项的“下一个”指针,也不会填写任何“prev”指针。虽然最后保存的项目中的“下一个”指针可能为零(假设它已正确保存),但是prev指针可以指向任何内容。最佳做法是正确初始化所有内容。
此外:
if(reader.is_open)
应该是:
if(reader.is_open())