Advertisement
Uncleeee

Untitled

Nov 13th, 2017
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.92 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <fstream>
  4. #include <vector>
  5. #include <string>
  6. #include <conio.h>
  7. using namespace std;
  8.  
  9. struct transp {
  10. int number; //номер маршрута
  11. char type[64];//тип транспорта
  12. int count; //кол-во единиц
  13. } temp;
  14.  
  15. vector<transp> vec;
  16.  
  17.  
  18. int readFromFile(char* filename) { //функция читает файл, принимает в параметре имя файла
  19. vec.clear();
  20. FILE* fp = fopen(filename, "rb"); //открываем файл в режиме read binary (чтение, бинарный)
  21. if(!fp) { //если указатель нулевой
  22. perror("Ошибка "); //вывод ошибки на экран
  23. system("pause");
  24. return -1; //выход с кодом ошибки
  25. }
  26.  
  27. do {
  28. int bytes = fread(&temp, sizeof(temp), 1, fp); //чтение из файла в структуру temp, размером 1*sizeof(temp), из файла fp. bytes-кол-во считанных байт
  29. if(bytes>0) //если считано не 0 байт
  30. vec.push_back(temp); //добавляем структуру в вектор
  31. else
  32. break;
  33.  
  34. } while (!feof(fp)); //пока не конец файла
  35.  
  36.  
  37. int max_count_index=0; //индекс элемента с наибольшым количеством единиц
  38.  
  39. for(int i=0; i<vec.size(); ++i) {
  40. cout << i << ") " << vec[i].number << ' ' << vec[i].type << '\t' << vec[i].count << " единиц" <<endl; //вывод
  41.  
  42. if(vec[i].count > vec[max_count_index].count) //если текущий элемент имеет больше единиц чем max_count_index
  43. max_count_index=i; //запоминаем текущий как max_count_index
  44. }
  45. cout<<"Наиболее обеспеченный подвижными единицами маршрут: "<<vec[max_count_index].number<<endl;
  46. fclose(fp);
  47. system("pause");
  48. return 0;
  49. }
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56. int newFile(char* filename) { //создаём новый файл
  57. vec.clear(); //очищаем вектор на случай, если файл был считан до создания нового
  58. FILE* fp = fopen(filename, "wb"); //открываем файл в режиме write binary (чтение, бинарный)
  59. if(!fp) { //если указатель нулевое
  60. perror("Ошибка "); //вывод ошибки на экран
  61. system("pause");
  62. return -1; //выход с кодом ошибки
  63. }
  64.  
  65.  
  66. do {
  67. system("cls");
  68. cout<<"Добавление записи. Введите 0 для прекращения"<<endl;
  69. cout<<"Номер маршрута: ";
  70. cin>>temp.number;
  71. if(temp.number==0) //если введён 0
  72. break; //выход из цикла
  73. cout<<"Тип транспорта: ";
  74. cin>>temp.type;
  75. cout<<"Количество единиц: ";
  76. cin>>temp.count;
  77. vec.push_back(temp);
  78.  
  79. if(fwrite(&temp, sizeof(temp), 1, fp) < 1) {//пишем структуру в файл, получаем количество записанных элементов. если записано меньше 1 элемента, выдаём ошибку
  80. perror("Ошибка "); //вывод ошибки на экран
  81. fclose(fp);
  82. system("pause");
  83. return -2;
  84. }
  85. } while(1);
  86. fclose(fp);
  87. system("pause");
  88. return 0;
  89. }
  90.  
  91.  
  92.  
  93.  
  94.  
  95. int formFile(char* filename) { //формирует файл со структурой (номер маршрута, кол-во единиц)
  96. if(vec.size()==0) { //если вектор пуст
  97. cout<<"Сначала прочитайте файл!"<<endl;
  98. system("pause");
  99. return -1;
  100. }
  101.  
  102. FILE* fp = fopen(filename, "wb"); //открываем файл в режиме write binary (чтение, бинарный)
  103. if(!fp) { //если указатель нулевой
  104. perror("Ошибка "); //вывод ошибки на экран
  105. system("pause");
  106. return -2; //выход с кодом ошибки
  107. }
  108.  
  109. for(int i=0; i<vec.size(); ++i) {
  110. int res1 = fwrite(&vec[i].number, sizeof(vec[i].number), 1, fp); //записываем число - номер маршрута
  111. int res2 = fwrite(&vec[i].count, sizeof(vec[i].number), 1, fp); //пишем число - количество подвижных единиц
  112. if(res1<1 || res2<1) { //проверяем количество записанных элементов
  113. cout<<"Ошибка записи в файл"<<filename<<endl;
  114. system("pause");
  115. fclose(fp);
  116. return -3;
  117. }
  118. }
  119. fclose(fp);
  120. system("pause");
  121. return 0;
  122. }
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132. int readFromFile2(char* filename) { //функция читает сформированный по условию задания файл, принимает в параметре имя файла
  133. FILE* fp = fopen(filename, "rb"); //открываем файл в режиме read binary (чтение, бинарный)
  134. if(!fp) { //если указатель нулевой
  135. perror("Ошибка "); //вывод ошибки на экран
  136. system("pause");
  137. return -1; //выход с кодом ошибки
  138. }
  139.  
  140. int info[2]; //массив, куда будут считываться данные
  141. do {
  142. int bytes = fread(info, sizeof(int), 2, fp); //чтение из файла в массив из двух int, размером 2*sizeof(int), из файла fp. bytes-кол-во считанных байт
  143. if(bytes>0) //если считано не 0 байт
  144. cout<<info[0]<<" маршрут"<<": "<<info[1]<<" подвижных единиц"<<endl;
  145. else
  146. break;
  147. } while (!feof(fp)); //пока не конец файла
  148.  
  149. fclose(fp);
  150. system("pause");
  151. return 0;
  152. }
  153.  
  154.  
  155.  
  156.  
  157. int addRecord(char* filename) {
  158. cout<<"Добавление записи. Введите 0 для прекращения"<<endl;
  159. cout<<"Номер маршрута: ";
  160. cin>>temp.number;
  161. if(temp.number==0) //если введён 0
  162. return 0; //выход из цикла
  163. cout<<"Тип транспорта: ";
  164. cin>>temp.type;
  165. cout<<"Количество единиц: ";
  166. cin>>temp.count;
  167. vec.push_back(temp);
  168.  
  169. FILE* fp = fopen(filename, "ab"); //открываем файл в режиме add bynary (добавить, двоичный)
  170. if(!fp) { //если указатель нулевой
  171. perror("Ошибка "); //вывод ошибки на экран
  172. system("pause");
  173. return -1; //выход с кодом ошибки
  174. }
  175.  
  176. if(fwrite(&temp, sizeof(temp), 1, fp) < 1) {//пишем структуру в файл, получаем количество записанных элементов. если записано меньше 1 элемента, выдаём ошибку
  177. cout<<"Ошибка при записи"<<endl;
  178. system("pause");
  179. fclose(fp);
  180. return -2;
  181. }
  182.  
  183. system("pause");
  184. fclose(fp);
  185. return 0;
  186. }
  187.  
  188.  
  189.  
  190.  
  191.  
  192.  
  193.  
  194. int delRecord(char* filename) { //удаление записей с заданным маршрутом
  195. if(vec.size()==0) { //если вектор пуст
  196. cout<<"Сначала прочитайте файл!"<<endl;
  197. system("pause");
  198. return -1;
  199. }
  200.  
  201. int n;
  202. cout<<"Введите номер удаляемого маршрута: ";
  203. cin>>n;
  204. bool found = false; //флаг означает, найдены ли записи
  205.  
  206. //удаляем из вектора подходящие элементы
  207. for(int i=0; i<vec.size(); ++i)
  208. if(vec[i].number == n) { //если номер совпадает
  209. found=true;
  210. vec.erase(vec.begin()+i); //удаляем из вектора i-ый элемент
  211. cout<<"Удалено"<<endl;
  212. }
  213.  
  214.  
  215. if(found) {
  216. FILE* fp = fopen(filename, "wb"); //открываем файл в режиме write binary (чтение, бинарный)
  217. if(!fp) { //если указатель нулевой
  218. perror("Ошибка "); //вывод ошибки на экран
  219. return -2; //выход с кодом ошибки
  220. }
  221.  
  222. //переписываем все элементы вектора в файл
  223. for(int i=0; i<vec.size(); ++i)
  224. if(fwrite(&vec[i], sizeof(vec[i]), 1, fp) < 1) {
  225. cout<<"Запись не удалась"<<endl;
  226. system("pause");
  227. return(-3);
  228. }
  229. fclose(fp);
  230. }
  231.  
  232. else {
  233. cout<<"Элементы не найдены"<<endl;
  234. system("pause");
  235. return(0);
  236. }
  237.  
  238. system("pause");
  239. return(0);
  240. }
  241.  
  242.  
  243.  
  244.  
  245. int editFile(char* filename) {
  246. if(vec.size()==0) { //если вектор пуст
  247. cout<<"Сначала прочитайте файл!"<<endl;
  248. system("pause");
  249. return -1;
  250. }
  251.  
  252. bool found = false; //флаг означает, найдены ли записи
  253. int n;
  254. cout<<"Введите номер маршрута для редактирования: ";
  255. cin>>n;
  256.  
  257. //изменяем элементы вектора подходящие элементы
  258. for(int i=0; i<vec.size(); ++i)
  259. if(vec[i].number == n) { //если номер совпадает
  260. found=true;
  261. cout << i << ") " << vec[i].number << '\t' << vec[i].type << '\t' << vec[i].count <<endl; //вывод
  262. cout<<"Введите новое количество подвижных единиц: ";
  263. cin>>vec[i].count;
  264. }
  265.  
  266. if(found) {
  267. FILE* fp = fopen(filename, "wb"); //открываем файл в режиме write binary (чтение, бинарный)
  268. if(!fp) { //если указатель нулевой
  269. perror("Ошибка "); //вывод ошибки на экран
  270. return -2; //выход с кодом ошибки
  271. }
  272.  
  273. //переписываем все элементы вектора в файл
  274. for(int i=0; i<vec.size(); ++i)
  275. if(fwrite(&vec[i], sizeof(vec[i]), 1, fp) < 1) {
  276. cout<<"Запись не удалась"<<endl;
  277. system("pause");
  278. fclose(fp);
  279. return(-3);
  280. }
  281. fclose(fp);
  282. }
  283. else {
  284. cout<<"Элементы не найдены"<<endl;
  285. system("pause");
  286. return(0);
  287. }
  288.  
  289.  
  290. system("pause");
  291. return(0);
  292. }
  293.  
  294.  
  295.  
  296.  
  297.  
  298. int main() {
  299. int key; //нажатая клавиша
  300. setlocale(LC_ALL, "Rus"); //устанавливаем русскую локаль
  301. do {
  302. system("cls"); //clear screen - очистка экрана
  303. cout<<"1. Выход\n2. Создать файл\n3. Чтение файла\n4. Сформировать файл (№ маршр., кол-во единиц)\n5. Показать сформированный файл\n6. Добавить запись\n7. Удалить записи по № маршрута\n8. Корректировка файла\n";
  304. key=getch();
  305. system("cls");
  306. switch(key) {
  307. case '2':
  308. newFile("transport");
  309. break;
  310. case '3':
  311. readFromFile("transport");
  312. break;
  313. case '4':
  314. formFile("dop_file");
  315. break;
  316. case '5':
  317. readFromFile2("dop_file");
  318. break;
  319. case '6':
  320. addRecord("transport");
  321. break;
  322. case '7':
  323. delRecord("transport");
  324. break;
  325. case '8':
  326. editFile("transport");
  327. break;
  328. }
  329. } while (key!='1');
  330. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement