Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdlib>
- #include <iostream>
- #include <fstream>
- #include <vector>
- #include <string>
- #include <conio.h>
- using namespace std;
- struct transp {
- int number; //номер маршрута
- char type[64];//тип транспорта
- int count; //кол-во единиц
- } temp;
- vector<transp> vec;
- int readFromFile(char* filename) { //функция читает файл, принимает в параметре имя файла
- vec.clear();
- FILE* fp = fopen(filename, "rb"); //открываем файл в режиме read binary (чтение, бинарный)
- if(!fp) { //если указатель нулевой
- perror("Ошибка "); //вывод ошибки на экран
- system("pause");
- return -1; //выход с кодом ошибки
- }
- do {
- int bytes = fread(&temp, sizeof(temp), 1, fp); //чтение из файла в структуру temp, размером 1*sizeof(temp), из файла fp. bytes-кол-во считанных байт
- if(bytes>0) //если считано не 0 байт
- vec.push_back(temp); //добавляем структуру в вектор
- else
- break;
- } while (!feof(fp)); //пока не конец файла
- int max_count_index=0; //индекс элемента с наибольшым количеством единиц
- for(int i=0; i<vec.size(); ++i) {
- cout << i << ") " << vec[i].number << ' ' << vec[i].type << '\t' << vec[i].count << " единиц" <<endl; //вывод
- if(vec[i].count > vec[max_count_index].count) //если текущий элемент имеет больше единиц чем max_count_index
- max_count_index=i; //запоминаем текущий как max_count_index
- }
- cout<<"Наиболее обеспеченный подвижными единицами маршрут: "<<vec[max_count_index].number<<endl;
- fclose(fp);
- system("pause");
- return 0;
- }
- int newFile(char* filename) { //создаём новый файл
- vec.clear(); //очищаем вектор на случай, если файл был считан до создания нового
- FILE* fp = fopen(filename, "wb"); //открываем файл в режиме write binary (чтение, бинарный)
- if(!fp) { //если указатель нулевое
- perror("Ошибка "); //вывод ошибки на экран
- system("pause");
- return -1; //выход с кодом ошибки
- }
- do {
- system("cls");
- cout<<"Добавление записи. Введите 0 для прекращения"<<endl;
- cout<<"Номер маршрута: ";
- cin>>temp.number;
- if(temp.number==0) //если введён 0
- break; //выход из цикла
- cout<<"Тип транспорта: ";
- cin>>temp.type;
- cout<<"Количество единиц: ";
- cin>>temp.count;
- vec.push_back(temp);
- if(fwrite(&temp, sizeof(temp), 1, fp) < 1) {//пишем структуру в файл, получаем количество записанных элементов. если записано меньше 1 элемента, выдаём ошибку
- perror("Ошибка "); //вывод ошибки на экран
- fclose(fp);
- system("pause");
- return -2;
- }
- } while(1);
- fclose(fp);
- system("pause");
- return 0;
- }
- int formFile(char* filename) { //формирует файл со структурой (номер маршрута, кол-во единиц)
- if(vec.size()==0) { //если вектор пуст
- cout<<"Сначала прочитайте файл!"<<endl;
- system("pause");
- return -1;
- }
- FILE* fp = fopen(filename, "wb"); //открываем файл в режиме write binary (чтение, бинарный)
- if(!fp) { //если указатель нулевой
- perror("Ошибка "); //вывод ошибки на экран
- system("pause");
- return -2; //выход с кодом ошибки
- }
- for(int i=0; i<vec.size(); ++i) {
- int res1 = fwrite(&vec[i].number, sizeof(vec[i].number), 1, fp); //записываем число - номер маршрута
- int res2 = fwrite(&vec[i].count, sizeof(vec[i].number), 1, fp); //пишем число - количество подвижных единиц
- if(res1<1 || res2<1) { //проверяем количество записанных элементов
- cout<<"Ошибка записи в файл"<<filename<<endl;
- system("pause");
- fclose(fp);
- return -3;
- }
- }
- fclose(fp);
- system("pause");
- return 0;
- }
- int readFromFile2(char* filename) { //функция читает сформированный по условию задания файл, принимает в параметре имя файла
- FILE* fp = fopen(filename, "rb"); //открываем файл в режиме read binary (чтение, бинарный)
- if(!fp) { //если указатель нулевой
- perror("Ошибка "); //вывод ошибки на экран
- system("pause");
- return -1; //выход с кодом ошибки
- }
- int info[2]; //массив, куда будут считываться данные
- do {
- int bytes = fread(info, sizeof(int), 2, fp); //чтение из файла в массив из двух int, размером 2*sizeof(int), из файла fp. bytes-кол-во считанных байт
- if(bytes>0) //если считано не 0 байт
- cout<<info[0]<<" маршрут"<<": "<<info[1]<<" подвижных единиц"<<endl;
- else
- break;
- } while (!feof(fp)); //пока не конец файла
- fclose(fp);
- system("pause");
- return 0;
- }
- int addRecord(char* filename) {
- cout<<"Добавление записи. Введите 0 для прекращения"<<endl;
- cout<<"Номер маршрута: ";
- cin>>temp.number;
- if(temp.number==0) //если введён 0
- return 0; //выход из цикла
- cout<<"Тип транспорта: ";
- cin>>temp.type;
- cout<<"Количество единиц: ";
- cin>>temp.count;
- vec.push_back(temp);
- FILE* fp = fopen(filename, "ab"); //открываем файл в режиме add bynary (добавить, двоичный)
- if(!fp) { //если указатель нулевой
- perror("Ошибка "); //вывод ошибки на экран
- system("pause");
- return -1; //выход с кодом ошибки
- }
- if(fwrite(&temp, sizeof(temp), 1, fp) < 1) {//пишем структуру в файл, получаем количество записанных элементов. если записано меньше 1 элемента, выдаём ошибку
- cout<<"Ошибка при записи"<<endl;
- system("pause");
- fclose(fp);
- return -2;
- }
- system("pause");
- fclose(fp);
- return 0;
- }
- int delRecord(char* filename) { //удаление записей с заданным маршрутом
- if(vec.size()==0) { //если вектор пуст
- cout<<"Сначала прочитайте файл!"<<endl;
- system("pause");
- return -1;
- }
- int n;
- cout<<"Введите номер удаляемого маршрута: ";
- cin>>n;
- bool found = false; //флаг означает, найдены ли записи
- //удаляем из вектора подходящие элементы
- for(int i=0; i<vec.size(); ++i)
- if(vec[i].number == n) { //если номер совпадает
- found=true;
- vec.erase(vec.begin()+i); //удаляем из вектора i-ый элемент
- cout<<"Удалено"<<endl;
- }
- if(found) {
- FILE* fp = fopen(filename, "wb"); //открываем файл в режиме write binary (чтение, бинарный)
- if(!fp) { //если указатель нулевой
- perror("Ошибка "); //вывод ошибки на экран
- return -2; //выход с кодом ошибки
- }
- //переписываем все элементы вектора в файл
- for(int i=0; i<vec.size(); ++i)
- if(fwrite(&vec[i], sizeof(vec[i]), 1, fp) < 1) {
- cout<<"Запись не удалась"<<endl;
- system("pause");
- return(-3);
- }
- fclose(fp);
- }
- else {
- cout<<"Элементы не найдены"<<endl;
- system("pause");
- return(0);
- }
- system("pause");
- return(0);
- }
- int editFile(char* filename) {
- if(vec.size()==0) { //если вектор пуст
- cout<<"Сначала прочитайте файл!"<<endl;
- system("pause");
- return -1;
- }
- bool found = false; //флаг означает, найдены ли записи
- int n;
- cout<<"Введите номер маршрута для редактирования: ";
- cin>>n;
- //изменяем элементы вектора подходящие элементы
- for(int i=0; i<vec.size(); ++i)
- if(vec[i].number == n) { //если номер совпадает
- found=true;
- cout << i << ") " << vec[i].number << '\t' << vec[i].type << '\t' << vec[i].count <<endl; //вывод
- cout<<"Введите новое количество подвижных единиц: ";
- cin>>vec[i].count;
- }
- if(found) {
- FILE* fp = fopen(filename, "wb"); //открываем файл в режиме write binary (чтение, бинарный)
- if(!fp) { //если указатель нулевой
- perror("Ошибка "); //вывод ошибки на экран
- return -2; //выход с кодом ошибки
- }
- //переписываем все элементы вектора в файл
- for(int i=0; i<vec.size(); ++i)
- if(fwrite(&vec[i], sizeof(vec[i]), 1, fp) < 1) {
- cout<<"Запись не удалась"<<endl;
- system("pause");
- fclose(fp);
- return(-3);
- }
- fclose(fp);
- }
- else {
- cout<<"Элементы не найдены"<<endl;
- system("pause");
- return(0);
- }
- system("pause");
- return(0);
- }
- int main() {
- int key; //нажатая клавиша
- setlocale(LC_ALL, "Rus"); //устанавливаем русскую локаль
- do {
- system("cls"); //clear screen - очистка экрана
- cout<<"1. Выход\n2. Создать файл\n3. Чтение файла\n4. Сформировать файл (№ маршр., кол-во единиц)\n5. Показать сформированный файл\n6. Добавить запись\n7. Удалить записи по № маршрута\n8. Корректировка файла\n";
- key=getch();
- system("cls");
- switch(key) {
- case '2':
- newFile("transport");
- break;
- case '3':
- readFromFile("transport");
- break;
- case '4':
- formFile("dop_file");
- break;
- case '5':
- readFromFile2("dop_file");
- break;
- case '6':
- addRecord("transport");
- break;
- case '7':
- delRecord("transport");
- break;
- case '8':
- editFile("transport");
- break;
- }
- } while (key!='1');
- }
Advertisement
Add Comment
Please, Sign In to add comment