Dynamiczna baza danych w C

0

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;
         }
      }
         
}          
    
            
0

Mam pytanie czy ta statyczna bazę danych można w jakiś łatwy sposób przerobić na dynamiczną?

Zapewne tak.

0

Jakby ktoś mógł dać jakąś mała podpowiedź byłbym wdzięczny :D

0

Poczytaj o tablicach dynamicznych w C; przy zapisie na początku pliku zapisuj ilość elementów, a przy odczycie wczytuj te dane i zainicjuj odpowiednio dużą tablicę.

0

Ja raczej zaproponowałbym listę
W tym przypadku tablice dynamiczne, nie będą zbyt wielkim usprawnieniem..

1 użytkowników online, w tym zalogowanych: 0, gości: 1