Advertisement
Domerk

Untitled

Dec 10th, 2013
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.05 KB | None | 0 0
  1. /* ====================================================== */
  2. /* ==================== Файл main.cpp =================== */
  3. /* ====================================================== */
  4. /* Задача: Сформировать файл для хранения информации о мостах. Поля: название, высота, ширина, количество опор, протяжённость.
  5. Сформулировать условие поиска данных в файле и организовать поиск поиск по условию с сохранением найденных записей в новом файле.
  6. Использовать функции:
  7. создания;
  8. просмотра;
  9. сортировки;
  10. поиска данных.
  11. Предусмотреть в программе возможность выбора варианта действия. */
  12.  
  13. #include <fstream>
  14. #include <iostream>
  15. #include <cstdio>
  16. #include <cstdlib>
  17. #include <string>
  18. #include <windows.h>
  19. #include "functions_bridge.h"
  20.  
  21. int main ()
  22. {
  23.     int i;
  24.     char i_char[10];
  25.     string dirName = "D:\\BD_bridge"; // Имя папки, в которой будут храниться файлы бд
  26.     DWORD ftyp = GetFileAttributesA(dirName.c_str()); // проверяем, существует ли она
  27.     if (ftyp == INVALID_FILE_ATTRIBUTES) // если нет
  28.     {
  29.     CreateDirectory("D:\\BD_bridge", NULL);  // то создаём
  30.     }
  31.     // объявляем файловую переменную
  32.     FILE *file;
  33.     char* file_name = "D:\\BD_bridge\\db_bridge.dat"; // с вот таким именем и адресом
  34.  
  35.     file = fopen (file_name, "rb"); //пробуем открыть файл для чтения
  36.     if(file == NULL) // если это не удаётся
  37.     {
  38.         file = fopen(file_name, "w+b" ); // то создаём его
  39.     }
  40.     else // иначе такой файл уже существует
  41.     {
  42.         // просим юзера выбрать действие
  43.         std::cout<<"  Database file exists, create new?"<<endl<<"  1 - Yes"<<endl<<"  2 - No"<<endl;
  44.         std::cin>>i;
  45.         if (i==1) // если "создать новый файл"
  46.         {
  47.             char* str = ".dat"; //то создаём его
  48.             char file_name2 [50] = "D:\\BD_bridge\\db_bridge";
  49.  
  50.             std::cout<<"  Select the number of new database"<<endl;
  51.             std::cin>>i;
  52.             // и далее работаем с новым файлом
  53.             strcat(file_name2, itoa(i, i_char, 10));
  54.             strcat(file_name2, str);
  55.             file_name = file_name2;
  56.             file = fopen(file_name, "w+b" );
  57.         }
  58.     }
  59.  
  60.     fclose (file); // закрываем файл
  61.  
  62.     i = 1;
  63.  
  64.     while (i != 5) // выводим меню
  65.     {
  66.         std::cout<<endl<<"  Menu:"<<endl;
  67.         std::cout<<"  1 - Creat"<<endl<<"  2 - Review"<<endl<<"  3 - Sorting"<<endl<<"  4 - Search"<<endl<<"  5 - Exit"<<endl;
  68.         std::cin>>i;
  69.  
  70.         switch (i) // если
  71.         {
  72.         case 1: Create (file, file_name); break; // создать
  73.         case 2: Review (file, file_name); break; // просмотреть
  74.         case 3: Sorting (file, file_name); break; // сортировать
  75.         case 4: Search (file, file_name); break; // искать
  76.         case 5: std::cout<<endl<<"  The End! :) "<<endl; break; // выходим
  77.         }
  78.  
  79.     }
  80.  
  81.     std::cin.sync();
  82.     std::cin.get();
  83.  
  84.     return 0;
  85. }
  86.  
  87. /* ================================================================ */
  88. /* ==================== Файл functions_bridge.h =================== */
  89. /* ================================================================ */
  90.  
  91. #ifndef FUNCTIONS_BRIDGE_H // не компилировать повторно
  92. #define FUNCTIONS_BRIDGE_H
  93.  
  94. #include <string>
  95.  
  96. using namespace std;
  97. // стандартное пространство имён
  98.  
  99. struct Bridge // структура "Мост"
  100. {
  101. string  name;   //Имя - строка длиной 60
  102. float height, width, length; //Высота, Ширина, Длина
  103. short int number; //Количество опор
  104. };
  105.  
  106. // ниже объявляем функции
  107.  
  108. void Create (FILE *file, char* file_name);
  109. void Review (FILE *file, char* file_name);
  110.  
  111. void sorting_name(FILE *file, char* file_name);
  112. void sorting_height(FILE *file, char* file_name);
  113. void sorting_length(FILE *file, char* file_name);
  114.  
  115. void Sorting (FILE *file, char* file_name);
  116. void Search (FILE *file, char* file_name);
  117.  
  118.  
  119.  
  120. #endif
  121.  
  122. /* ================================================================== */
  123. /* ==================== Файл functions_bridge.cpp =================== */
  124. /* ================================================================== */
  125.  
  126.  
  127. #include <string>
  128. #include <fstream>
  129. #include <iostream>
  130. #include <iomanip>
  131. #include "functions_bridge.h"
  132.  
  133. // функция создания базы данных
  134. void Create (FILE *file, char* file_name)
  135. {
  136.     Bridge New_element; // новый элемент
  137.     int key = 0;
  138.     // открываем файл для записи в конец
  139.     file = fopen (file_name, "ab");
  140.  
  141.     // заполняем инфу
  142.     while (key != 2)
  143.     {
  144.         std::cout<<endl<<"  Name: ";
  145.         std::cin>>New_element.name;
  146.         std::cout<<"  Height: ";
  147.         std::cin>>New_element.height;
  148.         std::cout<<"  Width: ";
  149.         std::cin>>New_element.width;
  150.         std::cout<<"  Number: ";
  151.         std::cin>>New_element.number;
  152.         std::cout<<"  Length: ";
  153.         std::cin>>New_element.length;
  154.  
  155.         // записываем в файл
  156.         fwrite(&New_element, sizeof(New_element), 1, file);
  157.  
  158.         std::cout<<"  Press 1 to continue or 2 to exit: ";
  159.         std::cin>>key;
  160.     }
  161.     fclose (file); // закрываем файл
  162. }
  163.  
  164. // процедура просмотра
  165. void Review (FILE *file, char* file_name)
  166. {
  167.     Bridge New_element;
  168.     int key = 0;
  169.     file = fopen (file_name, "rb");
  170.  
  171.     // задаём параметры вывода
  172.     std::cout<<endl;
  173.     std::cout<<"  Name"<<setw(15)<<"  Height"<<setw(10)<<"  Width"<<setw(10)<<"  Number"<<setw(10)<<"  Length"<<setw(10)<<endl;
  174.     std::cout<<endl;
  175.  
  176.     // пока запись есть, считываем её и выводим на экран
  177.     while (fread(&New_element, sizeof(New_element), 1, file))
  178.     {
  179.         std::cout<<New_element.name<<setw(13)<<New_element.height<<setw(8)<<New_element.width<<setw(8);
  180.         std::cout<<New_element.number<<setw(8)<<New_element.length<<setw(8)<<endl;
  181.     }
  182.     fclose (file); // закрываем файл
  183. }
  184.  
  185. // функция сортировки - базовая
  186. void Sorting (FILE *file, char* file_name)
  187. {
  188.         int key;
  189.         // просим юзера выбрать поле, по которому происходит сортировка
  190.         std::cout<<"  Sort by:"<<endl;
  191.         std::cout<<"  1 - Name"<<endl<<"  2 - Height"<<endl;
  192.         std::cout<<"  3 - Length"<<endl<<"  4 - Return"<<endl;
  193.         std::cin>>key;
  194.  
  195.         switch (key)
  196.         {
  197.         case 1: sorting_name (file, file_name); break;
  198.         case 2: sorting_height (file, file_name); break;
  199.         case 3: sorting_length (file, file_name); break;
  200.         case 4: break;
  201.         }
  202. }
  203.  
  204. // функция поиска
  205. void Search (FILE *file, char* file_name)
  206. {
  207.     Bridge element1, element2;
  208.     FILE* file2;
  209.     // результаты поиска сохранябтся в отельном файле
  210.     char* name_of_file2 = "D:\\BD_bridge\\result_of_search.dat";
  211.     file = fopen (file_name, "rb");
  212.     file2 = fopen (name_of_file2, "wb");
  213.  
  214.     // заполняем инфу
  215.     std::cout<<endl<<"  Name: ";
  216.         std::cin>>element1.name;
  217.         std::cout<<"  Height: ";
  218.         std::cin>>element1.height;
  219.         std::cout<<"  Length: ";
  220.         std::cin>>element1.length;
  221.  
  222.         // ищем инфу
  223.         while (fread(&element2, sizeof(element2), 1, file))
  224.         {
  225.             if ((element1.name==element2.name)||(element1.height==element2.height)||(element1.length==element2.length))
  226.             {
  227.                 fwrite(&element2, sizeof(element2), 1, file2);
  228.             }
  229.         }
  230.  
  231.     // закрываем оба файла
  232.     fclose(file);
  233.     fclose(file2);
  234.     // отправляем их в просмотр
  235.     Review (file2, name_of_file2);
  236. }
  237.  
  238.  
  239. // сортировка по названию
  240. void sorting_name(FILE *file, char* file_name)
  241. {
  242.     Bridge element1, element2;
  243.     int i;
  244.     int fl = 0; // флаг
  245.     file = fopen (file_name, "r+b"); // открываем файл для чтения и записи
  246.    
  247.     do {
  248.         rewind(file); // переходим в начало файла
  249.        i = 0;
  250.         fl = 0; // обунялем флаг
  251.         while (fread(&element1, sizeof(element1), 1, file)) //пока есть записи
  252.         {
  253.             if (fread(&element2,sizeof(element2), 1, file) > 0) //если есть следующий элемент
  254.             {
  255.                 if (element1.name > element2.name) // сравнимаем элементы
  256.                 {
  257.                     fseek(file, i, SEEK_SET); // переносим коретку относительно текущего элемента
  258.                     fwrite(&element2, sizeof(element2), 1, file); // записываем второй
  259.                     fwrite(&element1, sizeof(element1), 1, file); // записываем первый
  260.                     fl = 1; //поднимаем флаг
  261.                 }
  262.             }
  263.             i += sizeof(element1); // изменяем параметр
  264.             fseek(file, i, SEEK_SET); // перемещаем каретку
  265.         }
  266.     } while (fl); // если флаг, продолжаем
  267.  
  268.     fclose (file); // закрываем файл
  269.     Review (file, file_name); // просматриваем, что получилось
  270.  
  271. }
  272.  
  273. // сортировка по высоте - аналогично
  274. void sorting_height(FILE *file, char* file_name)
  275. {
  276.     Bridge element1, element2;
  277.     int i;
  278.     int fl = 0;
  279.     file = fopen (file_name, "r+b");
  280.    
  281.     do {
  282.         rewind(file);
  283.        i = 0;
  284.         fl = 0;
  285.         while (fread(&element1, sizeof(element1), 1, file))
  286.         {
  287.             if (fread(&element2,sizeof(element2), 1, file) > 0)
  288.             {
  289.                 if (element1.height > element2.height)
  290.                 {
  291.                     fseek(file, i, SEEK_SET);
  292.                     fwrite(&element2, sizeof(element2), 1, file);
  293.                     fwrite(&element1, sizeof(element1), 1, file);
  294.                     fl = 1;
  295.                 }
  296.             }
  297.             i += sizeof(element1);
  298.             fseek(file, i, SEEK_SET);
  299.         }
  300.     } while (fl);
  301.  
  302.     fclose (file);
  303.     Review (file, file_name);
  304.  
  305. }
  306.  
  307. // сортировка по длине - аналогично
  308. void sorting_length(FILE *file, char* file_name)
  309. {
  310.  
  311.     Bridge element1, element2;
  312.     int i;
  313.     int fl = 0;
  314.     file = fopen (file_name, "r+b");
  315.    
  316.     do {
  317.         rewind(file);
  318.        i = 0;
  319.         fl = 0;
  320.         while (fread(&element1, sizeof(element1), 1, file))
  321.         {
  322.             if (fread(&element2,sizeof(element2), 1, file) > 0)
  323.             {
  324.                 if (element1.length > element2.length)
  325.                 {
  326.                     fseek(file, i, SEEK_SET);
  327.                     fwrite(&element2, sizeof(element2), 1, file);
  328.                     fwrite(&element1, sizeof(element1), 1, file);
  329.                     fl = 1;
  330.                 }
  331.             }
  332.             i += sizeof(element1);
  333.             fseek(file, i, SEEK_SET);
  334.         }
  335.     } while (fl);
  336.  
  337.     fclose (file);
  338.     Review (file, file_name);
  339. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement