Mam pytanie czy ta statyczna bazę danych można w jakiś łatwy sposób przerobić na dynamiczną?
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define BUFOR 100
struct Dane{
char im[20];
char na[20];
int wk;
}baz[30];
FILE *plik;
int i,n,dlugosc; char nazwa[20];
void WyborBazy()
{
int wybor1=0, dzialanie;
do
{
printf("Podaj nazwe pliku do otworzenia\n");
scanf("%s",nazwa);
printf("\n\nPodales nazwe pliku: %s\n",nazwa);
printf("Chcesz otworzyc ten plik?\n");
printf("\n1-tak\n2-nie (wpisz jeszcze raz)\n");
printf("Jesli plik nie istnieje zostanie utworzony!\n");
scanf("%d",&wybor1);
}while(wybor1!=1);
}
void Wyswietl()
{
char *BuffFile;
plik=fopen(nazwa,"a+");
if((BuffFile=(char*)malloc(BUFOR))==NULL)
{
printf("Nie moge przydzielic pamieci!\n");
exit(1);
}
fscanf(plik, "%d", &dlugosc);
system("cls");
for (i=0; i<dlugosc; i++) //wczytujemy plik
{
fscanf(plik, "%s", &baz[i].im);
fscanf(plik, "%s", &baz[i].na);
fscanf(plik, "%d", &baz[i].wk);
}
fclose(plik); //zamykamy plik
for( i=0; i<dlugosc; i++)
{
printf("Dane %2d:\n\tImie: %s\n\tNazwisko %s \n\tWiek: %d\n",i+1,baz[i].im,baz[i].na,baz[i].wk);
}
}
void DodajRekordy()
{
int r;
printf("Podaj ile rekordow chcesz dodac\n");
scanf("%d",&r);
for(i=0;i<r;i++)
{
printf("\nPodaj Imie:");
scanf("%s", &baz[dlugosc].im);
printf("\nPodaj Nazwisko:");
scanf("%s", &baz[dlugosc].na);
printf("\nPodaj Wiek(0-anuluje):");
scanf("%d", &baz[dlugosc].wk);
if (baz[dlugosc].wk==0)
{
goto skok1;
}
dlugosc=dlugosc+1;
}
plik =fopen(nazwa,"w"); //otwieramy plik
fprintf(plik, "%d\n", dlugosc); //zapisujemy wielkość pliku
for(i=0; i<=dlugosc; i++)
{
fprintf(plik, "%s %s %d\n", baz[i].im, baz[i].na, baz[i].wk);
}
fclose(plik); //zamykamy plik
skok1:;
}
void EdytujRekord()
{
int e;
char *BuffFile;
//WYSWIETLENIE
plik=fopen(nazwa,"a+");
if((BuffFile=(char*)malloc(BUFOR))==NULL)
{
printf("Nie moge przydzielic pamieci!\n");
exit(1);
}
fscanf(plik, "%d", &dlugosc);
system("cls");
for (i=0; i<dlugosc; i++) //wczytujemy plik
{
fscanf(plik, "%s", &baz[i].im);
fscanf(plik, "%s", &baz[i].na);
fscanf(plik, "%d", &baz[i].wk);
}
fclose(plik); //zamykamy plik
for( i=0; i<dlugosc; i++)
{
printf("Dane %2d:\n\tImie: %s\n\tNazwisko %s \n\tWiek: %d\n",i+1,baz[i].im,baz[i].na,baz[i].wk);
}
//EDYCJA
printf("Podaj ktory rekord chcesz edytowac\n");
scanf("%d",&e);
printf("\nPodaj Imie:");
scanf("%s", &baz[e].im);
printf("\nPodaj Nazwisko:");
scanf("%s", &baz[e].na);
printf("\nPodaj Wiek(0-anuluje):");
scanf("%d", &baz[e].wk);
if (baz[e].wk==0)
{
goto skok2;
}
plik =fopen(nazwa,"w"); //otwieramy plik
fscanf(plik, "%d", &dlugosc);
for(i=0;i<=e;i++)
{
fprintf(plik, "%s %s %d\n", baz[i].im, baz[i].na, baz[i].wk);
}
fclose(plik); //zamykamy plik
skok2:;
}
void UsunRekord()
{
int u,x;
usun:
for( i=0; i<dlugosc; i++)
{
printf("%2d: %s %s (%d)\n", i+1, baz[i].im, baz[i].na, baz[i].wk);
}
printf("Ktory rekord skasowac:");
scanf("%d", &u);
if(u>dlugosc)
{
printf("\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!! Nie ma takiego rekordu !!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n");
printf("Wybierz numer od 1 do %d:\n", dlugosc);
goto usun;
}
printf("Rekord %d: %s %s (%d) - zostanie usuniety\nCzy kontynuowac?(tak-1)", u, baz[u-1].im, baz[u-1].na, baz[u-1].wk);
scanf("%d", &x);
if (x==1)
{
plik =fopen(nazwa,"w");
fprintf(plik, "%d\n", dlugosc-1);
for(i=0; i<dlugosc; i++)
{
if(i==u-1)
{
printf("\nUSUNIETO\n");
}
else fprintf(plik, "%s %s %d\n", baz[i].im, baz[i].na, baz[i].wk);
}
fclose(plik);//zamykamy plik
}
else printf("\nAnulowano usuwanie.\n");
}
int main()
{
WyborBazy();
int dzialanie;
while(dzialanie!=0)
{
printf("\n\nMenu uzytkownika. Wybierz dzialanie:\n");
printf("\t1. Wyswietl baze\n");
printf("\t2. Dodaj rekordy do bazy\n");
printf("\t3. Edytuj rekrdy w bazie\n");
printf("\t4. Usun rekord z bazy\n");
printf("\t0. Wyjscie\n");
scanf("%d",&dzialanie) ;
switch(dzialanie)
{
case 1:Wyswietl(); break;
case 2:DodajRekordy(); break;
case 3:EdytujRekord(); break;
case 4:UsunRekord(); break;
case 0:printf("Do zobaczenia!\n");break;
default: printf("Wybrales nieistniejace dzialanie!\n"); break;
}
}
}