trophy250 utworzono 22 stycznia 2013 utworzono 22 stycznia 2013 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 22 stycznia 2013 komentarz 22 stycznia 2013 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 23 stycznia 2013 Autor komentarz 23 stycznia 2013 a nie działą jeszcze wyszukiwanie i kasowanie :/ a jak zrobić dopisanie do pliku ? ;)
leggo komentarz 23 stycznia 2013 komentarz 23 stycznia 2013 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 23 stycznia 2013 Autor komentarz 23 stycznia 2013 (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 23 stycznia 2013 komentarz 23 stycznia 2013 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 23 stycznia 2013 Autor komentarz 23 stycznia 2013 #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 24 stycznia 2013 komentarz 24 stycznia 2013 (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 24 stycznia 2013 Autor komentarz 24 stycznia 2013 Robiłem typ bool ale wyskakiwał błąd nie weim dlaczego, więc zdecydowałem się na Integer
leggo komentarz 24 stycznia 2013 komentarz 24 stycznia 2013 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.