/*

необходимо создать программу ведения базы данных, реализованной в виде двоичного файла.

Записи базы должны быть представлены в виде структур (struct).

Для каждой базы должна быть реализована возможность добавления новой записи или удаления существующей.

Также программа должна обеспечивать вывод результатов запросов, указанных в задании.

Создать программу ведения базы данных личной библиотеки. Программа должна обеспечивать:

  ввод и корректировку информации о новых книгах;

  поиск информации о книгах определенного автора;

  поиск информации о книгах определенного жанра.

*/

#include "stdafx. h"

#include <cctype>

#include <cstring>

#include <cstdlib>

#include <iomanip>

#include <iostream>

#include <fstream>

using namespace std;

const int SIZE=100;

struct inv_type

{

       char name[15];                        // Название книги

       char author[15];                // Автор

       char genre[15];                        // Жанр

       char description[45];        //Описание

}invtry[SIZE] ;

void enter();

void init_list();

void display();

void update();

void remove();

void author();

void genre();

void input(int i);

int menu();

void title();

void dis(int i);

void saveToFile();

НЕ нашли? Не то? Что вы ищете?

void loadFromFile();

int main()

{

       setlocale(LC_ALL,"Russian");

       char choice;

       init_list();

       for(;;)

       {

               choice = menu();

               switch(choice)

               {

                       case '1': author();

                               break;

                       case '2': genre();

                               break;

                       case 'e': enter();

                               break;

                       case 'd': display();

                               break;

                       case 'u': update();

                               break;

                       case 'r': remove();

                               break;

                       case 's':saveToFile();

                               break;

                       case 'l':loadFromFile();

                               break;

                       case 'q': return 0;

               }

       }

}

//вывод названия столбцов

void title()

{

       int width=15;

       cout<< left // выравнивание по левому краю

               << setw(width)<<"Название"

               << setw(width)<<"Автор"

               << setw(width)<<"Жанр"

               << setw(width*3)<<"Описание"<< endl;

}

//Вывод на экран строк

void dis(int i)

{

       int width=15;

       cout<< left // выравнивание по левому краю

               << setw(width)<<invtry[i].name

               << setw(width)<<invtry[i].author

               << setw(width)<<invtry[i].genre

               << setw(width*3)<<invtry[i].description<<endl;

}

// Инициализация массива структур.

void init_list()

{

       int t;

       // Имя нулевой длины означает пустое имя.

       for(t=0;t<SIZE;t++)

       {

               *invtry[t].name='\0';

               *invtry[t].author='\0';

               *invtry[t].genre='\0';

               *invtry[t].description='\0';

       }

}

// Получение команды меню, выбранной пользователем.

int menu()

{

       char ch;

       cout<<'\n';

       do

       {

               cout<<"(E)nter\n";                                        // Ввести новый элемент,

               cout<<"(D)isplay\n";                                // Отобразить всю ведомость,

               cout<<"(U)pdate\n";                                        // Изменить элемент,

               cout<<"(R)emove\n";                                        // Удалить элемент

               cout<<"(1)Search by author\n";                // Поиск информации о книгах определенного автора;

         cout<<"(2)Search by genre\n";                // Поиск информации о книгах определенного жанра.

               cout<<"(S)ave\n";

               cout<<"(L)oad\n";

               cout<<"(Q)uit\n\n";                                        // Выйти из программы,

               cout<<"Выберите команду: ";

               cin>>ch;

       }  while(!strchr("eduqr12sl", tolower(ch)));

       return tolower(ch);

}

// проверка для ввода информации(input).

void enter()

{

       int i;

       // Находим первую свободную структуру.

       for(i=0; i<SIZE; i++)

               if(!*invtry[i].name) break;

       // Если массив полон, значение i будет равно SIZE.

       if(i==SIZE)

       {

               cout << "Список полон.\n";

               return;

       }

       input (i);

}

// Ввод информации,

void input(int i)

{

       cout<<"Название: ";

       cin>>invtry[i].name;

       

       cout<< "Автор: ";

       cin>>invtry[i].author;

       

       cout<<"Жанр: ";

       cin>>invtry[i].genre;

       cout<<"Описание: ";

       cin>>invtry[i].description;

}

//Изменение элемента.

void update()

{

       int i;

       char name [15];

       

       cout<<"Введите название книги: ";

       cin>>name;

       

       for(i=0; i<SIZE; i++)

               if (!strcmp(name, invtry[i].name)) break;

       if(i==SIZE)

       {

               cout << "Книга не найдена.\n";

               return;

       }

       cout << "Введите новую информацию.\n";

       input(i);

}

//Удаление элемента.

void remove()

{

       int i;

       char name [15];

       

       cout<<"Введите название книги: ";

       cin>>name;

       for(i=0; i<SIZE; i++)

               if (!strcmp(name, invtry[i].name)) break;

       if(i==SIZE)

       {

               cout << "Книга не найдена.\n";

               return;

       }

       *invtry[i].name='\0';

       *invtry[i].author='\0';

       *invtry[i].genre='\0';

       *invtry[i].description='\0';

}

//Поиск информации о книгах определенного автора;

void author()

{

       int i, n=0;

       char author [15];

       cout<<"Введите автора книги: ";

       cin>>author;

       

       for(i=0; i<SIZE; i++)

               if (!strcmp(author, invtry[i].author))

               {

                       if(n==0)

                       {

                               title();

                               n++;

                       }

                       dis(i);

               }

       if((i==SIZE)&(n==0))

       {

               cout << "Книга такого автора не найдена.\n";

               return;

       }

}

//Поиск информации о книгах определенного жанра.

void genre()

{

       int i, n=0;

       char genre [15];

       cout<<"Введите жанр книги: ";

       cin>>genre;

       

       for(i=0; i<SIZE; i++)

               if (!strcmp(genre, invtry[i].genre))

               {

                       if(n==0)

                       {

                               title();

                               n++;

                       }

                               dis(i);

               }

       if((i==SIZE)&(n==0))

       {

               cout << "Книга такого автора не найдена.\n";

               return;

       }

}

// Отображение всех эелементов на экран.

void display()

{        

       title();

       int t;

       for(t=0;  t<SIZE;  t++)

       {

               if (*invtry[t].name)

                       dis(t);

       }

}

// Чтение базы из файла

void loadFromFile()

{

       //очищаем БД

       init_list();

       // открываем файл для чтения

       ifstream instrm ("test. bin", std::ios::binary);

       if(instrm. is_open())        //если открылся

       {

               int i = 0;

               while (!instrm. eof() && i<SIZE)        //пока не конец файла и массив не переполнен

               {

                       instrm. read((char *)&invtry[i], sizeof(inv_type));

                       i++;

               }

               cout<<"База загружена.\n";

               instrm. close();

       }

       else

               cout<<"Ошибка при открытии файла.\n";        

}

// Сохранение базы в файл

void saveToFile()

{

       //открываем файл

       ofstream outstrm ("test. bin", std::ios::binary);

  if(outstrm. is_open())        //если открылся

  {

               outstrm. write((char*)invtry, sizeof(inv_type)*SIZE); // выводим массив в файл

               outstrm. close();        //закрываем файл

               cout<<"База сохранена.";

  }

       else

               cout<<"Ошибка открытия файла.\n";

}