Advertisement
Guest User

Untitled

a guest
Apr 3rd, 2020
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.19 KB | None | 0 0
  1. char* NameInput(void)                               //функция ввода строки с динамическим выделением памяти
  2. {
  3.     char* name = (char*)malloc(sizeof(char) * 2); //выделение памяти под строку
  4.     int i = 0;
  5.     while (1)                                   //цикл ввода строки
  6.     {
  7.         name[i] = getchar();                    //посимвольное считывание
  8.         if ((name = (char*)realloc(name, (i + 2) * sizeof(char))) == NULL)  //перевыделение памяти под новый символ и одновременно проверка на выделение памяти
  9.         {
  10.             free(name);
  11.             printf("Ошибка перераспределения памяти");
  12.             exit(14);
  13.         }
  14.         if (name[i++] == '\n')                  //если символ новой строки то меняем его на \0 и выход и цикла ввода
  15.         {
  16.             name[--i] = '\0';
  17.             break;
  18.         }
  19.     }
  20.     return name;                                //возвращаем указатель на введенную строку
  21. }
  22. int structures_input(stud** students)
  23. {
  24.     int num;
  25.     printf("Input number of students for addition : ");
  26.     while ((scanf_s("%d", &num)) != 1 || num < 0)
  27.     {
  28.         printf("Incorrect input. Try again...   ");
  29.         rewind(stdin);
  30.     }
  31.     *students = (stud*)malloc(num * sizeof(stud));
  32.     for (int i = 0; i < num; i++)
  33.     {
  34.         int j = 0;
  35.         printf("\tStudent N %d", i + 1);
  36.         printf("\nInput students name : ");
  37.         rewind(stdin);
  38.         gets_s((*students + i)->name, N);
  39.         printf("Input all the books student have (to cancel press [@]) : ");
  40.         rewind(stdin);
  41.         for (int j = 0; j < I; j++)
  42.         {
  43.             gets_s((*students + i)->books[j], N);
  44.             if ((*students + i)->books[j][0] == '@')
  45.             {
  46.                 (*students + i)->books[j][0] = (*students + i)->books[j][1];
  47.                 (*students + i)->count = j;
  48.                 break;
  49.             }
  50.             (*students + i)->count = j;
  51.             if (j == I - 1)
  52.                 printf("\nEntered max count of books\n");
  53.         }
  54.     }
  55.     printf("\nEnd of input\n");
  56.     fflush(stdin);
  57.     return num;
  58. }
  59. void file_input_info(FILE** fp)
  60. {
  61.     printf("\t\t<<<<Create and input new file>>>>>\n");
  62.     int num;
  63.     stud* students;
  64.     fopen_s(fp, "f.txt", "w+b");
  65.     bufer_check(*fp);
  66.     num = structures_input(&students);
  67.     for (int i = 0; i < num; i++)
  68.     {
  69.         fwrite(&students[i], sizeof(stud), 1, *fp);
  70.     }
  71.     memory_clean(&students, num);
  72.     fclose(*fp);
  73. }
  74. \\________________________________
  75. void output(stud* std, int num)
  76. {
  77.     int i = num;
  78.         printf("\nStudent N %d\n", i + 1);
  79.         printf("\tname : %s\n", std[i].name);
  80.         printf("\tbooks : \n");
  81.         for (int j = 0; j < std[i].count; j++)
  82.             printf("\t%d.\t%-20s\n", j + 1, std[i].books[j]);
  83. }
  84. void file_info_output(FILE** fp)
  85. {
  86.     printf("\t\t<<<<Information output>>>>>\n");
  87.     fpos_t l1, l2;
  88.     stud* std;
  89.     char* name;
  90.     int num;
  91.     fopen_s(fp, "f.txt", "r+b");
  92.     bufer_check(*fp);
  93.     fgetpos(*fp, &l1);
  94.     fseek(*fp, 0, SEEK_END);
  95.     fgetpos(*fp, &l2);
  96.     num = (l2 - l1) / sizeof(stud);
  97.     std = (stud*)malloc(num * sizeof(stud));
  98.     rewind(*fp);
  99.     for (int i = 0; i < num; i++)
  100.         fread(&std[i], sizeof(stud), 1, *fp);
  101.     rewind(stdin);
  102.     printf("Input name of the student you're looking for : ");
  103.     name = NameInput();
  104.     for (int i = 0; i < num; i++)
  105.         if (strcmp(name, std[i].name) == 0)
  106.             output(&std[i], i);
  107.     fclose(*fp);
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement