Я викачав цей код з архівом точно не пам'ятаю де, напевно в цій темі або не в цій і тримаю його в нотепаде. Розглядаю іноді котрй день.
Тут принаймні коментарі не крокозябрами.
#include <stdio.h> 
#include <locale.h> 
#include <stdlib.h> 
#include <ctype.h>
#include <conio.h>
#include <string.h> 
struct student{
    int number;
    char name[15];
    char surname[15];
};
struct student group = { { 0 } };  //Тут описується змінна group типу цієї структури, і їй усі її поля забиваються нулями (іниціалізація).
struct marks{
    int number;
    int marks[5];
};
int main()
{   int i=0;
    char login1[]="skyfer",true_password[6]="1927s",login2[32],passw[6];
    setlocale(LC_ALL,"Rus"); 
    printf ("Введiть логiн: ");
    scanf ("%31s", login2);   //- ввод строки, ограниченной 31 символом.
    printf("Введiть пароль: ");
    passw[i]=getch();//Зверніть увагу getch () повертає один символ, прочитаний з клавіатури, 
//    не чекаючи введення <Enter>. При натисненні <Enter> (як на основній, так і на додаткової клавіатурі) видає 1 символ '\r' десятковий 13 (hex 0x0d). Клавіша "Забій" і стрілки теж не працюють, як завжди, Ви отримуєте їх коди.
    printf("*");
      while(passw[i]!=13)
    {
        i++;
        passw[i]=getch();
        printf("*");
    }
    passw[5]=0; //Круто 
    
    if (strcmp(login1,login2) != 0)
    {
       printf ("\nНе правильно введено логiн чи пароль\n");
       return 0;
    }
//    Функція повертає декілька значень, які вказують на відношення рядків :
//Нульове значення говорить про те, що обидва рядки рівні.
//Значення більше нуля вказує на те, що рядок string1 більше рядка string2, значення менше нуля свідчить про зворотне.
//Функція strcmp починає порівнювати по одному символу і як тільки будуть знайдені перші неоднакові символи, функція проаналізує числові коди цих символів. Чий код виявиться більше, той рядок і вважатиметься більшим.
    
    if (strcmp(true_password,passw) != 0)
    {
        printf ("\nНе правильно введено логiн чи пароль\n"); 
        return 0;
    }
    else
    {
        printf("\nВхiд в систему...\n");
        system("cls");
        menu();
    }
    return 0;
}
int menu(){
int choice;
printf("1.Групи\n");
printf("2.Оцiнки\n");
printf("4.Статистика\n");
printf("0.Вихiд з програми\n");
scanf ("%d", &choice);
    if(choice==1){
    groups();    
    }
     if (choice==2){
    marks();
    }
     if (choice==3){
    statistic();
    }
     if (choice==0){
    exit (1);
    }
}
/* Ввод двух чисел, вычисление суммы и печать результата  
#include <stdio.h> 
{ 
int a,b,c; 
scanf(" %d %d",&a,&b); 
c=a+b; 
printf("Cумма = %d \n",c) 
} 
*/
int groups(){
    int choice;
    system("cls");
    printf ("1.Додати нову групу\n");
    printf ("2.Редагувати групу\n");
    printf ("3.Видалити групу\n");
    printf ("4.Переглянути список груп\n");
    printf ("5.Повернутися в головне меню\n");
    printf ("0.Вихiд з програми\n");
    scanf ("%d", &choice);
    if (choice==1){    
    system("cls");
    add_group();
    }
    if (choice==2){    
    system("cls");
    edit_group();
    }
    if (choice==3){
    system("cls");
    delete_group();
    }
    if (choice==4){
    system("cls");
    print_list_groups();
    }
    if (choice==5){
    system("cls");
    menu();
    }
    if (choice==0){
    exit (1);
    }
}
//Она очищает экран консоли, для того и нужна. Например, cout<<"Я пишу в консоли! "//на консоли красуется эта дурацкай надпись system("cls");//надписи больше нет
int add_group()
{
    int numbers=0,i;
    char name_groups[6], dat[5]=".dat", name_group[10];
    struct student group={0,"",""};
    FILE *fPtrG;
    FILE *fPtrN;
    printf ("Введiть назву групи: ");
    scanf ("%s",name_groups);
    fflush(stdin);      //Если поток stream связан с файлом, открытым для записи, то при обращении к функции fflush() в этот файл будет физически записано содержимое выходного буфера. При этом файл остается открытым. 
        if ((fPtrG=fopen("groups.dat", "ab")) == NULL)//<идентификатор файла> = fopen(<имя файла>,<режим работы>);
        printf ("File could not be opened.\n");  // "ab" Дописывает в двоичный файл 
    else       // stdin сбрасывается буфер стандартного потока вывода
    {
    
        fwrite (&name_groups,sizeof(name_groups),1,fPtrG);  //fwrite(&d, sizeof(double), 1, fp);
    }
    
    fclose (fPtrG);
    strncpy(name_group,name_groups,6); //копиюем з name_groups до name_group
    strcat (name_group,dat); // конкатенация рядків- додаємо dat до name_group
    printf ("Введiть кiлькiсть студентiв в групi: ");    
    scanf("%d", &numbers); //- ввод строки не ограниченной 31 символом.
    
    if(numbers>0)
    {
      struct student group[numbers];// Що це таке? Що це взагалі таке? group[i].number це зрозуміло а це що таке? 
      if ((fPtrN=fopen(name_group, "ab")) == NULL) // "ab" Дописывает в двоичный файл 
         printf ("File could not be opened.\n");
    }     
    else
    {
        for (i=1;i<=numbers;i++)
        {
           group[i].number=i; 
           printf ("Прiзвище та Iмя студентaа №%d: \n", i);
           fscanf (stdin,"%s%s",group[i].name,group[i].surname); //читает  fscanf(fp, "%s%f", str, &f); 
           fseek( fPtrN ,sizeof(struct student) , SEEK_SET );  //Функция fseek перемещает указатель позиции в потоке. Устанавливает внутренний указатель положения в файле, в новую позицию, которая определяются путем добавления смещения к исходному положению.
           //изменить позицию на student байт относительно начала файла
           fwrite(&group[i], sizeof(struct student),1,fPtrN);
           //size_t fwrite(const void *буфер, size_t колич_байт, size_t счетчик, FILE *уф);
        }
    
    }
fclose (fPtrN);
}
groups();
//}
/*Функция fflush
#include <stdio.h>
int fflush(FILE *stream);
Если поток stream связан с файлом, открытым для записи, то при обращении к функции fflush() в этот файл будет физически записано содержимое выходного буфера. При этом файл остается открытым. 
Нулевое значение, возвращаемое функцией, свидетельствует о ее успешном выполнении, а значение EOF — о возникновении ошибки при записи. 
При нормальном завершении программы или при заполнении буферов все их coдержимое автоматически дозаписывается в файл. Кроме того, буфер дозаписывается в файл при закрытии файла. 
Пример
Приведенный фрагмент программы дозаписывает в файл содержимое буфера после каждой операции записи. 
  Предполагается, что fp связан с выходным файлом.
for(i=0; i<MAX; i++) {
  fwrite(buf, sizeof(some_type), 1, fp);
  fflush(fp);
} 
Зависимые функции
fclose() fopen() fread() fwrite() getc() putc() */
int edit_group(struct student *group)
{
    int choice=0;
    FILE *fPtrN;
    char name_group[10],dat[5]=".dat";
    print_list_groups();
    printf ("\nОберiть необхiдну групу: \n");
    scanf ("%s",name_group);
    strcat (name_group,dat);  // // конкатенация рядків- додаємо dat до name_group
        if((fPtrN=fopen(name_group, "rb+")) == NULL){
        printf ("File could not be opened.\n");
        }
        else{
        printf("%-2s%-15s%-15s", "Number", "Name", "Surname"); // Я ничого не зрозумів
        }    
        
        fclose (fPtrN);
    printf ("1.Змiнити iм'я студента\n");
    printf ("2.Змiнити прiзвище студента\n");
    printf ("3.Повернутися в меню групи\n");
    printf("0.Вихiд з програми\n");
    scanf ("%d", &choice);
    if (choice==3)
    {
      system("cls");
      groups();
    }
       if (choice==0){
      exit (1);
    }
    
}
int delete_group()
{
    int choice=0;
    char name_group[10],dat[5]=".dat";
    printf ("Введiть назву групи, яку бажаєте видалити: ");
    scanf ("%s",name_group);
    strcat (name_group,dat);
    if(remove(name_group)) {
    printf("Error delete group!");
    return 0;
    }
    else{
        printf("Successfully delete group!\n");
    }
    printf("\n1.Видалити ще одну групу\n2.Повернутися в меню групи\n");
    scanf ("%d", &choice);
    if (choice==1){
        system("cls");
        delete_group();
        }
    if (choice==2){
        system("cls");
        groups();
        }
}
int print_list_groups(){
         int choice;
    {
       FILE * ptrFile = fopen( "groups.dat" , "rb" );
      
       if (ptrFile == NULL)
       {
           fputs("Ошибка файла", stderr); // fputs запиати у файл stderr рядок "Ошибка файла"  тобто помилка
           exit(1);
       }
       fseek(ptrFile , 0 , SEEK_END);                         
       long lSize = ftell(ptrFile);                            
      
      while(!feof(ptrFile))
          { 
             char * buffer = (char*) malloc(sizeof(char) * lSize);
             if (buffer == NULL)
             {
               fputs("Ошибка памяти", stderr);
               exit(2);
             }
             size_t result = fread(buffer, 1, lSize, ptrFile);       
             if (result != lSize)
             {
               fputs("Ошибка чтения", stderr);
               exit (3);
             }
             puts(buffer);
             free (buffer);
          }
          
      fclose (ptrFile);
      
    }
     printf("\n1.Переглянути конкретну групу\n2.Повернутися до меню груп\n3.Повернутися до головного меню\n");
         scanf ("%d", &choice);
         if (choice==1)
         {
             specific_group();//функція за алгоритмом впринципі аналогічна до list_group, но так як і list_group не робоча)
         }
         if (choice==2)
         {
            system("cls");
            groups();
         }
         if (choice==3)
         {
            system("cls");
            menu();
        }
}
int specific_group(struct student *group){
int choice=0;
    printf("\n1.Повернутися до меню груп\n2.Повернутися до головного меню\n");
    scanf("%s", &choice);
    if (choice==1){
    system("cls");
    groups();
    }
    if (choice==2){
    system("cls");
    menu();
}
}
int marks()
{      
    int choice=0;    
    system("cls");
    printf ("1.Внести оцiнки\n");
    printf ("2.Редагувати оцiнки\n");    
    printf ("4.Повернутися в головне меню\n");
    printf("0.Вихiд з програми\n");
    scanf ("%d", &choice);
    if (choice==4)
    {    
      system("cls");
      menu();
    }
    if (choice==0)
    {
      exit (1);
    }
}
int statistic()
{
    int choice;
    system("cls");
    printf ("1.Абсолютний i якiсний показники\n");
    printf ("2.Рейтинг студентiв\n");
    printf ("3.Рейтинг груп\n");
    printf ("4.Повернутися в головне меню\n");
    printf("0.Вихiд з програми\n");
    scanf ("%d", &choice);
    if (choice==4)
    {
       system("cls");
       menu();
    }
    if (choice==0)
    {
       exit (1);
    }
}
165. struct student group[numbers];// Що це таке? Що це взагалі таке? groupi.number це зрозуміло а це що таке?
Ах ти ж .. задерла!