Программирование / си++ / 2Semestr / Lab_7 / Отчет
.docМинистерство Образования Российской Федерации
Пермский Государственный Технический Университет
Кафедра ИТАС
Лабораторная работа № 7
ПОТОКОВЫЕ КЛАССЫ
Выполнил: Студент
группы АСУ 04-2
Заколодкин К.А.
Проверил: Ноткин А.М.
Пермь 2005
Постановка задания
1. Определить пользовательский тип данных (класс). Определить и реализовать в нем конструкторы, деструктор, операции присваивания, ввода и вывода для стандартных потоков.
2. Написать программу № 1 для создания объектов пользова-тельского класса (ввод исходной информации с клавиатуры с использованием перегруженной операции “>>) и сохранения их в потоке (файле). Предусмотреть в программе вывод сообщения о количестве сохраненных объектов и о длине полученного файла в байтах.
3. Выполнить тестирование программы.
4. Реализовать для вывода в поток свой манипулятор с параметрами.
5. Написать программу № 2 для чтения объектов из потока, сохранения их в массиве и просмотра массива. Для просмотра объектов использовать перегруженную для cout операцию << и свой манипулятор. Предусмотреть в программе вывод сообщения о количестве прочитанных объектов и байтов.
6. Выполнить программу для чтения из файла сохраненных предыдущей программой объектов и их просмотра.
7. Написать программу № 3 для добавления объектов в поток.
8. Выполнить программу, добавив в поток несколько объектов и просмотреть полученный файл.
9. Написать программу № 4 для удаления объектов из файла.
10. Выполнить программу, удалив из потока несколько объектов и просмотреть полученный файл.
11. Написать программу № 5 для корректировки (т.е. замены) записей в файле.
12. Выполнить программу и просмотреть полученный файл.
Определение пользовательского класса:
//Bibl.h
#ifndef CLASS
#define CLASS
//-----------------------------------------------------------------------
#include<iostream.h>
#include<fstream.h>
#include<afx.h>
//-----------------------------------------------------------------------
class BIBL
{
char name[30];
char autor[30];
float price;
public:
BIBL ();
BIBL (char*,char*,float);
BIBL (const BIBL&);
~BIBL ();
char* GetName();
void Input();
void Show();
friend istream& operator>>(istream&,BIBL&);
friend ostream& operator<<(ostream&,BIBL&);
};
//-----------------------------------------------------------------------
#endif
Реализация манипулятора
#ifndef MANIP
#define MANIP
typedef far ostream&(far *point)(ostream&, int n, char c,int mclass mnp
{
int w;//ширина
char fill;// заполнитель
int prec;//точность
point f
public:
mnp( point F, int W, char FILL,int PREC){w=W; fill=FILL;prec=PREC; f=F;}
friend ostream& operator<<(ostream&, mnp);
};
ostream& operator<<(ostream& out, mnp x)
{ return x.f(out, x.w, x.fill, x.prec ); }
ostream& func(ostream& out, int w, char fill, int prec)
{
out.width(w);
out.precision(prec);
out.fill(fill);
out.flags(ios::left);
return out;
}
mnp mm(int w, char fill,int prec=2)
{ return mnp ( func, w, fill ,prec); }
#endif
Реализация функций find(),del() и repl().
#include<string.h>
#include<stdio.h>
CString Oem(char* );
char* tempname="..\\temp";
char* filename="..\\f.txt";
int find(ifstream& f,char* s)
{
int Size;
BIBL a;
f.seekg(0,ios::end);
Size=f.tellg();
f.seekg(0,ios::beg);
for(int i=0;i<(Size/64);i++)
{
f>>a;
if(strcmp(a.GetName(),s)==0)return i*64;
}
return -1;
}
void del(ifstream& f,char* name)
{
int Pos=find(f,name);
int Size;
BIBL b;
if(Pos==-1)
{
cout<<Oem("\n Нет такого элемента \n");
return;
}
f.seekg(0,ios::end);
Size=f.tellg();
f.seekg(0,ios::beg);
fstream NewFile(tempname,ios::out | ios::binary);
for(int i=0;i<Pos/64;i++)
{
f>>b;
NewFile<<b;
}
f>>b;
for(i=0;i<((Size-Pos)/64-1);i++)
{
f>>b;
NewFile<<b;
}
NewFile.close();
f.close();
remove(filename);
rename(tempname,filename);
}
void repl(ifstream& f,char* name)
{
int Pos=find(f,name);
int Size;
BIBL b;
if(Pos==-1)
{
cout<<Oem("\n Нет такого элемента \n");
return;
}
f.seekg(0,ios::end);
Size=f.tellg();
f.seekg(0,ios::beg);
fstream NewFile(tempname,ios::out | ios::binary);
for(int i=0;i<Pos/64;i++)
{
f>>b;
NewFile<<b;
}
f>>b;
b.Input();
for(i=0;i<((Size-Pos)/64-1);i++)
{
f>>b;
NewFile<<b;
}
NewFile.close();
f.close();
remove(filename);
rename(tempname,filename);
}