napisalam program do 'mini biblioteki'(zawierajacej max 10 ksiazek...Taki ze uzytkownik ma mozliwosc dopisania wyszukania i wypisania ksiazek . i mam problem z ta ostatnia funkcja. nie do konca ja rozumiem a tym bardziej bledow ktore sie pokazuja. Prosze o pomoc...Czy moze musze rok wydania i ocene zadeklarowac jako tablice? wolalabym nie...pogibilam sie w tym moemencie. prosze o wyrozumialosc :)
#include <stdio.h>
#include <stdlib.h>
struct book
{
char tytul[40];
char autor[30];
int rok_wyd;
char gatunek[20];
int ocena;
}book;
FILE *fp;
#define MAX 10
#define BELL '\x07'
#define FILENAME "Ksiazki.txt"
//tu prototypy fszystkich funkcji wystepujacych w programie
void main(void); //funkcja przekierowywujaca menu
void err_msg(char err_msg[]);
void disp_menu(void); //funkcja wyswietlajaca menu
void clear_sc(void); //czysci ekran
void zapisz(void); //zapisujaca
void add_to_file(struct book z);//dodaj do pliku dyskowego
void wypisz(void); //funckja wypisujaca
void pause_sc(void);
void pr_data(struct book z);
void get_new_z(struct book *z);
void zmien(void); //szuka i zmienia
///////////////////////////////////////
//i zaczynamy
void main(void)
{
struct book list[MAX];
char ans;
do
{ disp_menu(); //wyswietli menu uzytkownika
scanf("%d",&ans);
switch (ans)
{
case (1) : { zapisz();
break; }
case (2) : { wypisz() ;
break; }
case (3) : { zmien() ;
break; }
case (4) : { break;}
default : {err_msg("*** Musisz podac");
printf("od 1 do 4 ***");
break; }
}
} while (ans!=4);
return ;
////////////////////////////////////////
void disp_menu()
{
clear_sc();
print("\t\t Program do obslugi mini biblioteki\n");
printf("Czy chcesz: ?\n");
printf("1. Wpisac nowa pozycje\n");
printf("2. Zobaczyc co jest\n");
printf("3. Zmienic jedna z pozycji\n");
printf("4. Zakonczyc ten program\n");
printf("Ktora opcje wybierasz?");
return ;
}
//////////////////////////////////////////////
void clear_sc()
{
int ctr;
for(ctr=0;ctr<25;ctr++)
{ print("\n"); }
return ;
}
////////////////////////////////////////////
void zapisz(void)
{
struct book z;
char ans;
do
{ fflush(stdin); //oproznij bufor wejsciowy przed pobraniem lancucha znakowego
printf("Podaj tytul: \n");
gets(z.tytul);
printf("Podaj autora: \n");
gets(z.autor);
printf("Podaj rok wydania: \n");
scanf("%d",z.rok_wyd);
printf("Podaj gatunek: \n");
gets(z.gatunek);
printf("Ocen ksiazke w skali od 1 do 5: \n");
scanf("%d",&z.ocena);
add_to_file(z);
printf("\n Czy chcesz wprowadzic nowa pozycje? (T/N");
ans=getchar();
getchar();
}
while (toupper(ans)=='T');
return ;
}
////////////////////////////////////////////
void wypisz(void)
{
struct book z;
int s, linectr=0;
s=sizeof(struct book);
if((fp=fopen(FILENAME, "r"))==NULL)
{ err_msg("Blad odczytu -upewnij sie ze plik istnieje");
return ;
}
do
{
if(fread(&z, sizeof(struct book), 1, fp)!=s)
{if(feof(fp))
{ break; }
}
pr_data(z); //drukuje dane
linectr+=4;
}
while (!eof(fp));
fclose(fp);
pause_sc();
return ;
}
/////////////////////////////////////////////
void zmien(void)
{
struct book z;
int ans, s; //przechowuje rozmiar struktury
int change_yes = 0; //bedzie rowne true jesli uzytkownik znajdzie nazwisko to co chce zmienic
char test_tytul[40];
printf("\nPodaj tytul ksiazki ktora chcesz zmienic");
fflush(stdin);
gets(test_tytul);
fflush(stdin);
s=sizeof(struct book);
if((fp=fopen(FILENAME, "r+"))==NULL)
{ err_msg("Blad odczytu -upewnij sie ze plik istnieje");
return ;
}
do
{
if(fread(&z, sizeof(struct book),1, fp)!=s)
{if(feof(fp))
{ break; }
}
if(strcmp(z.tytul, test_tytul)==0)
{
pr_data(z);
printf("\n Czy o ta pozycje ci chodzilo? (T/N)");
ans=getchar();
getchar();
if (toupper(ans)=='N')
{continue;} //pobierz nowe nazwisko
get_new_z(&z); //powierz nowe info od uzytkownika
fseek(fp, (long)-s, SEEK_CUR); //cofa o jedna strukture do tylu
fwrite(&z, s, 1, fp); //wpisz nowe info
change_yes = 1;
break;
}
}while (!eof(fp));
fclose(fp);
if(!change_yes)
{erg_msg("nie znaleziono nazwiska");}
return ;
}
////////////////////////////
void err_msg(char err_msg[])
{
printf("\n\n%s\n", err_msg);
printf("c", BELL);
return ;
}
//////////////////////////////
void add_to_file(struct book z)
{
if((fp=fopen(FILENAME, "a"))==NULL) //otwiera plik w trypie dolaczania danych
{ err_msg("Blad dysku-sprawdz dysk");
return ;
}
fwrite(&z, sizeof(z), 1, fp); //dodaje strukture do pliku
fclose(fp);
return ;
}
////////////////////
void pause_sc()
{
char ans;
fflush(stdin); //usun wszystkie dodatkowe znaki z bufora wejsciowego
printf("\n Nacisnij enter aby kontynuowac");
ans=getchar();
fflush(stdin);
return ;
}
////////////////////////////////////////
void pr_data(struct book z)
{
printf("\n Tytul: %-40s\n",z.tytul);
printf("Autor: %-30s\n"),z.autor;
printf("Rok wydania: %d\n"),z.rok_wyd;
printf("Gatunek: %-20s\n"),z.gatunek;
printf("Ocena: %d\n"),z.ocena;
return ;
}
////////////////////////////////////////////////////
void get_new_z(struct book *z) //???????????????
{
struct book temp_z; //przechowuje tymczasowe i zmienione dane wejsciowe
printf("\n Wprowadz nizej dane nowej pozycji(nacisnij klawisz enter nie wrowadzajac danych aby zachowac poprzednie");
printf("Podaj nowy tytul: ");
if (strlen(gets(temp_z.tytul))>0)
{strcpy((*z) .tytul, temp_z.tytul); }
printf("Podaj nowego autora: ");
if (strlen(gets(temp_z.autor))>0)
{strcpy((*z) .autor, temp_z.autor); }
printf("Podaj nowy rok wydania: ");
strcpy((*z) .rok_wyd, temp_z.rok_wyd);
printf("Podaj nowy gatunek: ");
(strlen(gets(temp_z.gatunek)>0));
printf("Podaj nowa ocene ksiazki: ");
strcpy((*z) .ocena, temp_z.ocena);
return ;
}