Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * @file RGR_goloshapov.cpp
- * @author Голощапов Б. К. , гр. 515а
- * @date 20.05.2015
- * @brief Расчетно-графическая работа
- *
- * База данных рейсов полётов
- */
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <stdlib.h>
- #include <ctype.h>
- #include <locale.h>
- #include <string.h>
- #define STR_LEN 256
- void add_file();//добавление записи
- void edit_file();//изменение записи
- void del_file();//удаление записи
- void show_file();//показ записей
- void show_by_data_month();//показ записей с тнеобходимой датойм рождения по месяцу
- void show_by_surname();//показ записей по первым 3 буквам фамилии
- void restore_file();//восстановление записи
- void save();//сохраниение записи в файл
- void help();//вывод справочной информации
- void open_file();//открытие/создание файла (если его нет, создание по именем исполянемой прогр.) записей
- void cfgcheck();//открытие/создание файла конфигурации
- void findname(char* filepath);//призваивание необходимого имени файлам
- int scanf_mod();//проверка на правильность введения типа данных int
- void readline(char* str, int str_len);//проверка строки
- struct peoples_info
- {
- char finish[STR_LEN];
- int number;
- int date[3];
- bool del = false;
- } *info = NULL;
- int quantity = 0;
- char cfgname[STR_LEN];
- char dbname[STR_LEN];
- int main(int argc, char* argv[])
- {
- setlocale(LC_ALL, "rus");
- system("color F0");
- findname(*argv);
- cfgcheck();
- open_file();
- int command;
- for (;;)
- {
- printf("Выберите необходимый № команды:(9 -> для получения user info): ");
- command = scanf_mod();
- while (getchar() != '\n');
- switch (command)
- {
- case 0: free(info); return 0;
- case 1: add_file(); break;
- case 2: edit_file(); break;
- case 3: del_file(); break;
- case 4: show_file(); break;
- case 5: show_by_data_month(); break;
- case 6: show_by_surname(); break;
- case 7: restore_file(); break;
- case 8: save(); break;
- case 9: help(); break;
- default: printf("Команда не распознана.\n\n");
- }
- }
- }
- void open_file()
- {
- FILE *fp;
- int i = 0, j = 0;
- if (!(fp = fopen(cfgname, "rb+")))
- {
- fp = fopen(cfgname, "wb+");
- char dbfilein[STR_LEN] = "";
- strcpy(dbfilein, "DB = ");
- if (strlen(dbname) == 0)
- strcpy(dbname, "new_db.dat");
- strcat(dbfilein, dbname);
- fputs(dbfilein, fp);
- printf("Файл конфигурации не найден.\nФайл конфигурации с названием %s создан.\n", cfgname);
- fclose(fp);
- printf("Файл базы данных с именем \"%s\" создан\n", dbname);
- fp = fopen(dbname, "wb+");
- fclose(fp);
- printf("\n");
- }
- else
- {
- if (!(fp = fopen(dbname, "rb")))
- fp = fopen(dbname, "wb");
- fclose(fp);
- fp = fopen(dbname, "rb+");
- fseek(fp, 0, SEEK_END);
- int filesize = ftell(fp);
- if (filesize == 0)
- {
- fclose(fp);
- return;
- }
- rewind(fp);
- for (int i = 0; i < int(filesize / sizeof(peoples_info)); i++)
- {
- info = (peoples_info*)realloc(info, sizeof(peoples_info)* (++quantity));
- fread(&info[i], sizeof(peoples_info), 1, fp);
- }
- fclose(fp);
- }
- }
- void save()
- {
- int command;
- FILE *fp;
- printf("1. Сохранить в текущий файл(\"%s\").\n2. Сохранить в новый файл\n", dbname);
- printf("Введите команду: ");
- command = scanf_mod();
- switch (command)
- {
- case 1:
- if ((fp = fopen(dbname, "rb+")))
- {
- fp = fopen(dbname, "wb+");
- for (int i = 0; i < quantity; i++)
- fwrite(&info[i], sizeof(peoples_info), 1, fp);
- fclose(fp);
- printf("Данные успешно записаны в файл \"%s\"\n", dbname);
- }
- break;
- case 2:
- char dbname_tmp[STR_LEN];
- printf("Введите имя новой базы данных: ");
- setlocale(0, ".866");
- readline(dbname_tmp, STR_LEN);
- if (!strstr(dbname_tmp, ".dat"))
- strcat(dbname_tmp, ".dat");
- if (!(fp = fopen(dbname_tmp, "rb+")))
- {
- fp = fopen(dbname_tmp, "wb+");
- for (int i = 0; i < quantity; i++)
- fwrite(&info[i], sizeof(peoples_info), 1, fp);
- setlocale(0, "rus");
- printf("Данные успешно записаны в файл %s\n", dbname_tmp);
- }
- else
- printf("Файл с таким именем уже существует.\n");
- fclose(fp);
- break;
- default: printf("Команда не распознана.\n");
- }
- printf("\n");
- }
- void add_file()
- {
- int id = quantity;
- bool flag = false;
- for (int i = 0; i < quantity; i++)
- {
- if (info[i].del)
- {
- flag = true;
- id = i;
- break;
- }
- }
- if (flag)
- printf("Запись #%d удалена. Она будет перезаписана.\n", id);
- else
- {
- if (!(info = (peoples_info*)realloc(info, sizeof(peoples_info)* (++quantity))))
- {
- printf("Ошибка выделения памяти. Запись не создана.\n\n");
- quantity--;
- return;
- }
- }
- printf("Номер телефона ");
- d:
- info[id].number = scanf_mod();
- if (info[id].number <= 0){
- printf("Нельзя ввести отрицательный номер телефона!Попробуйте ещё раз: "); goto d;
- }
- printf("Имя и фимилия: ");
- readline(info[id].finish, STR_LEN);
- printf("Дата рождения: ");
- for (int i = 0; i < 3; i++)
- scanf("%d", &info[id].date[i]);
- info[id].del = false;
- printf("Запись успешно создана.\n");
- }
- void edit_file()
- {
- int id, command;
- if (!quantity)
- {
- printf("Записей в базе данных нет.\n\n");
- return;
- }
- printf("Введите номер записи, которую хотите изменить: ");
- id = scanf_mod();
- if (id < 0 || id >= quantity)
- printf("Такой записи не существует.\n\n");
- else
- {
- printf("Что именно вы хотите изменить?\n1. Конечный пункт\n2. Тип самолёта\n3. Номер рейса\n");
- printf("Введите команду: ");
- command = scanf_mod();
- switch (command)
- {
- case 1:
- printf("Конечный пункт: ");
- readline(info[id].finish, STR_LEN);
- printf("Запись успешно изменена.\n\n");
- break;
- case 2:
- printf("Тип самолёта: ");
- for (int i = 0; i < 3; i++)
- scanf("%d", &info[id].date[i]);;
- printf("Запись успешно изменена.\n\n");
- break;
- case 3:
- printf("Номер рейса: ");
- info[id].number = scanf_mod();
- printf("Запись успешно изменена.\n\n");
- break;
- default: printf("Команда не распознана.\n\n");
- }
- }
- }
- void del_file()
- {
- int id;
- if (!quantity)
- {
- printf("Записей в базе данных нет.\n\n");
- return;
- }
- printf("Введите номер записи, которую хотите удалить: ");
- id = scanf_mod();
- if (id < 0 || id >= quantity)
- {
- printf("Записи не существует.\n\n");
- return;
- }
- if (info[id].del)
- printf("Эта запись уже удалена.\n\n");
- else
- {
- info[id].del = true;
- printf("Запись успешно удалена.\n\n");
- }
- }
- void show_file()
- {
- if (quantity == 0)
- {
- printf("Записей в базе данных нет.\n\n");
- return;
- }
- printf("ID Номер телефона Имя и фамилия Дата рождения\n");
- setlocale(0, ".866");
- for (int i = 0; i < quantity; i++){
- if (!info[i].del){
- printf("%-4d %-19d %-22s ", i, info[i].number, info[i].finish);
- for (int j = 0; j < 3; j++)
- printf("%d.", info[i].date[j]);
- }
- printf("\n");
- }
- setlocale(0, "rus");
- }
- void show_by_data_month()
- {
- int k = 0;
- int a = 0;
- if (!quantity)
- {
- printf("Записей в базе данных нет.\n\n");
- return;
- }
- printf("Введите месяц.\n\n");
- scanf("%d", &a);
- for (int i = 0; i < quantity; i++)
- if (info[i].date[1] == a && !info[i].del)
- k++;
- if (!k)
- {
- printf("Таких маршрутов нет.\n\n");
- return;
- }
- printf("ID Номер телефона Имя и фамилия Дата рождения\n");
- setlocale(0, ".866");
- for (int i = 0; i < quantity; i++){
- if (info[i].date[1] == a && !info[i].del){
- printf("%-4d %-19d %-22s ", i, info[i].number, info[i].finish);
- for (int j = 0; j < 3; j++)
- printf("%d.", info[i].date[j]);
- printf("\n");
- }
- }
- setlocale(0, "rus");
- }
- void show_by_surname()
- {
- char temp[STR_LEN] = "";
- int k = 0;
- if (!quantity)
- {
- printf("Записей в базе данных нет.\n\n");
- return;
- }
- printf("Введите первые 3 символа: ");
- a:
- readline(temp, STR_LEN);
- if (strlen(temp) != 3)
- {
- printf("Введите только 3 символа: ");
- goto a;
- }
- for (int i = 0; i < quantity; i++)
- if (strstr(info[i].finish, temp) && !info[i].del)
- k++;
- if (!k)
- {
- printf("Таких маршрутов нет.\n\n");
- return;
- }
- printf("ID Номер телефона Имя и фамилия Дата рождения\n");
- setlocale(0, ".866");
- for (int i = 0; i < quantity; i++)
- if (strstr(info[i].finish, temp) && !info[i].del)
- printf("%-4d %-19d %-22s %d\n", i, info[i].number, info[i].finish, info[i].date[i]);
- printf("\n");
- setlocale(0, "rus");
- }
- void restore_file()
- {
- int id;
- if (!quantity)
- {
- printf("Записей в базе данных нет.\n\n");
- return;
- }
- printf("Введите номер записи, которую хотите восстановить: ");
- id = scanf_mod();
- if (id < 0 || id >= quantity)
- {
- printf("Такой записи не существует.\n\n");
- return;
- }
- if (!info[id].del)
- {
- printf("Эта запись не удалена.\n\n");
- return;
- }
- info[id].del = false;
- printf("Запись успешно восстановлена.\n\n");
- }
- void help()
- {
- printf("Данная программа выводит информацию о рейсах полётов.\n\n");
- printf("=-=-=-=-Меню:-=-=-=-=\n"
- " ->> 1. Добавить запись\n ->> 2. Изменить запись\n ->> 3. Удалить запись\n"
- " ->> 4. Просмотреть все записи\n ->> 5. Просмотреть записи по задданному месяцу даты рождения\n"
- " ->> 6. Просмотреть записи по запросу фамилии\n ->> 7. Восстановить запись\n"
- " ->> 8. Сохранить базу данных\n ->> 9. Вывести справку\n ->> 0. Выйти из программы\n\n");
- }
- void findname(char * filepath)
- {
- int i = 0;
- char temp[STR_LEN] = "";
- char *token_ptr = strtok(filepath, "\\");
- while (token_ptr)
- {
- strcpy(temp, token_ptr);
- token_ptr = strtok(NULL, "\\");
- }
- strncat(cfgname, temp, strlen(temp) - 4);
- strcat(cfgname, ".cfg");
- }
- void cfgcheck()
- {
- FILE *fp;
- int i = 0;
- char string[STR_LEN] = "";
- char* token_ptr;
- if (!(fp = fopen(cfgname, "r+"))) return;
- while (!feof(fp))
- {
- fgets(string, STR_LEN, fp);
- if (!strncmp(string, "DB = ", 5))
- {
- token_ptr = strtok(string, " = ");
- token_ptr = strtok(NULL, " = ");
- strcpy(dbname, token_ptr);
- }
- }
- }
- int scanf_mod()
- {
- int var;
- while (!(scanf("%d", &var)))
- {
- printf("Команда не распознана. Попробуйте ещё раз: ");
- fflush(stdin);
- //scanf("%*[^\n]");
- }
- return var;
- }
- void readline(char str[], int str_len)
- {
- setlocale(LC_ALL, ".866");
- int i = 0, ch;
- while (isspace(ch = getchar()));
- while (ch != '\n')
- {
- if (i < str_len)
- str[i++] = ch;
- ch = getchar();
- }
- str[i] = '\0';
- setlocale(LC_ALL, "rus");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement