我正在将文件中的对象保存并显示它们。当我显示它们时,我使用tempobj来存储对象的值。该文件读取正常,但是当while循环终止于显示功能时,我得到一个SEG错误。调试时发现SEG故障发生在tempobj的默认析构函数内部。
void Display(fstream & file )
{
file.seekg(0 , ios::beg) ;
Item tempobj ;
while(file.eof()==false)
{
file.read((char * )&tempobj , sizeof(tempobj)) ;
cout<<tempobj.name << " " <<tempobj.code << " " <<tempobj.prize <<endl;;
}
}
显示方式如下:
file.open("file" , ios::in | ios::binary) ;
obj.Display(file) ;
file.close() ;
这是我的整个计划,如果需要的话。
#include<iostream>
#include<iomanip>
#include<cstdlib>
#include<fstream>
using namespace std ;
class Item
{
public :
string name , code ; float prize ; int numberofItems;
Item(){name = code = "" ; prize = numberofItems =0 ; }
Item(string , string , float , int ) ;
void getData()
{
cout<<"Enter name , code , prize , no_items : " ;
cin>>name >> code >> prize >> numberofItems ;
}
void Display(fstream & file )
{
file.seekg(0 , ios::beg) ;
Item tempobj ;
while(file.eof()==false)
{
file.read((char * )&tempobj , sizeof(tempobj)) ;
cout<<tempobj.name << " " <<tempobj.code << " " <<tempobj.prize <<endl;;
}
}
int update()
{
int index , loc ;
cout<<"Enter the index of object to update ! " ;
cin>>index ;
loc = index * sizeof(*this) ;
getData() ;
return loc ;
}
};
Item::Item(string namevar , string codevar, float pr , int num):name(namevar) , code(codevar) , prize(pr) , numberofItems(num){}
int main()
{
fstream file ;
file.open("file" , ios::app | ios::binary) ;
if(!file){
cout<<"Error in opening file !" ; exit(2) ;
}
Item obj ;
int ch ;
while(1)
{
cout<<"1.Add object 2.Display 3.Update object : " ;
cin>>ch ;
switch(ch)
{
case 1:
obj.getData() ;
file.seekg(0 , ios::end) ;
file.write((char *) &obj , sizeof(obj)) ;
file.close() ;
break ;
case 2:
file.open("file" , ios::in | ios::binary) ;
obj.Display(file) ;
file.close() ;
break ;
case 3 :
file.open("file" , ios::app | ios::binary) ;
int loc = obj.update() ;
file.seekp( loc , ios::beg) ;
file.write((char *) &obj , sizeof(obj)) ;
break ;
}
cout<<endl;
system("clear") ;
}
}