Witam
Czy ktoś mógłby poprawić funkcję zapisującą (save) i odczytującą (load). Nie radze sobie z zapisem plików. Niby dane są zapisywane do pliku, jednak po ich odczytaniu program wyświetla krzaczki zamiast poprawnych wartości
Oto kod programu:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct klient{
char imie[15];
char nazwisko[15];
int pesel;
};
struct ksiazka{
int rok_wydania;
char tytul[30];
char autor[30];
int dostepnosc;
int cena_wypoz;
struct klient klient;
struct ksiazka *next, *prev;
};
////-----------DODAWACZKA----------------------------------//
struct ksiazka * dodaj_nowy(struct ksiazka *head)
{
char tmp[30];
struct ksiazka *x= NULL;
x = (struct ksiazka *)malloc(sizeof(struct ksiazka));
struct ksiazka *pomocnicza = NULL;
pomocnicza = head;
//--------->POBIERANIE DANYCH O KSIAZCE
printf("Podaj rok wydania ksiazki: \n");
scanf("%d", &x->rok_wydania);
printf("Podaj tytul dziela: \n");
fflush(stdin);
gets(tmp);
strcpy(x->tytul, tmp);
printf("Podaj autora dziela: \n");
fflush(stdin);
gets(tmp);
strcpy(x->autor, tmp);
printf("Podaj cene wypozyczenia ksiazki/tydzien: \n");
scanf("%d", &x->cena_wypoz);
x->dostepnosc=1;
if(head){
while(head->next) head=head->next;
x->prev=head;
x->next=NULL;
head->next=x;
return pomocnicza;}
else {
x->prev=NULL;
x->next=NULL;
return x;
}
}
//--------------UUSUWACZKA----------------------//
struct ksiazka *usun(struct ksiazka *head)
{
struct ksiazka *x = head;
printf("Podaj tytul ksiazki do usuniecia: \n");
char tmp[30];
fflush(stdin);
gets(tmp);
while(strcmp(tmp,x->tytul)&&x->next!=NULL) x=x->next; //strcmp porownuje stringi i zwraca 0 jak sa takie same
if(x==NULL) printf("Nie ma takiej ksiazki!!!!\n");
else if(x->next==NULL && x->prev==NULL){
head=NULL;
}
else if(x->prev==NULL){//element jest glowa
head=x->next;
x->prev=NULL;
x->next->prev=head;
}
else if(x->next==NULL){//element jest ogonem
x->prev->next=NULL;
}
else{//element nie jest ani ogonem ani glowa
x->next->prev=x->prev;
x->prev->next=x->next;
}
free(x);
return head;
}
//-------------------WYPOZYCZACZ-------------------------------//
void wypozycz(struct ksiazka *head)
{
char tmp[30];
printf("Podaj tytul ksiazki ktora jest do wypozyczenia: \n");
gets(tmp);
while(strcmp(tmp, head->tytul) && head) head=head->next;
if(head=NULL) printf("Nie ma takiej ksiazki!\n");
else if(head->dostepnosc == 0 ) printf("Ksiazka nie jest dostepna! \n");
else{
printf("Podaj imie klienta: \n");
scanf("%s", &tmp);
strcpy(head->klient.imie, tmp);
printf("Podaj nazwisko klienta: \n");
scanf("%s", &tmp);
strcpy(head->klient.nazwisko, tmp);
printf("Podaj numer PESEL klienta: \n");
scanf("%d", head->klient.pesel);
head->dostepnosc=1;
}
}
//---------------ODDANIE KSIAZKI-----------//
void zwrot(struct ksiazka *head)
{
int pesel = 0;
printf("Podaj numer PESEL osoby, ktora wypozyczyla ksiazke: \n");
scanf("%d", &pesel);
char tmp[1]={"\0"};
while(head->klient.pesel != pesel && head) head=head->next;
if(head==NULL) printf("Osoba o takim PESEL nie wypozyczyla zadnej ksiazki!\n");
else{
head->dostepnosc = 1;
strcpy(head->klient.imie, tmp);
strcpy(head->klient.nazwisko, tmp);
head->klient.pesel=0;
}
}
//---------------KOSZTOW LICZYDLO---------------------------------------//
int koszt_wszystkich(struct ksiazka *head)//liczy koszt calkowity aktualnie niewypozyczonych ksiazek
{
int suma = 0;
while(head) {
suma = suma + head->cena_wypoz;
head=head->next;
}
return suma;
}
int koszt_dostepnych(struct ksiazka *head)
{
int suma = 0;
while(head){
if(head->dostepnosc==1) suma = suma + head->cena_wypoz;
head=head->next;
}
return suma;
}
void cena_ksiazek(struct ksiazka *head)
{
printf("Koszt aktualnie dostepnych ksiazek wynosi: %d\n", koszt_dostepnych(head));
printf("Koszt wszystkich ksiazek wynosi: %d \n", koszt_wszystkich(head));
}
//---------------SZUKANIE NAJTANSZEJ KSIAZKI-----------------------//
int szukaj_najtanszej(struct ksiazka *head)//znalezienie najnizszej ceny
{
int najnizsza = head->cena_wypoz;
while(head->next) {
if(head->next->cena_wypoz < najnizsza) najnizsza = head->next->cena_wypoz;
head=head->next;
}
return najnizsza;
}
void pokash_najtansza(struct ksiazka *head)//pokazanie elementu o tej cenie
{
int cena = szukaj_najtanszej(head);
while(head && head->cena_wypoz != cena) head=head->next;
if(head->dostepnosc == 1) printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: TAK",
head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
else printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: NIE",
head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
}
//--------------------WYSZUKANIE KSIAZKI PO TYTULE--------------------------------------//
void szukajka(struct ksiazka *head)
{
printf("Podaj tytul poszukiwanej ksiazki: \n");
char tmp[30];
scanf("%s", &tmp);
while(strcmp(tmp, head->tytul) && head) head=head->next;
if(head==NULL) printf("Nie ma takiej ksiazki!\n");
else {
if(head->dostepnosc == 1) printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: TAK",
head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
else printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: NIE",
head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
}
}
//--------------WYPISANIE WSZYSTKICH POZYCJI--------------------//
void pokash_sysko(struct ksiazka *head)
{
while(head){
if(head->dostepnosc == 1) printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: TAK\n",
head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
else printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: NIE\n",
head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
head=head->next;
}
}
//----------------------Zapisanie danych do pliku---------------------//
void save(char *nazwa, struct ksiazka *head)
{
FILE *pliczek = fopen(nazwa,"w+b");
while(head!=NULL){
fwrite(head->tytul,sizeof (char),strlen(head->tytul),pliczek);
fwrite(&head,sizeof (struct ksiazka), 1, pliczek);
head=head->next;
}
fclose(pliczek);
}
//----------------WCZYTANIE DANYCH Z PLIKU--------------------------------//
struct ksiazka *load(char *nazwa, struct ksiazka *head)
{
FILE *pliczek=fopen(nazwa, "r+b");
if(pliczek==NULL){
pliczek=fopen(nazwa,"w+b");
}
struct ksiazka *pierwszy, *nowy, *ostatni;
pierwszy = head;
while (1){
if(pierwszy==NULL){
if((nowy=(struct ksiazka*)malloc(sizeof(struct ksiazka))) == NULL) ;
if(1!=fread(nowy, sizeof(struct ksiazka), 1, pliczek)) break;//fread zwraca 1 jesli nie udalo sie
nowy->next=NULL; //odczytac pliku, badz sie skonczyl
nowy->prev=NULL;
pierwszy=nowy;
ostatni = pierwszy;
}
else {
if((nowy=(struct ksiazka*)malloc(sizeof(struct ksiazka))) == NULL) ;
if(1!=fread(nowy, sizeof(struct ksiazka), 1, pliczek)) break;
nowy->next=NULL;
nowy->prev=ostatni;
ostatni->next=nowy;
ostatni=nowy;
}
}
fclose(pliczek);
pliczek=NULL;
return pierwszy;
}
/* FUNKCJA MAIN*/
int main(void)
{
struct ksiazka *head = NULL;
char nazwa[]={"Bucher.jac"};
head = load(nazwa, head);
char akcja;
do{
printf("Podaj liczbe odpowiadajaca interesujacej cie akcji:\n1. Dodaj nowa ksiazke\n2. Usun wybrany tytul\n");
printf("3. Wypozycz ksiazke\n4. Oddaj ksiazke\n5. Oblicz srednia cene wypozyczenia ksiazek\n");
printf("6. Wyszukaj ksiazke o najnizszej cenie\n7. Wyszukaj ksiazke wg tytulu\n8. Wypisz informacje o wszystkich tytulach\n");
printf("9. Zakoncz prace\n");
fflush(stdin);
scanf("%c",&akcja);
switch(akcja)
{
case'1':head = dodaj_nowy(head);
break;
case'2':head = usun(head);
break;
case'3':wypozycz(head);
break;
case'4':zwrot(head);
break;
case'5':cena_ksiazek(head);
break;
case'6':pokash_najtansza(head);
break;
case'7':szukajka(head);
break;
case'8':pokash_sysko(head);
break;
case'9':printf("Milego dnia!\n");
break;
default:printf("Nieznany kod operacji! Sprobuj ponownie:\n");
}
}
while(akcja!='9');
save(nazwa,head);
}