123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- #include <stdio.h>
- #include <stdlib.h> //для работы с calloc
- #include <string.h> //для работы со строками
- #include <sys/stat.h> //содержатся флаги режимов доступа к файлам (mode)
- #include <fcntl.h> //содержатся флаги открытия файлов (flags)
- struct _person
- {
- char *surname;
- char *name;
- char *patronymic;
- int age;
- struct _person *next;
- };
- typedef struct _person Person;
- typedef Person *People;
- People readstr(char *strarr)
- {
- People arr = calloc(1, sizeof(Person));
- char *newLine = strtok(strarr, ";"); // создаем новую строку
- int num = 0;
- while (newLine != NULL)
- {
- switch (num)
- {
- case 0:
- arr->surname = newLine;
- break;
- case 1:
- arr->name = newLine;
- break;
- case 2:
- arr->patronymic = newLine;
- break;
- case 3:
- {
- int a;
- sscanf(newLine, "%d", &a);
- arr->age = a;
- }
- break;
- default:
- break;
- }
- num++;
- newLine = strtok(NULL, ";");
- }
- return arr;
- }
- People convertToPeople(char *str)
- {
- People arr = calloc(1, sizeof(Person));
- int numc = 0; // номер символа в строке str
- size_t countp = 0; // количество людей
- char *strarr = strtok(str, "\n"); // делим строку на подстроки по переходу на новую страницу
- char *newLine[1000];
- while (strarr != NULL)
- {
- newLine[countp] = strarr;
- strarr = strtok(NULL, "\n");
- countp++;
- }
- arr = readstr(newLine[0]);
- People head = arr;
- for (int i = 1; i < countp; i++)
- {
- arr->next = readstr(newLine[i]);
- arr->next->next = NULL;
- // проверка записи
- // printf("\n%s %s %s %d", arr->surname, arr->name, arr->patronymic, arr->age);
- arr = arr->next;
- }
- return head;
- }
- People readFile(char *path)
- {
- int flag = O_RDONLY;
- int mode = S_IRWXG | S_IRWXG | S_IRWXO;
- int fd = open // создание(открытие) файлового дескриптора, для работы
- (path, // путь к файлу
- flag, // флаг для открытия файлов
- mode); // флаг для режима доступа к файлу
- if (fd == -1)
- {
- printf("\nНе удалось открыть файл\n");
- exit(-1);
- }
- size_t _size = 10000;
- char *buffer = calloc(_size, sizeof(char)); // буфер для записи содержимого файла
- int numread = read(fd, buffer, _size); // считывание файла buffer размером с size_
- if (numread < 0)
- {
- printf("\nНе удалось прочитать файл\n");
- exit(-1);
- }
- close(fd); // закрытие файлового дискриптора
- return convertToPeople(buffer);
- }
- People searchPeople(People arr, char *str)
- {
- People newArr = calloc(1, sizeof(People));
- People last = NULL;
- People head = NULL;
- while (arr != NULL)
- {
- if (strstr(arr->surname, str) != NULL)
- {
- People pers = calloc(1, sizeof(Person));
- pers->surname = arr->surname;
- pers->name = arr->name;
- pers->patronymic = arr->patronymic;
- pers->age = arr->age;
- pers->next = NULL;
- if (last == NULL)
- newArr = pers;
- else
- {
- newArr->next = pers;
- newArr = newArr->next;
- }
- // printf("\n%s %s %s %d", arr->surname, arr->name, arr->patronymic, arr->age);
- if (head == NULL)
- head = newArr;
- if (last != NULL)
- last->next = newArr;
- last = newArr;
- }
- arr = arr->next;
- }
- newArr->next = NULL;
- return head;
- }
- double averagePeople(People arr)
- {
- int count = 0;
- int age = 0;
- while (arr != NULL)
- {
- age += arr->age;
- count++;
- arr = arr->next;
- }
- return age / count;
- }
- void writePeople(People arr, char *path)
- {
- int flags = O_WRONLY;
- int mode = S_IRWXU | S_IRWXG | S_IRWXO;
- int fd = open(path, flags, mode); // Создание файлового дискриптора, для работы с файлом
- if (fd == -1)
- {
- printf("\nНе удалось открыть файл\n");
- exit(2);
- }
- while (arr != NULL)
- {
- char *answer = calloc(1000, sizeof(char *));
- sprintf(answer, "%s;%s;%s;%d\n", arr->surname, arr->name, arr->patronymic, arr->age);
- int numwrite = write(fd, answer, strlen(answer)); // запись в файл path - answer
- if (numwrite < 0)
- {
- printf("\nНе удалось записать в файл\n");
- exit(4);
- }
- arr = arr->next;
- }
- close(fd); // закрытие файлового дискриптора
- }
- void showPeople(People arr)
- {
- int count = 0;
- while (arr != NULL)
- {
- printf("\n%s %s %s %d", arr->surname, arr->name, arr->patronymic, arr->age);
- arr = arr->next;
- }
- printf("\n");
- }
|