Сохранение структуры в бинарно-открытый файл. Кто подскажет? - C (СИ)
Формулировка задачи:
Всем привет!)
собственно проблема:
Друзья. Структура st , создал в мэйне переменную:
st group
вот заполняю поля и хочу сохранить в файл.. но никак не могу разобраться чтоб целую структуру сохранило, вообще - возможно ли это сделать или нужно сохранение поочередно, по-полю? подскажите.. или скажите что можно почитать об этом.. может что-то упустил.. структура вроде заполняется нормально.. но вот сохранить в файл - не хочет( fwrite оставил пустым вкоде.. скажите что вставить.. буду дико благодарен!
FILE *fin=fopen(def,"a+b");
puts("\nEnter name:\n");
cin>> group->name;
puts("\nEnter addres:\n");
cin>>group->addr;
puts("\nEnter date of birth:\n");
cin>>group->dateofb;
puts("\nEnter <score>:\n");
cin >> group->score;
// fwrite(?,?,?,fin);
fclose(fin);
там где def , в открытии файла: D:\\base.txt
Решение задачи: «Сохранение структуры в бинарно-открытый файл. Кто подскажет?»
textual
Листинг программы
void print()
{
struct st group;
FILE *fin=fopen(def,"rb");
while(!feof(fin))
{
size_t bytes_read = fread(&group, sizeof group, 1, fin);
if(bytes_read == 0)
break;
if(bytes_read != sizeof group)
{
perror("hooita");
exit(1);
}
printf("%s %s %s %d\n", group->name, group->addr
, group->dateofb, group->score);
}
puts("\n\n");
fclose(fin);
}
Объяснение кода листинга программы
- В функции
print()объявлена структураstи переменнаяfin, которая будет использоваться как файловый указатель. - Переменная
finинициализируется вызовом функцииfopen(def,rb). Функцияfopen()открывает файл с именемdefв бинарном режиме чтения. - Затем в цикле
while(!feof(fin))происходит чтение данных из файла. Функцияfread(&group, sizeof group, 1, fin)читает один блок данных размеромsizeof groupиз файла в переменнуюgroup. Если чтение прошло успешно (то есть было прочитано именноsizeof groupбайт), то цикл продолжается. Если чтение не удалось (то есть было прочитано 0 байт), то цикл прерывается. - В условии
if(bytes_read != sizeof group)проверяется, что было прочитано именноsizeof groupбайт. Если это не так, то выводится сообщение об ошибке с помощью функцииperror(hooita)и программа завершается с кодом ошибки 1 с помощью функцииexit(1). - В строке
printf(%s %s %s %d\n, group->name, group->addr, group->dateofb, group->score)выводятся значения полей структурыst. - После окончания цикла программа выводит новую строку с помощью функции
puts(\n\n). - Функция
fclose(fin)закрывает файл. - В основной программе необходимо вызвать функцию
print().