task4-dll.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. #include <stdio.h>
  2. #include <stdlib.h> //для работы с calloc
  3. #include <string.h> //для работы со строками
  4. #include <sys/stat.h> //содержатся флаги режимов доступа к файлам (mode)
  5. #include <fcntl.h> //содержатся флаги открытия файлов (flags)
  6. struct _person
  7. {
  8. char *surname;
  9. char *name;
  10. char *patronymic;
  11. int age;
  12. struct _person *next;
  13. };
  14. typedef struct _person Person;
  15. typedef Person *People;
  16. People readstr(char *strarr)
  17. {
  18. People arr = calloc(1, sizeof(Person));
  19. char *newLine = strtok(strarr, ";"); // создаем новую строку
  20. int num = 0;
  21. while (newLine != NULL)
  22. {
  23. switch (num)
  24. {
  25. case 0:
  26. arr->surname = newLine;
  27. break;
  28. case 1:
  29. arr->name = newLine;
  30. break;
  31. case 2:
  32. arr->patronymic = newLine;
  33. break;
  34. case 3:
  35. {
  36. int a;
  37. sscanf(newLine, "%d", &a);
  38. arr->age = a;
  39. }
  40. break;
  41. default:
  42. break;
  43. }
  44. num++;
  45. newLine = strtok(NULL, ";");
  46. }
  47. return arr;
  48. }
  49. People convertToPeople(char *str)
  50. {
  51. People arr = calloc(1, sizeof(Person));
  52. int numc = 0; // номер символа в строке str
  53. size_t countp = 0; // количество людей
  54. char *strarr = strtok(str, "\n"); // делим строку на подстроки по переходу на новую страницу
  55. char *newLine[1000];
  56. while (strarr != NULL)
  57. {
  58. newLine[countp] = strarr;
  59. strarr = strtok(NULL, "\n");
  60. countp++;
  61. }
  62. arr = readstr(newLine[0]);
  63. People head = arr;
  64. for (int i = 1; i < countp; i++)
  65. {
  66. arr->next = readstr(newLine[i]);
  67. arr->next->next = NULL;
  68. // проверка записи
  69. // printf("\n%s %s %s %d", arr->surname, arr->name, arr->patronymic, arr->age);
  70. arr = arr->next;
  71. }
  72. return head;
  73. }
  74. People readFile(char *path)
  75. {
  76. int flag = O_RDONLY;
  77. int mode = S_IRWXG | S_IRWXG | S_IRWXO;
  78. int fd = open // создание(открытие) файлового дескриптора, для работы
  79. (path, // путь к файлу
  80. flag, // флаг для открытия файлов
  81. mode); // флаг для режима доступа к файлу
  82. if (fd == -1)
  83. {
  84. printf("\nНе удалось открыть файл\n");
  85. exit(-1);
  86. }
  87. size_t _size = 10000;
  88. char *buffer = calloc(_size, sizeof(char)); // буфер для записи содержимого файла
  89. int numread = read(fd, buffer, _size); // считывание файла buffer размером с size_
  90. if (numread < 0)
  91. {
  92. printf("\nНе удалось прочитать файл\n");
  93. exit(-1);
  94. }
  95. close(fd); // закрытие файлового дискриптора
  96. return convertToPeople(buffer);
  97. }
  98. People searchPeople(People arr, char *str)
  99. {
  100. People newArr = calloc(1, sizeof(People));
  101. People last = NULL;
  102. People head = NULL;
  103. while (arr != NULL)
  104. {
  105. if (strstr(arr->surname, str) != NULL)
  106. {
  107. People pers = calloc(1, sizeof(Person));
  108. pers->surname = arr->surname;
  109. pers->name = arr->name;
  110. pers->patronymic = arr->patronymic;
  111. pers->age = arr->age;
  112. pers->next = NULL;
  113. if (last == NULL)
  114. newArr = pers;
  115. else
  116. {
  117. newArr->next = pers;
  118. newArr = newArr->next;
  119. }
  120. // printf("\n%s %s %s %d", arr->surname, arr->name, arr->patronymic, arr->age);
  121. if (head == NULL)
  122. head = newArr;
  123. if (last != NULL)
  124. last->next = newArr;
  125. last = newArr;
  126. }
  127. arr = arr->next;
  128. }
  129. newArr->next = NULL;
  130. return head;
  131. }
  132. double averagePeople(People arr)
  133. {
  134. int count = 0;
  135. int age = 0;
  136. while (arr != NULL)
  137. {
  138. age += arr->age;
  139. count++;
  140. arr = arr->next;
  141. }
  142. return age / count;
  143. }
  144. void writePeople(People arr, char *path)
  145. {
  146. int flags = O_WRONLY;
  147. int mode = S_IRWXU | S_IRWXG | S_IRWXO;
  148. int fd = open(path, flags, mode); // Создание файлового дискриптора, для работы с файлом
  149. if (fd == -1)
  150. {
  151. printf("\nНе удалось открыть файл\n");
  152. exit(2);
  153. }
  154. while (arr != NULL)
  155. {
  156. char *answer = calloc(1000, sizeof(char *));
  157. sprintf(answer, "%s;%s;%s;%d\n", arr->surname, arr->name, arr->patronymic, arr->age);
  158. int numwrite = write(fd, answer, strlen(answer)); // запись в файл path - answer
  159. if (numwrite < 0)
  160. {
  161. printf("\nНе удалось записать в файл\n");
  162. exit(4);
  163. }
  164. arr = arr->next;
  165. }
  166. close(fd); // закрытие файлового дискриптора
  167. }
  168. void showPeople(People arr)
  169. {
  170. int count = 0;
  171. while (arr != NULL)
  172. {
  173. printf("\n%s %s %s %d", arr->surname, arr->name, arr->patronymic, arr->age);
  174. arr = arr->next;
  175. }
  176. printf("\n");
  177. }