Як об’єкти записують і читають самі себе

ІІІнколи є сенс дозволити кожному компоненту класу читати і записувати самого себе. Цей доволі прозорий підхід чудово працює, якщо потрібно писати і читати невелике чило об’єктів. В програмі 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;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.005 сек.