
//Практическая работа номер 1 студента руппы ЭВМ 1-2 Миленина Ильи
//Обработка данных бинарных файлов, работа с текстовыми и бинарными файлами


#include <conio.h>
#include<iostream.h>
#include<stdlib.h>
#include<string.h>
#include<iomanip.h>
#include<fstream.h>
#include<io.h>


//Объявляется структурный тип excurs
struct excurs
{
char  name [20];
char  str [20];
int  days;
double price ;
char  trans [80];
} ex; //объявляется струтурный тип ex



int z=sizeof(excurs);


//определение файловых потоков
ifstream fin, in;         //входного
ofstream fout, out;  //выходного
fstream io, vout;           //двунаправленного


char *sh[]={
"/*                                 Экскурсии                                     ",
"╔════════════════╦════════════════╦═════════════════╦════════════╦══════════════╗",
"║ Наименование   ║  Страна        ║Продолжительность║    Цена    ║  Транспорт   ║",
"╠════════════════╬════════════════╬═════════════════╬════════════╬══════════════╣",
"╚════════════════╩════════════════╩═════════════════╩════════════╩══════════════╝"
};


//удаление пробелов в начале и в конце строки
void filtr(char*a)
{
int i, l=strlen(a),j;

for(i=0;i<l;i++)   //поиск не пробельного символа слева
if(a[i]!=' '&& a[i]!='\t')  //если он найден:
	for(j=l-1;j>=i;j--)   //поиск не пробельного символа справа
	if(a[j]!=' '&& a[j]!='\n') //если он найден:
		{
		for(l=i;l<=j;l++)   //копирование найденного фрагмента строки
		a[l-i]=a[l];   //в начало строки
		a[l-i]='\0';   //обрезание остатка строки
			goto m;     //и переход на конец функции
		}
a[0]=0;   //строка пустая
m: ;
}


//перегрузка операций вставки в поток "<<" и извлечения из потока ">>"
istream& operator>> (istream&in, excurs&ex)
{
char T[80];
cout<<"Поле для ввода\n"
<<"║  Наименование ║    Страна   ║Продолжительность ║  Цена  ║Транспорт║\n";
in.getline(ex.name,17); filtr(ex.name);
cout<<" ";
in.getline(ex.str,15); filtr(ex.str);
cout<<" ";
in>>ex.days;
cout<<" ";
in>>ex.price;
in.getline(ex.trans,80); filtr(ex.trans);
return in;
}

ostream& operator<< (ostream&out,excurs&ex)
{
out<<setiosflags(ios::left)
<<setw(18)<<ex.name
<<setw(17)<<ex.str
<<setw(18)<<ex.days
<<setw(13)<<ex.price
<<setprecision(2)
<<setw(10)<<ex.trans
<<endl;
return out;
}

ostream& operator< (ostream&out,excurs&ex)
{
out<<'\272'<<setiosflags(ios::left)
<<setw(16)<<ex.name<<'\272'
<<setw(16)<<ex.str<<'\272'
<<setw(17)<<ex.days<<'\272'
<<setw(12)<<ex.price<<'\272'
<<setprecision(2)
<<setw(14)<<ex.trans<<'\272'
<<endl;
return out;
}


//Фунция создания текстового файла
void sozdat(char*ftxt)
{
fout.open(ftxt);
out<<"\n       Данные о экскурсии"<<endl;
m: cin>>ex; fout<<ex;  cout<<ex;
cout<<"\nНажмите любую клавишу, если хотите продолжить запись и "
<<"0, если нет."<<endl;
char c; c=getch();
if(c=='0')
	{
	clrscr();
	fout.close();
	return;
	}
else goto m;
}


//Функция создания бинарного файла
void sozdbin(const char* ftxt,const char* fbin)
{
fin.open (ftxt);
if(!fin) {cout<<"Ошибка";exit(1);}

fout.open (fbin, ios::binary);
if(!fout){cout<<"Ошибка";exit(1);}

while(fin.peek()!=EOF)
	{
	fin>>ex;
	cout<<ex;
	fout.write((char*)&ex, z);
	}
fin.close(); fout.close();
}


//Функция коррекции файла данных
void kor(const char*ftxt, const char*fbin)
{
io.open(fbin,ios::in|ios::binary);
fout.open(ftxt);

while (io.peek()!=EOF)
	{
	io.read((char*)&ex,z);
	fout<<ex;
	}
io.close();fout.close();
}


//Функция удаления записей из бинарного файла
void ud(char*fbin, char*fud)
{  int k;
out<<"\n\n    Удаление записей из бинарного файла          \n ";
fin.open(fud);
io.open(fbin, ios::in|ios::out|ios::binary);
fout.open("rab.cpp",ios::binary);
char c[30];
while (fin.peek()!=EOF)
	{
	fin.getline(c,30); filtr (c); cout<<c<<endl;
	if(!strcmp(c,""))
		{
		out<<"Нет наименований для поиска\n";
		continue;
		}
		k=0;
	io.seekg(0,ios::beg);
	while(io.peek()!=EOF)
		{
		io.read((char*)&ex,z);
		if(!strcmp(ex.name,c))
			{
			out<<"Данные об экскурсии - "<<c
			<<" будут удалены" <<endl;
			strcpy(ex.name,"delete");
			io.seekp(-z,ios::cur);
			io.write((char*)&ex,z);
			k++;
			}
		}
		if(k==0)
		out<<"Экскурсия с наименованием "<<c<<" не найдена"<<endl;

	}

io.seekg(0,ios::beg);
while(io.peek()!=EOF)
	{
	io.read((char*)&ex,z);
	if(strcmp(ex.name,"delete"))
	fout.write((char*)&ex,z);
	}
io.close();fout.close();
fout.open(fbin, ios::binary);
in.open("rab.cpp",ios::binary);

while(in.peek()!=EOF)
	{
	in.read((char*)&ex,z);
	fout.write((char*)&ex,z);
	}
fin.close(); in.close(); fout.close();
remove("rab.cpp");
}


//Функция чтения бинарного файла и вывод в таблицу результатов
void cht(char*fbin)
{ out<<"\n        Чтение бинарного файла               \n";
fin.open(fbin,ios::in|ios::binary);
if(!fin){cout<<cout<<"Ошибка";exit(1);}
	for(int i=0; i<4; i++)
	out<<sh[i]<<endl;
while(fin.peek()!=EOF)
	{
	fin.read((char*)&ex,z);
	out<ex;
	};
out<<sh[4]<<endl;
fin.close();
}


void main()
{
out.open ("ZZZ.cpp");
remove("fbin.cpp");
clrscr();
sozdat("Im.cpp");
sozdbin("Im.cpp","fbin.cpp");
cht("fbin.cpp");
ud("fbin.cpp","old.dat");
kor("Im.cpp","fbin.cpp");
cht("fbin.cpp");
out. close();
}
