#define _CRT_SECURE_NO_WARNINGS #include #include #include #include using namespace std; HANDLE hConsole; HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); void SetColor(int text, int background) { HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text)); } void GotoXY(int X, int Y) { COORD coord = { X, Y }; SetConsoleCursorPosition(hStdOut, coord); } struct state { char name[100]; char capital[100]; char language[100]; int population; int area; char currency[100]; char State_system[100]; char mainn[100]; bool operator <(state t){ return t.population < population? true : false; } }State; char File[] = "countries.txt"; //Имя файла cantries int Count; FILE *F_co; //Логическое имя файла char Fileх[40] = {}; template void add_array(T*& a, int& n, T val) { T *temp = new T[++n]; for (int i = 0; i < n; i++) temp[i] = i < n - 1 ? a[i] : val; if(a) delete[]a; a = temp; } void sort(state*&a, int n) //Record*&a= N;int size=i; { int min, j; state temp;// для связи с полями temp.population = 0;//обнуляем temp.area = 0; for (int i = 0; i < n - 1; i++)//цикл по всему массиву { min = i;//первым этапом индекс минимума равен 0 for (j = i + 1; j < n; j++)//цикл для сравнения со следующей ячейкой масива if (a[j] < a[min])//если следующ min = j;//запоминаем индекс swap(a[i], a[min]);//меняем местами } } void Show(state*& n)//n массив записей стран который надо отсортировать перед выводом {/* 1) После считывания очередной записи в State добавить копию в массив n 2) После сформирования массива n отсортировать его функцией сорт 3) вывести отсортированый масив n */ int i,N=0; char str[100]={}; strcpy(State.name,str); strcpy(State.capital,str); strcpy(State.language,str); State.population = 0; State.area = 0; strcpy(State.currency,str); strcpy(State.State_system,str); strcpy(State.mainn,str); //Если файл невозможно открыть для чтения, то завершение работы программы if ((F_co = fopen(File, "r")) == NULL) { fprintf(stderr, "\"%s\" : невозможно открыть\n", File); } //Чтение числа записей (Count) в файле if (fread(&Count, sizeof(int), 1, F_co) != 1) { fprintf(stderr, "\"%s\" : ошибка чтения\n", File); } //В цикле осуществляется вывод всех записей for (i = 0; i < Count; i++) { fread(&State, 1, sizeof(State), F_co); //Читается имя if (ferror(F_co)) //Проверяется отсутствие ошибки { fprintf(stderr, "\"%s\" : ошибка чтения\n", File); return; } add_array(n, N, State); strcpy(State.name,str); strcpy(State.capital,str); strcpy(State.language,str); State.population = 0; State.area = 0; strcpy(State.currency,str); strcpy(State.State_system,str); strcpy(State.mainn,str); } sort(n, N); for (int i = 0; i < N; i++) { cout << n[i].name << endl; cout << n[i].capital << endl; cout << n[i].language << endl; cout << n[i].population << endl; cout << n[i].area << endl; cout << n[i].currency << endl; cout << n[i].State_system << endl; cout << n[i].mainn << endl; cout << endl; } delete n; n=nullptr; fclose(F_co); _getch(); } int menuBegin() { int key = 0; int code; do { system("cls"); GotoXY(22, 4); SetColor(3, 0); cout << "Выбор действия из меню"; GotoXY(20, 6); SetColor(15, 0); cout << "Выберите действие (используя стрелки):"; key = (key + 5) % 5; if (key == 0) { GotoXY(24, 8); cout << ">> "; SetColor(0, 2); cout << "Вывод данных о странах" << endl; SetColor(15, 0); } else { GotoXY(24, 8); SetColor(15, 0); cout << " Вывод данных о странах" << endl; } if (key == 1) { GotoXY(24, 10); cout << ">> "; SetColor(0, 2); cout << "Добавить страну" << endl; SetColor(15, 0); } else { GotoXY(24, 10); SetColor(15, 0); cout << " Добавить страну" << endl; } if (key == 2) { GotoXY(24, 12); cout << ">> "; SetColor(0, 2); cout << "Изменить данные о стране" << endl; SetColor(15, 0); } else { GotoXY(24, 12); cout << " Изменить данные о стране" << endl; } if (key == 3) { GotoXY(24, 14); cout << ">> "; SetColor(0, 2); cout << "Сохранить в новом файле" << endl; SetColor(15, 0); } else { GotoXY(24, 14); cout << " Сохранить в новом файле" << endl; } if (key == 4) { GotoXY(24, 16); cout << ">> "; SetColor(0, 2); cout << "Выход" << endl; SetColor(15, 0); } else { GotoXY(24, 16); cout << " Выход" << endl; } code = _getch(); if (code == 224)// проверка нажатия одной из управляющих клавиш { code = _getch(); if (code == 80) key++;//cрелка вниз if (code == 72) key--;//cрелка вверх } } while (code != 13);// нажат enter (сделан выбор)- выходим из цикла system("cls"); return key; } void Find(char *s) { int i; char str[100]={}; strcpy(State.name,str); strcpy(State.capital,str); strcpy(State.language,str); State.population = 0; State.area = 0; strcpy(State.currency,str); strcpy(State.State_system,str); strcpy(State.mainn,str); //Если файл невозможно открыть для чтения, то завершение работы программы if ((F_co = fopen(File, "r+")) == NULL) { fprintf(stderr, "\"%s\" : невозможно открыть\n", File); } //Чтение числа записей (Count) в файле if (fread(&Count, sizeof(int), 1, F_co) != 1) { fprintf(stderr, "\"%s\" : ошибка чтения\n", File); } //В цикле for осуществляется поиск нужной записи for (i = 0; i < Count; i++) { fread(&State, 1, sizeof(State), F_co); //Чтение имени if (ferror(F_co)) //Проверка отсутствия ошибки { fprintf(stderr, "\"%s\" : ошибка чтения\n", File); return; } if (strcmp(s, State.name) == 0)//если такая Страна уже есть выводяться данные о ней { //и запрашивается ввод данных для редактирования SetConsoleCP(866); cout << State.name << endl; cout << State.capital << endl; cout << State.language << endl; cout << State.population << endl; cout << State.area << endl; cout << State.currency << endl; cout << State.State_system << endl; cout << State.mainn << endl; cout << "Введите страну\n"; SetConsoleCP(1251); gets(State.name); SetConsoleCP(866); cout << "Введите столицу\n"; SetConsoleCP(1251); gets(State.capital); SetConsoleCP(866); cout << "Введите государственный язык\n"; SetConsoleCP(1251); gets(State.language); SetConsoleCP(866); cout << "Введите количество населения\n"; SetConsoleCP(1251); cin >> State.population; SetConsoleCP(866); cout << "Введите площадь\n"; SetConsoleCP(1251); cin >> State.area; SetConsoleCP(866); cout << "Введите валюту страны\n"; SetConsoleCP(1251); gets(str); gets(State.currency); SetConsoleCP(866); cout << "Введите систему правления\n"; SetConsoleCP(1251); gets(State.State_system); SetConsoleCP(866); cout << "Введите имя правителя страны\n"; SetConsoleCP(1251); gets(State.mainn); SetConsoleCP(866); if (fseek(F_co, (sizeof(state)*i + 4), SEEK_SET)!=0) { fprintf(stderr, "\"%s\" : ошибка поиска\n", File); } fwrite(&State, 1, sizeof(state), F_co); fclose(F_co); return; } } cout << "Такой страны в Вашем справочниек нет\n"; fclose(F_co); _getch(); return; } void Create(void) //Создает файл, если его не существует { if ((F_co = fopen(File, "w+")) == NULL) { fprintf(stderr, "\%s\" : невозможно открыть\n", File); return; } Count = 0; if (!fwrite(&Count, sizeof(Count), 1, F_co)) { fprintf(stderr, "\"%s\" : ошибка записи\n", File); return; } fclose(F_co); } //--------------------------------------------------------------------- int Choice(char *str) { int i; if ((F_co = fopen(File, "r")) == NULL) { Create(); return 1; } if (fread(&Count, sizeof(int), 1, F_co) != 1) { fprintf(stderr, "\"%s\" : ошибка чтения\n", File); } for (i = 0; i < Count; i++) { fread(&State, 1, sizeof(State), F_co); if (ferror(F_co)) { fprintf(stderr, "\"%s\" : ошибка чтения\n", File); return 1; } if (strcmp(str, State.name) == 0) { fclose(F_co); return 0; //Строка str есть в файле } } fclose(F_co); return 1; //Строки str нет в файле } void Add(char* s) //Добавляет запись в файл { // int i; char str[100]={}; strcpy(State.name,str); strcpy(State.capital,str); strcpy(State.language,str); State.population = 0; State.area = 0; strcpy(State.currency,str); strcpy(State.State_system,str); strcpy(State.mainn,str); if ((F_co = fopen(File, "r+")) == NULL) { fprintf(stderr, "\"%s\" : невозможно открыть\n", File); return; } //Чтение числа записей (Count) в файле if (fread(&Count, sizeof(int), 1, F_co) != 1) { fprintf(stderr, "\"%s\" : ошибка чтения\n", File); return; } strcpy(State.name,s); cout << "Введите столицу\n"; SetConsoleCP(1251); gets(State.capital); SetConsoleCP(866); cout << "Введите государственный язык\n"; SetConsoleCP(1251); gets(State.language); SetConsoleCP(866); cout << "Введите количество населения\n"; SetConsoleCP(1251); cin >> State.population; SetConsoleCP(866); cout << "Введите площадь\n"; SetConsoleCP(1251); cin >> State.area; SetConsoleCP(866); cout << "Введите валюту страны\n"; SetConsoleCP(1251); gets(str); gets(State.currency); SetConsoleCP(866); cout << "Введите систему правления\n"; SetConsoleCP(1251); gets(State.State_system); SetConsoleCP(866); cout << "Введите имя правителя страны\n"; SetConsoleCP(1251); gets(State.mainn); SetConsoleCP(866); if (fseek(F_co, sizeof(state)*Count + 4, SEEK_SET)!=0) { fprintf(stderr, "\"%s\" : ошибка поиска\n", File); } fwrite(&State, 1, sizeof(State), F_co); //Запись в файл if (ferror(F_co)) //Проверка наличия ошибки { fprintf(stderr, "\"%s\" : ошибка записи\n", File); return; } fclose(F_co); F_co = fopen(File, "r+"); //Установка указателя в файле на первый байт if (fseek(F_co, 0L, SEEK_SET) != 0) { fprintf(stderr, "\"%s\" : ошибка позиционирования\n", File); return; } ++Count; //Увеличение числа записей на единицу //Запись Count в файл if (fwrite(&Count, sizeof(int), 1, F_co) != 1) { fprintf(stderr, "\"%s\" : ошибка записи\n", File); return; } fclose(F_co); return; } //--------------------------------------------------------------- void write(char *s){ F_co = fopen(File, "r"); FILE *fp2 = fopen(s, "w");// для записи во второй char cc[1024]; while (!feof(F_co)) //построчно копируем файл { fgets(cc, sizeof(cc), F_co); fputs(cc, fp2); } fclose(F_co); fclose(fp2); } void main() { setlocale(LC_ALL, ""); char s[32] = { 0 }; int answerBegin = 0; state *F=nullptr; while (answerBegin != 4) { answerBegin = menuBegin(); switch (answerBegin) { case 0:Show(F); break; case 1: cout << "Введите страну: "; SetConsoleCP(1251); if(kbhit()) gets(s); gets(s); SetConsoleCP(866); if (Choice(s) == 0) //Нет ли такой записи в файле? { puts("Эта страна есть в справочнике"); Sleep(1000); } else //если такой страны нет ввод данных и запись в файл Add(s); *s = NULL; break; case 2:cout << "Введите имя: "; SetConsoleCP(1251); gets(s); SetConsoleCP(866); Find(s);//поиск искомой страны если страна найдена вывод данных о ней и запрос на ввод новой странны *s = NULL; //обнуляем строку break; case 3:cout << "Введите имя файла: "; SetConsoleCP(1251); gets(s); SetConsoleCP(866); write(s);// Написать код считывания файла и запись под новым именем *s = NULL; break; case 4:exit(0); } } system("pauze"); delete F; }