Як об’єкти записують і читають самі себе
ІІІнколи є сенс дозволити кожному компоненту класу читати і записувати самого себе. Цей доволі прозорий підхід чудово працює, якщо потрібно писати і читати невелике чило об’єктів. В програмі 26.12 додано два методи – diskOut() та diskIn() – до класу person. Ці функції дозволяють об’єктам person записувати себе в файл і читати себе ж з нього.
Приймемо деякі спрощуючі припущення. По-перше, всі об’єкти будуть зберігатися в тому ж файлі persfile.dat. По-друге, нові об’єкти завжди дописуватимуться в кінець файлу. Аргумент функції diskIn() дозволяє читати дані про будь-який об’єкт з файлу. Для відвернення спроб прочитати дані, що виходять за межі файлу, ми включаємо в програму статичний метод diskCount(), що повертає число об’єктів, інформація про яких зберігається в файлі. При вводі даних слід використовувати лише прізвища, пробіли не допускаються.
#include<fstream>
#include<iostream>
#include<conio>
using namespace std;
class person
{protected:
char name[40];
int age;
public:
void getData()
{cout<<”\n Vvedit pip “;cin>>name;
cout<<”Vvedit vik “;cin>>age;
}
void showData()
{cout<<”\n Name “<<name;
cout<<”\nVik “<<age;
}
void diskin(int);
void diskout();
static int diskcount();
};
//////////////////
void person::diskin(int pn) //читання даних про pn осіб
{ifstream infile; //створити файл
infile.open(“persfile.dat”,ios::binary);//відкрити файл
infile.seekg(pn*sizeof(person));
infile.read((char*)this,sizeof(*this));
}
void person::diskout() //запис в кінець файлу
{ofstream outfile;
outfile.open(“persfile.dat”,ios::app|ios::binary);
outfile.write((char*)this,sizeof(*this)); //записати в файл
}
int person::diskcount()
{ifstream infile;
infile.open(“persfile.dat”,ios::binary);
infile.seekg(0,ios::end);
return (int)infile.tellg()/sizeof(person);
}
/////////////
int main()
{ person p;
char ch;
int n,j;
do
{cout<<”Vvedit dani pro osobu “;
p.getData();
p.diskout();
cout<<”Continue(y/n)”;
cin>>ch;
} while (ch==’y’);
n=person::diskcount();
cout<<”V faili “<<n<<” osib\n”;
for(j=0;j<n;j++)
{cout<<”\nOsoba “<<j;
p.diskin(j);
p.showData();
};
cout<<endl;
getch();
return 0;
}
Програма 26.12
Програма виглядає досить зрозумілою і схожою на попередні. Врахуймо тільки, що всі подробиці дискових операцій невидимі для main() і сховані всередині класу person.
Зарані ніколи невідомо, де знаходяться дані, з якими ми збираємося працювати, оскільки кожен об’єкт знаходиться в своїй області пам’яті. Але вказівник this завжди підкаже, де ми знаходимося під час виконання будь-якого методу. В потокових функціях read() і write() адреса об’єкту, який буде читатися чи записуватися, рівна *this, а його розмір – sizeof(*this).
Дата добавления: 2015-08-26; просмотров: 536;