#include #include //для работы с calloc #include //для работы со строками #include //содержатся флаги режимов доступа к файлам (mode) #include //содержатся флаги открытия файлов (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"); }