x-kom hosting

problem ze stworzeniem bazy danych w C

trophy250
utworzono
utworzono

Witam ;) na jutro muszę zrobić prostą bazę danych w języku C ;) napisałem ale coś mi nie wychodzi:/ niżej daje kod ;) chciałbym aby ktoś może jak ma taki projekt niech z dobrego serca mi udosępni albo na pw albo tutaj w temacie ;) nie wychodzi mi to ;/ a musze jutro oddać :/ Jak ktoś może niech pomoże  ;)

 


 

 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define max 5
 
struct pracownik 
{
       
       char imie[200];
       int wiek;
            
};
FILE *plik;
pracownik *tab;
int a=0,spr;
int info;
void zapisz(int n);
int dodaj(int na);
void wyswietl(int n);
void wyszukaj(int n);
int main()
{int wybor;
 int koniec=1;
 
 int usun(int n);
 int ilosc=0;
while(koniec)
{
    system("cls");
             
   printf("1-dodaj\n");
   printf("2-zapisz\n");
   printf("3-usun\n");
   printf("4-wswietl z pliku\n");
   printf("5-wyswietl z pamieci\n");
   printf("7-wyszukaj");
   printf("6-koniec\n");
   scanf("%d",&wybor);
   switch(wybor)
   {
           case 1:
              ilosc=dodaj(ilosc);
              
                break;
           case 2:
                zapisz(ilosc);
                break;
           case 3:
              ilosc=usun(ilosc);  
               break;             
                break;     
            case 4:
                break;
           case 5:
               wyswietl(ilosc);
                break;
           case 6:
                koniec=0;
                
                break;
           case 7:
                wyszukaj(ilosc);
                break;
           default: 
                    
                    printf("zly wybor\n");
                    
                    break;
           
           }
           
       getchar();    
           
   }
    
    
    return 0;
}
 
int dodaj(int na)
{system("cls");
     int i=0,l;
     char ccc[15];
     if(a==1)
     {
      printf("\nMusisz najpierw zapisac ostatnio wpisane osoby do pliku\n");
      getchar();
          return na;   
     }
     else
     {int n=0;
          printf("podaj ile ludzi chcesz wprowadzic: ");
          scanf("%d",&n);
          tab =(pracownik*) malloc(n*sizeof(pracownik));
     for(i=0;i<n;i++)
    {
    system("cls");
    printf("pozostalo ci jeszcze %d wpisow\n",n-i);
   printf("Podaj imie:   ");
   scanf("%s",&ccc);
  strcpy(tab[i].imie,ccc);
  
 
  printf("\npodaj wiek:   ");
  scanf("%d",&l);
  tab[i].wiek=l;
     
     
     
     
    }  
    a=1;
     return n;
}
    getchar();
   
}
 
void wyswietl(int n)
{
     int i;
     system("cls");
     printf("WYSIETLENIE BAZY OSTATNIO WPISANYCH DANYCH\n");
       printf("+++++++++++++++++++++++++++\n");
     for(i=0;i<n;i++)
     { 
                if((tab[i].imie!="nic"))
                {
       printf("imie: %s",tab[i].imie);
       printf("\nwiek: %d",tab[i].wiek); 
            printf("\n");    
                        printf("+++++++++++++++++++++++++++\n");
                        }
     }
     
getchar();
}
//==================
void zapisz(int n)
{
    
     plik=fopen("baza.txt","w");
     int i;
     for(i=0; i<n; i++)
              {
       
              fprintf(plik,"%s;%d\n",tab[i].imie,tab[i].wiek);         
              }
     fclose(plik);
}
     
     int usun(int n)
     {   int i;
     char a[200]="nic";
          char buf[200];
          system("cls");
       
          printf("podaj kogo hcesz usunac?\n");
          scanf("%s",&buf);
          for(i=0;i<n;i++)
          {
               if(buf==tab[i].imie)
               {
                             strcpy(tab[i].imie,a);      
                                   
                                   
               }
               
               
               
               
          }
        
          return n;
          
     }
          
          
          
          void wyszukaj(int n)
          {int i;
          int ii;
          system("cls");
            char pom[200];
               printf("podaj imie aby wyszukac\n");
               scanf("%s",&pom);
 
         for(i=0;i<n;i++)
               {
               
        if(tab[i].imie==pom)
      info=i;
 
                  }      
                              
               printf("\nindex to   %d",info);           
                          getchar();     
          }
          
          
          

 

 

 

 

 

leggo
komentarz
komentarz

Nie napisałeś co chcesz jeszcze do tego dopisać.

 

Z tego co widzę program działa w miarę poprawnie.

Brakuje Ci chyba tylko odczytu zawartości pliku. Robi się to prawie identycznie jak zapis, z tą różnicą, że otwierasz plik w trybie "r" zamiast "w". \

Skoro zapisujesz za pomocą fprintf, czytać możesz używając fscanf.

 

Kolejnym problemem jest to, że zapisując dane do pliku zawsze usuwasz jego dotychczasową zawartość (tak działa tryb "w"). Przed zapisem powinieneś sprawdzić czy plik już istnieje i tylko dodać nowe dane na jego koniec.

 

Na przyszłość fajnie by było gdybyś formatował kod przed wstawieniem.

trophy250
komentarz
komentarz

a nie działą jeszcze wyszukiwanie i kasowanie :/ a jak zrobić dopisanie do pliku ? ;)

leggo
komentarz
komentarz

Na temat otwierania plików masz tutaj.

Zgaduję, że funkcje wyszukaj i usun nie działają ze względu na to, że używasz tam porównania stringów, a dołączyłeś bibliotekę [b]string.h[/b], zamiast [b]string[/b].

Stringi porównywać możesz też specjalnie przygotowanymi do tego celu funkcjami, np. [b]compare[/b].

 

Jeśli chcesz więcej konkretów sformatuj kod, tak żeby dało się go czytać.

trophy250
komentarz
komentarz (edytowane)

Już kasowanie zrobiłem i zostało mi tylko odczyt ;) ale jakoś nei wiem jak to odczytać :/ zapisane mam w takim formacie w pliku.txt

 

marek;kowalski;21;sprzataczka

adam;xyz;11;kasjer

marek;szczepan;19;sekretarkay

 

i chciałbym aby te dane zapisywane były do tablicy struktury;) a po skasowaniu osoby mam takie coś

 

znak_pust;znak_pusty;0;znak_pusty

adam;xyz;11;kasjer

marek;szczepan;19;sekretarka

Dało by się jakoś to zrobić? ;P pozdrawiam ;)

leggo
komentarz
komentarz

Przeceniasz moje możliwości, jeżeli liczysz, że w ciemno zgadnę jaki jest powód takiego działania.

Wstaw nowy kod, a spróbuję pomóc.

trophy250
komentarz
komentarz

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define max 5

struct pracownik    ///struktura 
{
       
       char imie[10];
       char nazwisko[15];
       int pensja;
       char dzial[20];
            
};
   FILE *plik,*pFile;// zmiene potrzebne do obsługi pliku.txt (zapisz/odczyt danych)
  pracownik *tab;  //twoeze wskaznik na tablice struktur
    int a=0,spr; //zmienne beda potem potrzebmne
   int info;//..
void zapisz(int n);// funkcja do zapisu do pliku tablicy wypelnionej danymi. Nizej masz    definicje funkcji
int dodaj(int na);// dodaje osobe 

void wyswietl(int n);//wyswietla aktualne wpisywane osoby 
void wczytaj(); //wczytuje z pliku
void wyszukaj(int n); //wyszukuje osobę
int main()// funkcja glowna
{int wybor; // twoj wybor -ktora opcje wybierzesz w tej zmiennej bedzie zapisany twoj wybor
 int koniec=1;// zabespieczenie aby skonczyc petle koniec będzie miało wartosc 0 jeśli będziesz chcail wyjsc z programu

 int usun(int n);// funkcja do usuwania pracownika
 int ilosc=0;// zlicza ilosc osob 
while(koniec)//betla kręci się do puki zmienna koniec=1
{
    system("cls"); //czysci ekran
             
   printf("1-dodaj\n");
   printf("2-zapisz\n");
   printf("3-usun\n");
   printf("4-wswietl z pliku\n");
   printf("5-wyswietl z pamieci\n");
   printf("7-wyszukaj\n");
   printf("6-koniec\n");
   scanf("%d",&wybor); //podajesz jaka chcesz opcje
   switch(wybor)
   {
           case 1:  //jesli wybrales "1" to wykonuje się funkcja ta co niżęj czyli dodaj()
              ilosc=dodaj(ilosc);// zwraca do zmiennej ilossc ilosc osob w tablicy czyli ogolnie rozmiar calej tablicy
              
                break;
           case 2:
                zapisz(ilosc); //zapisuje do pliku a w nawiasie masz rozmiar tablicy
                break;
           case 3:
              ilosc=usun(ilosc);  // usuwa osobe a w zwraca i w nawiasie jest zmienna ktora ma wartosc wielkosci tablicy
               break;             
                   
            case 4:
                 wczytaj(); //wykonuje się wczytywanie danych z pliku.txt
                break;
           case 5:
               wyswietl(ilosc); //wyswietla na ekranie wszystkie ostatnie wpisane osoby w nawiasie wielkosc tablicy
                break;
           case 6:
                koniec=0; //jesli chcesz zakonczyć to zmienna koniec przyjmuje wartosc 0 i kończy się petla while
                
                break;
           case 7:
                wyszukaj(ilosc); //wyszukiwanie osoby w nawiasie wielkosc tablicy
                break;
           default:  //jestli wybierzesz coś innego to sie wyswietla to co niżej
                    
                    printf("zly wybor\n");
                    
                    break;
           
           }
           
       getchar();    //czeka na nacisniecie klawisza
           
   }
    
    
    return 0;
}

int dodaj(int na) //definicja funkcji
{system("cls"); //czysci ekran
     int i=0,l;//zmienne beda potrzebne 
     char ccc[15]; //twoeZwbuie  zmiennej w ktiorej bedziesz podawal dane 
     if(a==1) //jesli a ==0 to znaczy żę się wykona else. a jesli a==1 to znaczy żę trzeba najpierw zapisać do pliku tam a zmieni się na 0
     {
      printf("\nMusisz najpierw zapisac ostatnio wpisane osoby do pliku\n");
      getchar();
          return na;   //zwraca rozmiar tablicy 
     }
     else// jesli a==0
     {int n=0;
          printf("podaj ile ludzi chcesz wprowadzic: ");
          scanf("%d",&n);//podajesz ile osob chcesz wpisac
          tab =(pracownik*) malloc(n*sizeof(pracownik)); //alokacja pamieci o rozmiarze wyzej podanym
     for(i=0;i<n;i++)//petla od 0 do n 
    {
    system("cls");//czysci
    printf("pozostalo ci jeszcze %d wpisow\n",n-i);// pokazuje ci na ekranie ilejeszcze wpisow ci zostało 
   printf("Podaj imie:   ");
   scanf("%s",&ccc);//podajesz 
  strcpy(tab[i].imie,ccc);//kopiujesz do tab[i] to co wpisales w ccc
   printf("Podaj nazwisko:   ");// podajesz nazwisko
   scanf("%s",&ccc);//podajesz 
  strcpy(tab[i].nazwisko,ccc);//kopiujesz do tab[i] to co wpisales w ccc
  printf("Podaj dzial:   ");// podajesz nazwisko
   scanf("%s",&ccc);//podajesz 
  strcpy(tab[i].dzial,ccc);//kopiujesz do tab[i] to co wpisales w ccc
 
  printf("\npodaj pensje  ");
  scanf("%d",&l);
  tab[i].pensja=l;// do tab[i] przypisujesz pensje
     
     
     
     
    }  
    a=1; //zabezpieczenie aby najpierw przy nastempnym dodawaniu osoby trzeba zapisac do pliku
     return n;//zwraca wielskosc tablicy
}
    getchar(); //czeka na nacisniecie klawiasza
   
}

void wyswietl(int n) //wyswietlenie danych
{
     int i;//zmienna się przyda ;)
     system("cls");//czysci
     printf("WYSIETLENIE BAZY OSTATNIO WPISANYCH DANYCH\n");
       printf("+++++++++++++++++++++++++++\n");
     for(i=0;i<n;i++)//od 0 do n- osob
     { 
                if((tab[i].pensja!=0)&&(tab[i].imie!=" "))// jesli pensja ==0 i imie==" " to się nic nie wykona i nie wyswietli osoby bo zostala usunięta
                {
       printf("imie: %s",tab[i].imie);// wyswietla 
       printf("\nnazwisko: %s",tab[i].nazwisko); //..
       printf("\npensja: %d",tab[i].pensja);
       printf("\ndzial: %s",tab[i].dzial);
            printf("\n");    //linijka nizej kursor schodzi
                        printf("+++++++++++++++++++++++++++\n");
                        }
     }
     
getchar();//czeka na nacisniecie klawisza
}
//==================
void zapisz(int n)//zapis do pliku
{
    a=0;//przyda się  ;)
     plik=fopen("baza.txt","a+");// tworzenie pliku a jak istnieje to a+ mówi o tym że będzie dopisywać na koniec pliku dane osob 
     int i;// ;)
     for(i=0; i<n; i++)//od 0 do n-osob
              {
       
              fprintf(plik,"%s;%s;%s;%d\n",tab[i].imie,tab[i].nazwisko,tab[i].dzial,tab[i].pensja); //zapis do pliku a po zapisie jest skok no nastepnego wierza w pliku        
              }
     fclose(plik);//zamyka plik
}
     
     int usun(int n)//usuwanie
     {   int i=-1;// ;) -1 a dlatego żęby wiedziec czy bedzie taki uzytkownik jesli nie to zmienna i będzie mialo -1
     int ii;// ;p
     char a[20]=" ";//tablica ktura ma w sobie znak pusty
          char buf[200];//zmienna do wpisania szukanego imienia
          system("cls");//czysci
       
          printf("podaj kogo hcesz usunac?\n");
          scanf("%s",&buf);//wpisujesz osobe od usuniecia
          for(i=0;i<n;i++)//od 0 do n-osob
          {
                if( strcmp( tab[i].imie,buf ) == 0) //jesli to co wpisales jest rowne z tym co jest tablicy czyli taka osoba jest to
              ii=i;// ii przyjmuje wartosc indexu na kturym ta osoba siedzi w tablicy     
         }
          
          if(ii!=-1)//jesli ii nie  ma wartosci -1
          {
                    tab[ii].pensja=0; //do pensji wpisuje o
                    strcpy(tab[ii].imie,a);// a do imienia kopiuje znak pusty
                   
                    
          }else printf("\nbrak takiej osoby\n");// jesli wyzej się nie wykona to znaczy żę osoby nie ma 
        
          return n;//zwraca ilosc osob w tablicy
          
     }
          
          
          
          void wyszukaj(int n)//szuka osoby
          {int i;// ;)
          int ii=-1;//to samo co wyzej do tego samego
          system("cls");//czysci
            char pom[200];//do wpisania szukanej osoby
               printf("podaj imie aby wyszukac\n");
               scanf("%s",&pom);//podajesz

         for(i=0;i<n;i++)//od 0 do n-osob
               {
     if( strcmp( tab[i].imie,pom ) == 0) //jesli to co podales jest takie same jak w tablicy czyli jest osoba to wyswietla jego dane
         ii=i;// aby wiedziec w jakim indeksie jest ta osoba
        
     

                  }      
                  if(ii!=-1)// jesli ii nei jest -1 to wyswietls ;)
                  {
         printf("\nimie: %s",tab[ii].imie);
         printf("\nnazwisko %s",tab[ii].nazwisko);
         printf("\npensja %d",tab[ii].pensja);
         printf("\ndzial %s",tab[ii].dzial);
                         }
                         else printf("nie ma tej osoby w bazie danych\n");//jesli sie IF nie wykona bo ii ma-1 to znaczy ze osoby nie ma
                          getchar();     
          }
          
          
          
   void wczytaj()
        {
             char buf[300];
             
  pFile = fopen ( "baza.txt" , "w" );
   if (pFile!= NULL)
  {
    scanf( buf , pFile);
             
             
        }
        printf("\n%s",buf);
        fclose (pFile);
        }
      
leggo
komentarz
komentarz (edytowane)

Po pierwsze musisz otworzyć plik w trybie "r".

pFile=fopen("baza.txt","r");

Sprawdzasz czy został otwarty poprawnie (tak jak to już masz w kodzie).

Następnie czytasz jego zawartość w pętli, aż dotrzesz do końca pliku.

while(!feof(pFile)){ ... }

A samo czytanie możesz, tak jak próbowałeś, realizować funkcją scanf:

fscanf(pFile, "%s", buf);

Oczywiście po każdym pobraniu musisz jeszcze te dane pokazać użytkownikowi.

 

Jeszcze kilka uwag:

- Jeżeli tworzysz tablicę dynamicznie, podczas kasowania również powinieneś to wykorzystać i odpowiednio zmniejszać tą tablicę, a nie zapełniać puste miejsca spacją.

- Tworzysz tablicę char, która z założenia ma zawierać jeden znak (spację), a nadajesz jej rozmiar 20 znaków,

- Tworzysz zmienną a, która pamięta czy dokonano modyfikacji i nadajesz jej typ int. Jeżeli zmienna może przyjmować tylko dwie wartości powinna być typu bool - do tego ten typ służy. Zmienna całkowita marnuje tyko miejsce (jeśli się nie mylę jest u Ciebie więcej takich zmiennych, które powinny być typu bool, a nie są).

- Nie wywołuj kilka razy z rzędu funkcji printf, jeśli możesz cały tekst wsadzić do jednej (mam na myśli np. wypisywanie menu).

trophy250
komentarz
komentarz

Robiłem typ bool ale wyskakiwał błąd nie weim dlaczego, więc zdecydowałem się na Integer

leggo
komentarz
komentarz

Wszystko zależy od tego jaki to był błąd.

Wciąż szukasz rozwiązania problemu? Napisz teraz na forum!

Możesz zadać pytanie bez konieczności rejestracji - wystarczy, że wypełnisz formularz.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Strona wykorzystuje pliki cookies w celu prawidłowego świadczenia usług i wygody użytkowników. Warunki przechowywania i dostępu do plików cookies możesz zmienić w ustawieniach przeglądarki.