Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* ====================================================== */
- /* ==================== Файл main.cpp =================== */
- /* ====================================================== */
- /* Задача: Сформировать файл для хранения информации о мостах. Поля: название, высота, ширина, количество опор, протяжённость.
- Сформулировать условие поиска данных в файле и организовать поиск поиск по условию с сохранением найденных записей в новом файле.
- Использовать функции:
- создания;
- просмотра;
- сортировки;
- поиска данных.
- Предусмотреть в программе возможность выбора варианта действия. */
- #include <fstream>
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <string>
- #include <windows.h>
- #include "functions_bridge.h"
- int main ()
- {
- int i;
- char i_char[10];
- string dirName = "D:\\BD_bridge"; // Имя папки, в которой будут храниться файлы бд
- DWORD ftyp = GetFileAttributesA(dirName.c_str()); // проверяем, существует ли она
- if (ftyp == INVALID_FILE_ATTRIBUTES) // если нет
- {
- CreateDirectory("D:\\BD_bridge", NULL); // то создаём
- }
- // объявляем файловую переменную
- FILE *file;
- char* file_name = "D:\\BD_bridge\\db_bridge.dat"; // с вот таким именем и адресом
- file = fopen (file_name, "rb"); //пробуем открыть файл для чтения
- if(file == NULL) // если это не удаётся
- {
- file = fopen(file_name, "w+b" ); // то создаём его
- }
- else // иначе такой файл уже существует
- {
- // просим юзера выбрать действие
- std::cout<<" Database file exists, create new?"<<endl<<" 1 - Yes"<<endl<<" 2 - No"<<endl;
- std::cin>>i;
- if (i==1) // если "создать новый файл"
- {
- char* str = ".dat"; //то создаём его
- char file_name2 [50] = "D:\\BD_bridge\\db_bridge";
- std::cout<<" Select the number of new database"<<endl;
- std::cin>>i;
- // и далее работаем с новым файлом
- strcat(file_name2, itoa(i, i_char, 10));
- strcat(file_name2, str);
- file_name = file_name2;
- file = fopen(file_name, "w+b" );
- }
- }
- fclose (file); // закрываем файл
- i = 1;
- while (i != 5) // выводим меню
- {
- std::cout<<endl<<" Menu:"<<endl;
- std::cout<<" 1 - Creat"<<endl<<" 2 - Review"<<endl<<" 3 - Sorting"<<endl<<" 4 - Search"<<endl<<" 5 - Exit"<<endl;
- std::cin>>i;
- switch (i) // если
- {
- case 1: Create (file, file_name); break; // создать
- case 2: Review (file, file_name); break; // просмотреть
- case 3: Sorting (file, file_name); break; // сортировать
- case 4: Search (file, file_name); break; // искать
- case 5: std::cout<<endl<<" The End! :) "<<endl; break; // выходим
- }
- }
- std::cin.sync();
- std::cin.get();
- return 0;
- }
- /* ================================================================ */
- /* ==================== Файл functions_bridge.h =================== */
- /* ================================================================ */
- #ifndef FUNCTIONS_BRIDGE_H // не компилировать повторно
- #define FUNCTIONS_BRIDGE_H
- #include <string>
- using namespace std;
- // стандартное пространство имён
- struct Bridge // структура "Мост"
- {
- string name; //Имя - строка длиной 60
- float height, width, length; //Высота, Ширина, Длина
- short int number; //Количество опор
- };
- // ниже объявляем функции
- void Create (FILE *file, char* file_name);
- void Review (FILE *file, char* file_name);
- void sorting_name(FILE *file, char* file_name);
- void sorting_height(FILE *file, char* file_name);
- void sorting_length(FILE *file, char* file_name);
- void Sorting (FILE *file, char* file_name);
- void Search (FILE *file, char* file_name);
- #endif
- /* ================================================================== */
- /* ==================== Файл functions_bridge.cpp =================== */
- /* ================================================================== */
- #include <string>
- #include <fstream>
- #include <iostream>
- #include <iomanip>
- #include "functions_bridge.h"
- // функция создания базы данных
- void Create (FILE *file, char* file_name)
- {
- Bridge New_element; // новый элемент
- int key = 0;
- // открываем файл для записи в конец
- file = fopen (file_name, "ab");
- // заполняем инфу
- while (key != 2)
- {
- std::cout<<endl<<" Name: ";
- std::cin>>New_element.name;
- std::cout<<" Height: ";
- std::cin>>New_element.height;
- std::cout<<" Width: ";
- std::cin>>New_element.width;
- std::cout<<" Number: ";
- std::cin>>New_element.number;
- std::cout<<" Length: ";
- std::cin>>New_element.length;
- // записываем в файл
- fwrite(&New_element, sizeof(New_element), 1, file);
- std::cout<<" Press 1 to continue or 2 to exit: ";
- std::cin>>key;
- }
- fclose (file); // закрываем файл
- }
- // процедура просмотра
- void Review (FILE *file, char* file_name)
- {
- Bridge New_element;
- int key = 0;
- file = fopen (file_name, "rb");
- // задаём параметры вывода
- std::cout<<endl;
- std::cout<<" Name"<<setw(15)<<" Height"<<setw(10)<<" Width"<<setw(10)<<" Number"<<setw(10)<<" Length"<<setw(10)<<endl;
- std::cout<<endl;
- // пока запись есть, считываем её и выводим на экран
- while (fread(&New_element, sizeof(New_element), 1, file))
- {
- std::cout<<New_element.name<<setw(13)<<New_element.height<<setw(8)<<New_element.width<<setw(8);
- std::cout<<New_element.number<<setw(8)<<New_element.length<<setw(8)<<endl;
- }
- fclose (file); // закрываем файл
- }
- // функция сортировки - базовая
- void Sorting (FILE *file, char* file_name)
- {
- int key;
- // просим юзера выбрать поле, по которому происходит сортировка
- std::cout<<" Sort by:"<<endl;
- std::cout<<" 1 - Name"<<endl<<" 2 - Height"<<endl;
- std::cout<<" 3 - Length"<<endl<<" 4 - Return"<<endl;
- std::cin>>key;
- switch (key)
- {
- case 1: sorting_name (file, file_name); break;
- case 2: sorting_height (file, file_name); break;
- case 3: sorting_length (file, file_name); break;
- case 4: break;
- }
- }
- // функция поиска
- void Search (FILE *file, char* file_name)
- {
- Bridge element1, element2;
- FILE* file2;
- // результаты поиска сохранябтся в отельном файле
- char* name_of_file2 = "D:\\BD_bridge\\result_of_search.dat";
- file = fopen (file_name, "rb");
- file2 = fopen (name_of_file2, "wb");
- // заполняем инфу
- std::cout<<endl<<" Name: ";
- std::cin>>element1.name;
- std::cout<<" Height: ";
- std::cin>>element1.height;
- std::cout<<" Length: ";
- std::cin>>element1.length;
- // ищем инфу
- while (fread(&element2, sizeof(element2), 1, file))
- {
- if ((element1.name==element2.name)||(element1.height==element2.height)||(element1.length==element2.length))
- {
- fwrite(&element2, sizeof(element2), 1, file2);
- }
- }
- // закрываем оба файла
- fclose(file);
- fclose(file2);
- // отправляем их в просмотр
- Review (file2, name_of_file2);
- }
- // сортировка по названию
- void sorting_name(FILE *file, char* file_name)
- {
- Bridge element1, element2;
- int i;
- int fl = 0; // флаг
- file = fopen (file_name, "r+b"); // открываем файл для чтения и записи
- do {
- rewind(file); // переходим в начало файла
- i = 0;
- fl = 0; // обунялем флаг
- while (fread(&element1, sizeof(element1), 1, file)) //пока есть записи
- {
- if (fread(&element2,sizeof(element2), 1, file) > 0) //если есть следующий элемент
- {
- if (element1.name > element2.name) // сравнимаем элементы
- {
- fseek(file, i, SEEK_SET); // переносим коретку относительно текущего элемента
- fwrite(&element2, sizeof(element2), 1, file); // записываем второй
- fwrite(&element1, sizeof(element1), 1, file); // записываем первый
- fl = 1; //поднимаем флаг
- }
- }
- i += sizeof(element1); // изменяем параметр
- fseek(file, i, SEEK_SET); // перемещаем каретку
- }
- } while (fl); // если флаг, продолжаем
- fclose (file); // закрываем файл
- Review (file, file_name); // просматриваем, что получилось
- }
- // сортировка по высоте - аналогично
- void sorting_height(FILE *file, char* file_name)
- {
- Bridge element1, element2;
- int i;
- int fl = 0;
- file = fopen (file_name, "r+b");
- do {
- rewind(file);
- i = 0;
- fl = 0;
- while (fread(&element1, sizeof(element1), 1, file))
- {
- if (fread(&element2,sizeof(element2), 1, file) > 0)
- {
- if (element1.height > element2.height)
- {
- fseek(file, i, SEEK_SET);
- fwrite(&element2, sizeof(element2), 1, file);
- fwrite(&element1, sizeof(element1), 1, file);
- fl = 1;
- }
- }
- i += sizeof(element1);
- fseek(file, i, SEEK_SET);
- }
- } while (fl);
- fclose (file);
- Review (file, file_name);
- }
- // сортировка по длине - аналогично
- void sorting_length(FILE *file, char* file_name)
- {
- Bridge element1, element2;
- int i;
- int fl = 0;
- file = fopen (file_name, "r+b");
- do {
- rewind(file);
- i = 0;
- fl = 0;
- while (fread(&element1, sizeof(element1), 1, file))
- {
- if (fread(&element2,sizeof(element2), 1, file) > 0)
- {
- if (element1.length > element2.length)
- {
- fseek(file, i, SEEK_SET);
- fwrite(&element2, sizeof(element2), 1, file);
- fwrite(&element1, sizeof(element1), 1, file);
- fl = 1;
- }
- }
- i += sizeof(element1);
- fseek(file, i, SEEK_SET);
- }
- } while (fl);
- fclose (file);
- Review (file, file_name);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement