Как сделать вывод данных из бинарного файла Си?

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

Структура:

#ifndef _grad_h_

#define _grad_h_

#define NAME_SIZE 50

typedef struct{
    char lname[NAME_SIZE];
    char initials[2];
    char gender[1];
    int school_num;
    char has_medal[NAME_SIZE];
    int rating;
    char essay[NAME_SIZE];
}person;

#endif

Скрипт-генератор выходного файла:

#include <stdio.h>

#include "structure.h"

int readperson(FILE *in, person *stud){
    fscanf(in, "%s", stud->lname);
    fscanf(in, "%s", stud->initials);
    fscanf(in, "%s", stud->gender);
    fscanf(in, "%d", &stud->school_num);
    fscanf(in, "%s", stud->has_medal);
    fscanf(in, "%d", &stud->rating);
    fscanf(in, "%s", stud->essay);

    return !feof(in);
}
int writeperson_bin(FILE *out, person *stud){
    fwrite(stud->lname, sizeof(char), NAME_SIZE, out);
    fwrite(stud->initials, sizeof(char), 2, out);
    fwrite(stud->gender, sizeof(char), 2, out);
    fwrite(&stud->school_num, sizeof(int), 1, out);
    fwrite(stud->has_medal, sizeof(char), NAME_SIZE, out);
    fwrite(&stud->rating, sizeof(int), 1, out);
    fwrite(stud->essay, sizeof(char), NAME_SIZE, out);
}
int main(int argc, char *argv[]){
    FILE *in = fopen(argv[1], "r");
    FILE *out = fopen(argv[2], "w");
    if(!in || !out){
        printf("Error, can't open file\n");
    }
    person stud;
    while(readperson(in, &stud)){
        writeperson_bin(out, &stud);
    };

    fclose(in);
    fclose(out);
}

Последняя программа структурирует данные и сохраняет в бинарник. Однако нужно вывести данные из этого бинарника, в чем и заключается проблема. Пишу программу для вывода, удачно компилирую, выводит кривой набор символов или пустых строк

В чем может быть ошибка?

Программа для вывода:

#include <stdio.h>

#include "structure.h"

int readperson(FILE *in, person *stud){
    fscanf(in, "%s", stud->lname);
    fscanf(in, "%s", stud->initials);
    fscanf(in, "%s", stud->gender);
    fscanf(in, "%d", &stud->school_num);
    fscanf(in, "%s", stud->has_medal);
    fscanf(in, "%d", &stud->rating);
    fscanf(in, "%s", stud->essay);

    return !feof(in);
}
int writeperson_bin(FILE *out, person *stud){
    fwrite(stud->lname, sizeof(char), NAME_SIZE, out);
    fwrite(stud->initials, sizeof(char), 2, out);
    fwrite(stud->gender, sizeof(char), 2, out);
    fwrite(&stud->school_num, sizeof(int), 1, out);
    fwrite(stud->has_medal, sizeof(char), NAME_SIZE, out);
    fwrite(&stud->rating, sizeof(int), 1, out);
    fwrite(stud->essay, sizeof(char), NAME_SIZE, out);
}
int main(int argc, char *argv[]){
    FILE *in = fopen(argv[1], "r");
    FILE *out = fopen(argv[2], "w");
    if(!in || !out){
        printf("Error, can't open file\n");
    }
    person stud;
    while(readperson(in, &stud)){
        writeperson_bin(out, &stud);
    };

    fclose(in);
    fclose(out);
}


Ответы (1 шт):

Автор решения: Slavik

у тебя в структуре :

char initials[2]; //   два байта
char gender[1]; // один байт

а записываешь ты сколько байтов :

fwrite(stud->initials, sizeof(char), 2, out);  // два байта
fwrite(stud->gender, sizeof(char), 2, out);   // два байта

gender это чего ?? пол я так понимаю, можна массивом не делать, просто char gender

количество байтов которое в файл записываешь обязательно должно соответствовать количеству которое считываешь

→ Ссылка