@Mehelborn

Как изменить и прочитать файл в Си?

Пишу на Си.

Необходимо создать файл, структуру учеников и их оценок за экзамены, затем вывести список двоешников, при этом должна быть возможность добавить нового ученика в файл.

Вроде всё сделала, но есть одна проблемка (или даже несколько), почему процедура поиска двоешника при повторном поиске (после добавления в файл нового ученика) не добавляет в список двоешников, новых учеников с двойками? То есть я создала файл с учениками и их оценками, затем прогнала процедуру поиска, затем добавляю новых учеников с двойками в файл и снова прогоняю процедуру, НО она не учитывает новых, добавленных учеников.

Извините за невежество, на Си не пишу и с файлами не работаю! Может где то в коде очень глупая ошибка или чего то не учла. Помогите плез.

#include <stdio.h>
#include <stdlib.h>

#define LN_SIZE 20

struct students {
	char lastname[LN_SIZE];
	int rbnum; //student record book number
	int rlang, maths, proging, phys; //Grades of 4 subjects
};
struct students student;

FILE *file_ptr;

void new_table(void);
void print_table(void);
void add_new_note(void);
void print_only_Dpupils(void);

int main(void) {
    int the_key;
    printf("1. Create a new table in a file;\n");
    printf("2. Print the table;\n");
    printf("3. Print only D-pupils;\n");
    printf("4. Add a new student to the beginning;\n");    
    printf("5. Exit.\n");
    scanf("%d", &the_key);
    if(the_key == 1) {
        new_table();    
    }
    else if(the_key == 2) {
        print_table();
    }
    else if(the_key == 3) {
        print_only_Dpupils();
    }
    else if(the_key == 4) {
        add_new_note();
    }
    else if(the_key == 5) {
        return 0;
    }
    else printf("ERROR: Please choose the option number.");
	return 0;
}

void new_table(void) {
    int exit_key;
    file_ptr = fopen("Students.dat", "wb");
    int i = 0;
    do {
        i++;
        printf("\nEnter information about a student");
        printf("\n%d. Lastname: ", i);
        scanf("%s", student.lastname);
        printf("\nRecord book number: ");
        scanf("%6d", &student.rbnum);
        printf("\nRussian language exam grade: ");
        scanf("%1d", &student.rlang);
        printf("\nMaths exam grade: ");
        scanf("%1d", &student.maths);
        printf("\nProgramming exam grade: ");
        scanf("%1d", &student.proging);
        printf("\nPhysics exam grade: ");
        scanf("%1d", &student.phys);

        fwrite(&student, sizeof(student), 1, file_ptr);

        printf("Enter 0 for exit or 1 to continue...\n");
        scanf("%d", &exit_key);
    }
    while(exit_key != 0);
    fclose(file_ptr);
}

void print_table(void) {
    file_ptr = fopen("Students.dat", "rb");

    fread(&student, sizeof(student), 1, file_ptr);
    
    printf("%-25s%-25s%-25s%-25s%-25s%-25s", 
            "Lastname", "RB number", "Russian language", 
            "Mathematics", "Programming", "Physics");
    int i = 1;
    while(!feof(file_ptr)) {
        printf("\n\n%d. %-25s%-25d%-25d%-25d%-25d%-25d",
        i, student.lastname, student.rbnum, student.rlang,
        student.maths, student.proging, student.phys);
        fread(&student, sizeof(student), 1, file_ptr);
        i++;
    }
    getchar();
}

void print_only_Dpupils(void) {
    file_ptr = fopen("Students.dat", "rb");

    fread(&student, sizeof(student), 1, file_ptr);

    printf("%-25s%-25s%-25s%-25s%-25s%-25s", 
            "Lastname", "RB number", "Russian language", 
            "Mathematics", "Programming", "Physics");
    int i = 1;
    while(!feof(file_ptr)) {
        if(student.rlang == 2 || student.maths == 2 || student.proging == 2 || student.phys == 2) {            
            printf("\n\n%d. %-25s%-25d%-25d%-25d%-25d%-25d",
            i, student.lastname, student.rbnum, student.rlang,
            student.maths, student.proging, student.phys);

            fread(&student, sizeof(student), 1, file_ptr);
            
            i++;   
        }
    }
    getchar();
}

void add_new_note() {
  int exit_key;
  file_ptr = fopen("Students.dat", "ab");
  do {
        printf("\nEnter information about a student");
        printf("\nLastname: ");
        scanf("%s", student.lastname);
        printf("\nRecord book number: ");
        scanf("%6d", &student.rbnum);
        printf("\nRussian language exam grade: ");
        scanf("%1d", &student.rlang);
        printf("\nMaths exam grade: ");
        scanf("%1d", &student.maths);
        printf("\nProgramming exam grade: ");
        scanf("%1d", &student.proging);
        printf("\nPhysics exam grade: ");
        scanf("%1d", &student.phys);

        fwrite(&student, sizeof(student), 1, file_ptr);

        printf("Enter 0 for exit or 1 to continue...\n");
        scanf("%d", &exit_key);
  }
  while(exit_key != 0);
  fclose(file_ptr);
}
  • Вопрос задан
  • 101 просмотр
Пригласить эксперта
Ответы на вопрос 1
@galaxy
Вы не делаете fclose() в функциях чтения, возможно, из-за этого проблемы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы