-2
このプログラムを実行しているときに、ファイルコンパイラの読み取りエラーでアクセス違反のエラーが表示される場合は、この問題で私を助けてください。<<
と>>
演算子を試してみましたが、私はあなたがこのコードを使用してファイルからクラスデータを読み取ることができないこれらのオペレータにファイル内に文字列を持つオブジェクトを保存する
#include<iostream>
#include<conio.h>
#include<string>
#include<fstream>
using namespace std;
class employee
{ private:
int id;
static int count;
public:
string name;
employee *next;
employee()
{ cout<<"enter name:";
cin>>name;
count++;
id=count;
next=NULL;
}
employee(int x)
{}
void setcount(int x)
{count=x;}
void show()
{cout<<"Name: "<<name<<endl;
cout<<"id: "<<id<<endl;
}
void setname(string s)
{name=s;}
string getname()
{return name;}
int getid()
{return id;}
};
int employee::count=0;
class db
{ employee *list;
public:
db()
{ list=NULL; }
void hire()
{employee *e=new employee;
employee *temp=list;
if(list==NULL)
{list=e;}
else{
while(temp->next!=NULL)
{ temp=temp->next; }
temp->next=e;
}//else end
cout<<"hired..."<<endl;
}
void displayall()
{ if(list==NULL)
cout<<"NO record..";
else
{ employee *temp=list;
while(temp!=NULL)
{temp->show();
temp=temp->next; }
}//else end
}
void remove()
{ int id;
int found=0;
cout<<"Enter id to be removed...";
cin>>id;
if(list==NULL)
cout<<"no record..";
else
{ employee *temp=list;
employee *pre=list;
while(temp!=NULL)
{ if(temp->getid()==id)
{ found=1;
employee *e=temp;
e->show();
if(temp==list) //first item to b removed
list=list->next;
else
pre->next=temp->next;
delete e; cout<<"record deleted"<<endl;
break;
}
pre=temp;
temp=temp->next;
}//while end
if(found==0)
cout<<"record not found.."<<endl;
}//else end
}
void searchbyname()
{ string name;
int found=0;
cout<<"enter name..";
cin>>name;
if(list==NULL)
cout<<"no record..";
else
{ employee *temp=list;
while(temp!=NULL)
{ if(temp->getname()==name)
{ found=1;
temp->show();}
temp=temp->next;
}//while end
if(found==0)
cout<<"record not found.."<<endl;
}//else end
}
void save()
{ ofstream out;
out.open("eb",ios::out | ios::binary);
if(!out)
cout<<"cannot save..";
else
{ employee *temp=list;
while(temp!=NULL)
{ out.write((char*) temp,sizeof(employee));
temp=temp->next;
}
out.close();
}
}
void retrieve()
{ ifstream in;
in.open("eb",ios::in | ios::binary);
if(!in)
cout<<"cannot retrieve..";
else
{ employee *temp=NULL;
employee e(0);
while(1)
{ in.read((char*) &e,sizeof(employee));
employee *p=new employee(e); //dynamically creating an employee that will have the same value as 'e' and saving its address in p. Every node in link list has different location so p will be different. &e is always same. So actually read node from file in e than create a node dynamically with same contents and address will be save in p.
if(list==NULL)
{list=p;
temp=list;
p->show();}
else{
temp->next=p;
temp=temp->next;
e.show();
if(e.next==NULL)
{ e.setcount(e.getid()); break;}
}
}
in.close();
}
}
};
void main()
{
db obj;
try{ obj.retrieve();
int op;
while(1)
{ cout<<endl<<"Enter 1 to hire ,2 for remove ,3 for displayall, 4 for search by name.. 5 for exit";
cin>>op;
switch(op)
{case 1:
obj.hire(); break;
case 2:
obj.remove(); break;
case 3:
obj.displayall(); break;
case 4:
obj.searchbyname(); break;
}
if(op==5)
break;
}
obj.save();
}
catch(...)
{cout<<"error..";}
getch();
}
表示されているコードは、わずらわしいインデントのために完全に判読できません。コードを適切にインデントし、クラッシュの理由を判断するためにデバッガを使用して一度に1行ずつコードをステップ実行します。 –
コードは実際には読めないものの、あなたが「in.read((char *)&e、sizeof(employee));」のようなことをしていると予測できました。その理由は、 'employee'はメンバーとして' std :: string'を含んでいるため、POD型ではないからです。私はこれが何度も何度も見ています。これは、これがオブジェクトをファイルに読み書きする方法の多くが教えられているようです。 C++での適切なオブジェクトの直列化について読んでください。 – PaulMcKenzie