Разработка программы задачи методом объектно-ориентированного программирования, страница 2

fstream p_post;      // имя потока класса post

static int razm_zap;      // размер записи в байтах класса post

void post::zapis_zap(int nomer)   )// функция записи в файл записи принимает

//номер записи

{

p_post.seekg((long)(nomer*razm_zap),ios::beg);

p_post.write((char*)&izd,razm_zap);

if(!p_post.good())

{

cout<<'\a';

gotoxy(1,23);

cerr<<”Ошибка записи в файл  “<<imf<<”, нажмите <Enter>\n”;

getch();

exit(-1);}

}

void post::chtenie_zap(int nomer)  // функция чтения записи из файла

//принимает номер записи

{

p_post.seekg((long)(nomer*razm_zap),ios::beg);

p_post.read((char*)&izd,razm_zap);

if(!p_post.good()&&!p_post.eof())

{

cout<<'\a';

gotoxy(1,23);

cerr<<"Ошибка чтения файла " <<imf<<", нажмите <Enter>\n";

getch();

exit(-1);}

}

void post::init()     // функция открытия файла и создания индексного массива

{                            // открытие файла и расчет размера записи

clrscr();

razm_zap=(sizeof izd)+(sizeof naim)+(sizeof mosh);

p_post.open(imf,ios::in|ios::out|ios::nocreate|ios::binary);

if(!p_post)

{

p_post.open(imf,ios::in|ios::out|ios::binary);

if (!p_post)

{

gotoxy(1,23);

clreol();

cerr<<"Ошибка открытия файла "<<imf<<", нажмите <Enter>\n";

getch();

exit(-1);

}

izd[0]='\0';              // создание пустой записи

naim[0]='\0';         // прямой доступ к собственным элементам

mosh=0;

zapis_zap(0);           // прямой доступ к файлу записи пустой записи

}

int pr=0;   // признак записи:0 – пустая, 1 - занятая

int i=0;     // порядковый номер записи файла

chtenie_zap(i);         // прямой доступ к файлу чтения записи файла

while(!p_post.eof())     // цикл создания индексного массива

 {                            // прямой доступ к файлу базового класса ind

init_ind(i,izd);      // создание элемента индексного массива

if(izd[0]!='\0')pr=1;        // установка pr=1 для занятой записи

i++;

chtenie_zap(i);

}

init_kol(i);       // прямой доступ к файлу класса ind, инициализация количества элементов

p_post.clear(0);      // восстановление потока, очистка бита конца файла

if(!pr)           // ввод сообщения о пустом файле при pr==0

{ cout<<'\a';

gotoxy(1,23);

clreol();

cout<<"Файл "<<imf<<" пустой, нажмите <Enter> и <Создание>\n";

getch();}

}

void post::formecran(char*podmenu)  // функция вывода формы документа

{   // принимает название опции подменю

const int col=4;

window(10,3,70,16);  //установка окна для формы документа

textattr(15+(1<<4));  // установка цвета: символы – белые, фон - синий

clrscr();       // очистка окна (документа)

gotoxy(10,2);

cputs("СПРАВОЧНИК ПОСТАВЩИКОВ");

gotoxy(40,2);

cputs(podmenu);        // вывод названия опции подменю

textattr(0+(7<<4));

gotoxy(col,6);

cputs("Наим. поставщика:                           ");

gotoxy(col,8);

cputs("Код изделия:                                     ");

gotoxy(col,10);

cputs("Мощность поставщика:                   ");

window(1,1,80,25);       // восстановление полного экрана

textattr(15+(0<<4));        // восстановление цветности экрана: символы –белые,

//фон черный

gotoxy(1,23);

clreol();   // очистка управляющей строки

}

void post::vvod()   // функция ввода содержимого документа

{

const int col=37;

gotoxy(col,8);

cin>>izd;

gotoxy(col,10);

cin.seekg(0,ios::end);

cin.get(naim,sizeof(naim));

do                              // цикл ввода числа с контролем, повтор при ошибке

{

gotoxy(col,12);

cout<<"        ";           // очистка поля для ввода

gotoxy(col,12);

cin.clear(0);           // восстановление потока, очистка битов ошибок

cin.seekg(0,ios::end);         //очистка буфера ввода

cin>>mosh;

}

while(!cin);       //исп. Перегруженная операция НЕ (!)

}

void post::vyvod()      // функция вывода содержимого документа

{

const int col=37;

gotoxy(col,8);

cout<<izd;

gotoxy(col,10);

cout<<naim;

gotoxy(col,12);

cout<<mosh;

}

void post::sozdanie()   // функция создания / добавления документа в базу

{                  //данных

char ch;

int nomer;        // номер записи

do              // цикл/создания добавления документов

{

formecran("Создание/Добавление");     // вызов функции формы документа

vvod();        // прямой доступ к файлу ввода содержимого документа

nomer=dob_ind(izd);       // прямой доступ к файлу ввода содержимого документа

zapis_zap(nomer);      // прямой доступ к файлу записи в файл

do       // цикл управления клавиатурой, только <Enter> и <Esc>

{

gotoxy(1,23);

cout<<"Продолжить добавление?: <Enter> Да, <Esc> Нет";

ch=getch();

}

while (ch!=13&&ch!=27);

}

while(ch==13);   // конец цикла создания/добавления документов

return;

}

void post::prosmotr()

{

char ch;

int pr=-1;      //первая непустая запись

int i=0;

chtenie_zap(i);

formecran("Просмотр");

vyvod();

for(;;)

{

gotoxy(1,23);

clreol();

cout<<"<- Предыдущая, -> Следующая, <Esc> Выход";

ch=getch();

if(ch==27) break;

if (ch==0&& kbhit())

{

ch=getch();

switch(ch)

{

case 77: i++;

chtenie_zap(i);

if (!p_post.eof())

{

formecran("Просмотр");

vyvod();

}

else

{

cout<<'\a';

gotoxy(45,23);

cout<<"Конец файла";

delay(1000);

i--;

p_post.clear(0);

}

break;

case 75: i--;

if (i>=pr)

{

chtenie_zap(i);

formecran("Просмотр");

vyvod();

}

else

{

cout<<'\a';