Как сделать вывод данных из бинарного файла Си?
Стоит задача разработать структуру данных для представления простейшей базы данных. Также нужно составить программу генерации внешнего нетекстового файла заданной структуры. С этим я справилась:
Структура:
#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 шт):
у тебя в структуре :
char initials[2]; // два байта
char gender[1]; // один байт
а записываешь ты сколько байтов :
fwrite(stud->initials, sizeof(char), 2, out); // два байта
fwrite(stud->gender, sizeof(char), 2, out); // два байта
gender это чего ?? пол я так понимаю, можна массивом не делать, просто char gender
количество байтов которое в файл записываешь обязательно должно соответствовать количеству которое считываешь