Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- char* NameInput(void) //функция ввода строки с динамическим выделением памяти
- {
- char* name = (char*)malloc(sizeof(char) * 2); //выделение памяти под строку
- int i = 0;
- while (1) //цикл ввода строки
- {
- name[i] = getchar(); //посимвольное считывание
- if ((name = (char*)realloc(name, (i + 2) * sizeof(char))) == NULL) //перевыделение памяти под новый символ и одновременно проверка на выделение памяти
- {
- free(name);
- printf("Ошибка перераспределения памяти");
- exit(14);
- }
- if (name[i++] == '\n') //если символ новой строки то меняем его на \0 и выход и цикла ввода
- {
- name[--i] = '\0';
- break;
- }
- }
- return name; //возвращаем указатель на введенную строку
- }
- int structures_input(stud** students)
- {
- int num;
- printf("Input number of students for addition : ");
- while ((scanf_s("%d", &num)) != 1 || num < 0)
- {
- printf("Incorrect input. Try again... ");
- rewind(stdin);
- }
- *students = (stud*)malloc(num * sizeof(stud));
- for (int i = 0; i < num; i++)
- {
- int j = 0;
- printf("\tStudent N %d", i + 1);
- printf("\nInput students name : ");
- rewind(stdin);
- gets_s((*students + i)->name, N);
- printf("Input all the books student have (to cancel press [@]) : ");
- rewind(stdin);
- for (int j = 0; j < I; j++)
- {
- gets_s((*students + i)->books[j], N);
- if ((*students + i)->books[j][0] == '@')
- {
- (*students + i)->books[j][0] = (*students + i)->books[j][1];
- (*students + i)->count = j;
- break;
- }
- (*students + i)->count = j;
- if (j == I - 1)
- printf("\nEntered max count of books\n");
- }
- }
- printf("\nEnd of input\n");
- fflush(stdin);
- return num;
- }
- void file_input_info(FILE** fp)
- {
- printf("\t\t<<<<Create and input new file>>>>>\n");
- int num;
- stud* students;
- fopen_s(fp, "f.txt", "w+b");
- bufer_check(*fp);
- num = structures_input(&students);
- for (int i = 0; i < num; i++)
- {
- fwrite(&students[i], sizeof(stud), 1, *fp);
- }
- memory_clean(&students, num);
- fclose(*fp);
- }
- \\________________________________
- void output(stud* std, int num)
- {
- int i = num;
- printf("\nStudent N %d\n", i + 1);
- printf("\tname : %s\n", std[i].name);
- printf("\tbooks : \n");
- for (int j = 0; j < std[i].count; j++)
- printf("\t%d.\t%-20s\n", j + 1, std[i].books[j]);
- }
- void file_info_output(FILE** fp)
- {
- printf("\t\t<<<<Information output>>>>>\n");
- fpos_t l1, l2;
- stud* std;
- char* name;
- int num;
- fopen_s(fp, "f.txt", "r+b");
- bufer_check(*fp);
- fgetpos(*fp, &l1);
- fseek(*fp, 0, SEEK_END);
- fgetpos(*fp, &l2);
- num = (l2 - l1) / sizeof(stud);
- std = (stud*)malloc(num * sizeof(stud));
- rewind(*fp);
- for (int i = 0; i < num; i++)
- fread(&std[i], sizeof(stud), 1, *fp);
- rewind(stdin);
- printf("Input name of the student you're looking for : ");
- name = NameInput();
- for (int i = 0; i < num; i++)
- if (strcmp(name, std[i].name) == 0)
- output(&std[i], i);
- fclose(*fp);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement