Może na coś komu się przydadzą jeszcze funkcje wczytujące z pliku i doń zapisujące:
void read(struct plyta *in,int *i){ FILE *plik; char temp[30]; int k=1; if((plik=fopen("dane.txt","r"))==NULL) printf("\nNie mozna otworzyc pliku\n\nKontynuuj:\n"); else { (*i)++; while(fgets(temp,sizeof(temp),plik)!=NULL) { in[*i].numer = *i; if(temp[strlen(temp)-1]=='\n') temp[strlen(temp)-1]='\0'; if (k>4) { k=1; (*i)++; } switch(k++) { case 1: strcpy(in[*i].autor,temp); case 2: strcpy(in[*i].tytul,temp); case 3: strcpy(in[*i].typ,temp); case 4: strcpy(in[*i].uw,temp); } } printf("\nDane zostaly wczytane pomyslnie.\n\nKontynuuj:\n"); } fclose(plik); } void save(struct plyta *in,int i){ int k=1; FILE *plik; plik=fopen("dane.txt","w"); while (k<=i) { fprintf (plik,"%s\n", in[k].autor); fprintf (plik,"%s\n", in[k].tytul); fprintf (plik,"%s\n", in[k].typ); fprintf (plik,"%s\n", in[k].uw); k++; } printf("\nDane zostaly zapisane.\n\n"); fclose(plik); }
Offline
******* **** **** * ** * *** ** OTATNIK * *** * ** * ** * * * ** * ** ********* * *** * ** * ** * *** * * ** * ** *** * ******* **** ** * ELEFONICZNY *** =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= WYSWIETLANIE INFORMACJI: [a] Wyswietl wpisy [b] Szukaj DODAJ/USUN WPISY: [c] Dodaj wpis [d] Usun wpis [e] Usun wszystko BAZA DANYCH: [f] Zapisz zmiany w bazie danych [g] Zaladuj ponownie baze danych SORTOWANIE: [h] Sortowanie wg personalii [i] Sortowanie wg miejscowosci [j] Sortowanie wg nr. telefonu [k] Sortowanie wg adresu email INNE: [l] Informacje o programie [m] Wyjscie Twoj wybor:
Moj programik hehe tzn jego efekt na ekranie dziala bez zarzutow:D
Kod źródłowy :
/* * * * * * * * * * * * * Pliki naglowkowe * * * * * * * * * * * * */ #include <stdio.h> /* Standardowe funkcje wejscia/wyjscia */ #include <string.h> /* Funkcje przetwarzania tekstu */ #include <stdlib.h> /* Makrodefinicje EXIT_SUCCESS i EXIT_FAILURE, funkcja system */ #include <ctype.h> /* toupper */ /* * * * * * * * * Makrodefinicje i definicje struktur * * * * * * * */ #define MAX 30 /* Maksymalna liczba wpisow w bazie danych */ #define INPUT 4 /* Maksymalna dlugosc wprowadzanego indeksu */ #define FALSE 0 #define TRUE 1 typedef short int BOOL; /* Definicja relacji */ typedef struct /* Definicja typu strukturalnego telefony */ { char personalia[50]; /* Nazwisko i imie, firma lub pseudonim */ char adres[50]; /* Miejscowosc */ char telefon[20]; /* Numer telefonu */ char email[30]; /* Email */ } telefony; /* * * * * * * * * * * * * Prototypy funkcji * * * * * * * * * * * * */ void /*inline*/ wyczysc_ekran(void); /* Czysci ekran monitora */ void /*inline*/ potwierdzenie(void); /* Wyswietla komunikat koncowy */ int wszystkie_wpisy(void); /* Listuje wszystkie wpisy w bazie */ int dane_osoby(void); /* Prezentuje dany wpis */ int szukaj_wpisu(void); /* Przeszukuje baze */ int dodaj_wpis(void); /* Dodaje nowy wpis */ int usun_wpis(void); /* Usuwa wpis */ int usun_wszystko(void); /* Usuwa wszystkie wpisy */ int zachowaj_baze(void); /* Zapisuje baze danych do pliku */ int wczytaj_baze(void); /* Laduje baze z pliku do pamieci */ void sortuj_imie(void); /* Sortuje baze wg pola personalia */ void sortuj_miasto(void); /* Sortuje baze wg pola adres */ void sortuj_telefon(void); /* Sortowanie wg pola telefon */ void sortuj_email(void); /* Sortowanie wg pola email */ void info(void); /* Informacje o programie*/ /* * * * * * * * * * * * * Zmienne globalne * * * * * * * * * * * * */ telefony baza[MAX]; /* Zmienna strukturalna baza */ int numer = 0; /* Licznik wszystkich wpisow */ /* * * * * * * * * * * * * F u n k c j e * * * * * * * * * * * * * * */ void /*inline*/ wyczysc_ekran(void) { system("clear"); printf( " ******* **** ****\n" " * ** * *** ** OTATNIK \n" " * *** * ** * ** \n" " * * * ** * ** ********* \n" " * *** * ** * ** * *** *\n" " * ** * ** *** * \n" " ******* **** ** * ELEFONICZNY\n" " ***\n" " =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n "); } void /*inline*/ potwierdzenie(void) { getchar(); printf("\n Nacisnij dowolny klawisz aby kontynuowac...\n"); getchar(); } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Glowna funkcja int main(void) * * * * zadania: wyswietlanie glownego menu programu; * * wywolywanie odpowiednich funkcji - * * modulow programu. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ int main(void) { char wybor; wyczysc_ekran(); wczytaj_baze(); do /* Petla do-while musi wykonac sie przynajmniej raz */ { /* Menu glowne programu */ wyczysc_ekran(); printf( "WYSWIETLANIE INFORMACJI: \n" " [a] Wyswietl wpisy \n" " [b] Szukaj \n" " DODAJ/USUN WPISY:\n" " [c] Dodaj wpis \n" " [d] Usun wpis\n" " [e] Usun wszystko \n" " BAZA DANYCH:\n" " [f] Zapisz zmiany w bazie danych \n" " [g] Zaladuj ponownie baze danych \n" " SORTOWANIE:\n" " [h] Sortowanie wg personalii \n" " [i] Sortowanie wg miejscowosci\n" " [j] Sortowanie wg nr. telefonu\n" " [k] Sortowanie wg adresu email\n" " INNE:\n" " [l] Informacje o programie\n" " [m] Wyjscie \n"); /* Pobierz dane od uzytkownika */ printf(" Twoj wybor: "); wybor = getchar(); wyczysc_ekran(); /* Wywolanie funkcji w zaleznosci od wyboru uzytkownika */ switch (wybor) { case 'a' : wszystkie_wpisy(); break; case 'b' : szukaj_wpisu(); break; case 'c' : dodaj_wpis(); break; case 'd' : usun_wpis(); break; case 'e' : usun_wszystko(); break; case 'f' : zachowaj_baze(); break; case 'g' : wczytaj_baze(); break; case 'h' : sortuj_imie(); break; case 'i' : sortuj_miasto(); break; case 'j' : sortuj_telefon(); break; case 'k' : sortuj_email(); break; case 'l' : info(); break; case 'm' : break; default : { printf("\n Nie ma takiej opcji! \n"); potwierdzenie(); } break; } } while (wybor != 'm'); printf("\n ZAMYKANIE PROGRAMU \n"); potwierdzenie(); system("clear"); } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Funkcja int wszystkie_wpisy(void) * * * * zadania: wyswietlanie wszystkich wpisow w bazie * * * * argumenty przekazywane: brak * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ int wszystkie_wpisy(void) { int i; /* Zmienna pomocnicza - indeks petli */ printf("\n WYKAZ WSZYSTKICH WPISOW \n"); if (numer == 0) /* Nie ma zadnego wpisu! */ { printf("\n Baza danych jest pusta" " lub nie zostala zaladowana z pliku! \n"); } /* Wyswietl wszystkie osoby wraz z numerami ich indeksow */ else { for (i = 0; i < numer; i++) { printf("%d Nazwisko i imie: %s",i+1, baza[i].personalia); printf(" Miejscowosc: %s", baza[i].adres); printf(" Telefon: %s", baza[i].telefon); printf(" e-mail: %s\n", baza[i].email); /* Zatrzymaj program po zapelnieniu ekranu */ if ((i + 1)%10 == 0) { potwierdzenie(); wyczysc_ekran(); } } printf("\n Koniec danych \n"); } potwierdzenie(); } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Funkcja int szukaj_wpisu(void) * * * * zadania: wyszukanie informacje w bazie - * * podanego nazwiska lub miejscowosci * * * * argumenty przekazywane: brak * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ int szukaj_wpisu(void) { char szukana[30]; /* Szukane nazwisko lub miejscowosc */ int index, k = 0; /* Zmienne pomocnicze */ printf("\n WYSZUKIWANIE INFORMACJI W BAZIE \n"); getchar(); printf("\n Wprowadz nazwisko lub miejscowosc do wyszukania: "); gets(szukana); wyczysc_ekran(); for (index = 0; index < numer; index++) { /* Wyswietlanie informacji o wyszukanych wpisach */ if (strstr(baza[index].personalia, szukana) || strstr(baza[index].adres, szukana)) { printf("\n Nazwisko i imie: %s", baza[index].personalia); printf("\n Miejscowosc: %s", baza[index].adres); printf("\n Telefon: %s", baza[index].telefon); printf("\n Email: %s\n", baza[index].email); printf("\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); k++; /* Zatrzymaj program po zapelnieniu ekranu */ if (k%3 == 0) { potwierdzenie(); wyczysc_ekran(); } } } if (k == 0) /* Brak rezultatow! */ { printf("\n Nie znaleziono zadnego wpisu! \n"); potwierdzenie(); } printf("\n To wszystkie wpisy jakie znaleziono! \n"); potwierdzenie(); } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Funkcja int dodaj_wpis(void) * * * * zadania: dodawanie nowego wpisu do bazy danych * * * * argumenty przekazywane: brak * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ int dodaj_wpis(void) { printf("\n DODAWANIE WPISU DO BAZY DANYCH \n"); getchar(); if (numer >= MAX) /* Baza danych jest pelna! */ { printf("\n Baza danych jest pelna! \n"); potwierdzenie(); } /* Pobierz od uzytkownika wszystkie informacje o osobie */ /* Sprawdz czy wpisy nie sa za dlugie */ do { printf("\n Nazwisko i imie: "); gets(baza[numer].personalia); if (strlen(baza[numer].personalia) > 48) printf("\n Mozna wpisac maksymalnie 48 znakow! \n"); } while (strlen(baza[numer].personalia) > 48); do { printf("\n Miejscowosc: "); gets(baza[numer].adres); if (strlen(baza[numer].adres) > 48) printf("\n Mozna wpisac maksymalnie 48 znakow! \n"); } while (strlen(baza[numer].adres) > 48); do { printf("\n Telefon: "); gets(baza[numer].telefon); if (strlen(baza[numer].telefon) > 18) printf("\n Mozna wpisac maksymalnie 18 znakow! \n"); } while (strlen(baza[numer].telefon) > 18); do { printf("\n Email: "); gets(baza[numer].email); if (strlen(baza[numer].email) > 35) printf("\n Mozna wpisac maksymalnie 35 znakow! \n"); } while (strlen(baza[numer].email) > 35); /* Nic nie wpisano w polu Nazwisko i imie lub Telefon */ if ((strlen(baza[numer].telefon) == 0) || (strlen(baza[numer].personalia) == 0)) { printf("\n Wpis nie zostal dodany do bazy danych!" "\n Musi zostac podane nazwisko i numer telefonu! \n"); potwierdzenie(); } /* Do kazdego pola dodaj znacznik konca lini */ else { strcat(baza[numer].personalia, "\n"); strcat(baza[numer].adres, "\n"); strcat(baza[numer].telefon, "\n"); strcat(baza[numer].email, "\n"); numer++; /* Zwieksz liczbe wpisow o jeden */ printf("\n Wpis zostal dodany do bazy danych! \n"); } potwierdzenie(); } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Funkcja int usun_wpis(void) * * * * zadania: usuwanie wpisu z bazy danych * * * * argumenty przekazywane: brak * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ int usun_wpis(void) { char wpis[INPUT]; /* Tekst wpisany przez uzytkownika */ int kasuj_nr; /* Wpis do usuniecia */ printf("\n USUWANIE WPISU Z BAZY \n"); getchar(); printf("\n Podaj indeks wpisu do usuniecia: "); kasuj_nr = atoi(gets(wpis)); /* Konwersja typu danych */ /* Nie ma takiego wpisu! */ if ((kasuj_nr < 1) || (kasuj_nr > numer)) { printf("\n Nie ma w bazie wpisu o takim indeksie! \n"); potwierdzenie(); } else { /* Usuwanie - przeindeksowanie bazy */ while ((kasuj_nr - 1) < numer) { baza[kasuj_nr - 1] = baza[kasuj_nr]; kasuj_nr++; } numer--; printf("\n Wpis zostal usuniety \n"); } potwierdzenie(); } int usun_wszystko(void) { int wpis; /* Tekst wpisany przez uzytkownika */ int kasuj_nr; /* Wpis do usuniecia */ printf("\n USUWANIE WSZYSTKICH WPISOW Z BAZY \n"); getchar(); wpis = numer; kasuj_nr = wpis; while (numer>0) { while ((kasuj_nr - 1) < numer) { baza[kasuj_nr - 1] = baza[kasuj_nr]; kasuj_nr++; } numer--; printf("\n Wpis zostal usuniety \n"); } potwierdzenie(); } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Funkcja int zachowaj_baze(void) * * * * zadania: zapisywanie bazy danych do pliku telefony.dbs * * * * argumenty przekazywane: brak * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ int zachowaj_baze(void) { FILE *PlikBazy; /* Wskaznik do pliku bazy */ int i; /* Zmienna pomocnicza */ char znak; printf("\n ZAPISYWANIE DANYCH DO PLIKU telefony.txt \n"); getchar(); printf("\n Jestes pewien? [T]ak/[N]ie "); znak = getchar(); if (toupper(znak) != 'T') { printf("\n Baza danych nie zostala zapisana \n"); potwierdzenie(); } else { PlikBazy = fopen("telefony.txt", "w" ); /* Otworz do pisania */ /* Nie mozna otworzyc pliku telefony.dbs! */ if (PlikBazy == NULL) { printf("\n Nie mozna otworzyc pliku bazy danych! \n"); potwierdzenie(); } /* Zapisz aktualna liczbe osob w bazie */ fprintf(PlikBazy, "%d\n", numer); /* Zachowaj reszte danych */ for (i = 0; i < numer; i++) { fputs(baza[i].personalia, PlikBazy); fputs(baza[i].adres, PlikBazy); fputs(baza[i].telefon, PlikBazy); fputs(baza[i].email, PlikBazy); } printf("\n Baza danych zostala zachowana! \n"); } potwierdzenie(); } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Funkcja int wczytaj_baze(void) * * * * zadania: wczytywanie bazy danych z pliku telefony.dbs * * * * argumenty przekazywane: brak * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ int wczytaj_baze(void) { FILE *PlikBazy; /* Wskaznik do pliku bazy */ int i; /* Zmienna pomocnicza */ printf("\n WCZYTYWANIE DANYCH Z PLIKU telefony.txt \n"); /* Otworz plik tylko do odczytu */ PlikBazy = fopen("telefony.txt", "r"); /* Nie mozna otworzyc pliku telefony.dbs!*/ if (PlikBazy == NULL) { printf("\n Nie mozna otworzy pliku bazy danych! \n"); potwierdzenie(); } /* Czytaj z pliku aktualna liczbe wpisow w bazie */ fscanf(PlikBazy, "%d\n", &numer); if (numer > MAX) { printf("\n W bazie danych jest za duzo wpisow! \n"); potwierdzenie(); } /* Czytaj reszte danych z pliku */ for (i = 0; i < numer; i++) { fgets(baza[i].personalia, 50, PlikBazy); fgets(baza[i].adres, 50, PlikBazy); fgets(baza[i].telefon, 20, PlikBazy); fgets(baza[i].email, 35, PlikBazy); } printf("\n Baza danych zostala zaladowana! \n"); potwierdzenie(); } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Funkcje void sortuj_xxxxx(void) * * * * zadania: Sortowanie babelkowe pol * * personalia z tablicy baza * * * * argumenty przekazywane: brak * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void sortuj_imie(void) { char temp[50]; BOOL chaos = TRUE; int i; printf("\n SORTOWANIE BAZY DANYCH \n"); while (chaos != FALSE) { chaos = FALSE; for (i = 0; i < (numer - 1); i++) { if (strcmp(baza[i].personalia, baza[i+1].personalia) == TRUE) { /* Personalia */ strcpy(temp, baza[i].personalia); strcpy(baza[i].personalia, baza[i+1].personalia); strcpy(baza[i+1].personalia, temp); /* Adres */ strcpy(temp, baza[i].adres); strcpy(baza[i].adres, baza[i+1].adres); strcpy(baza[i+1].adres, temp); /* Telefon */ strcpy(temp, baza[i].telefon); strcpy(baza[i].telefon, baza[i+1].telefon); strcpy(baza[i+1].telefon, temp); /* Email */ strcpy(temp, baza[i].email); strcpy(baza[i].email, baza[i+1].email); strcpy(baza[i+1].email, temp); chaos = TRUE; } } } printf("\n Baza danych zostala posortowana! \n"); potwierdzenie(); } void sortuj_miasto(void) { char temp[50]; BOOL chaos = TRUE; int i; printf("\n SORTOWANIE BAZY DANYCH \n"); while (chaos != FALSE) { chaos = FALSE; for (i = 0; i < (numer - 1); i++) { if (strcmp(baza[i].adres, baza[i+1].adres) == TRUE) { /* Personalia */ strcpy(temp, baza[i].personalia); strcpy(baza[i].personalia, baza[i+1].personalia); strcpy(baza[i+1].personalia, temp); /* Adres */ strcpy(temp, baza[i].adres); strcpy(baza[i].adres, baza[i+1].adres); strcpy(baza[i+1].adres, temp); /* Telefon */ strcpy(temp, baza[i].telefon); strcpy(baza[i].telefon, baza[i+1].telefon); strcpy(baza[i+1].telefon, temp); /* Email */ strcpy(temp, baza[i].email); strcpy(baza[i].email, baza[i+1].email); strcpy(baza[i+1].email, temp); chaos = TRUE; } } } printf("\n Baza danych zostala posortowana! \n"); potwierdzenie(); } void sortuj_telefon(void) { char temp[50]; BOOL chaos = TRUE; int i; printf("\n SORTOWANIE BAZY DANYCH \n"); while (chaos != FALSE) { chaos = FALSE; for (i = 0; i < (numer - 1); i++) { if (strcmp(baza[i].telefon, baza[i+1].telefon) == TRUE) { /* Personalia */ strcpy(temp, baza[i].personalia); strcpy(baza[i].personalia, baza[i+1].personalia); strcpy(baza[i+1].personalia, temp); /* Adres */ strcpy(temp, baza[i].adres); strcpy(baza[i].adres, baza[i+1].adres); strcpy(baza[i+1].adres, temp); /* Telefon */ strcpy(temp, baza[i].telefon); strcpy(baza[i].telefon, baza[i+1].telefon); strcpy(baza[i+1].telefon, temp); /* Email */ strcpy(temp, baza[i].email); strcpy(baza[i].email, baza[i+1].email); strcpy(baza[i+1].email, temp); chaos = TRUE; } } } printf("\n Baza danych zostala posortowana! \n"); potwierdzenie(); } void sortuj_email(void) { char temp[50]; BOOL chaos = TRUE; int i; printf("\n SORTOWANIE BAZY DANYCH \n"); while (chaos != FALSE) { chaos = FALSE; for (i = 0; i < (numer - 1); i++) { if (strcmp(baza[i].email, baza[i+1].email) == TRUE) { /* Personalia */ strcpy(temp, baza[i].personalia); strcpy(baza[i].personalia, baza[i+1].personalia); strcpy(baza[i+1].personalia, temp); /* Adres */ strcpy(temp, baza[i].adres); strcpy(baza[i].adres, baza[i+1].adres); strcpy(baza[i+1].adres, temp); /* Telefon */ strcpy(temp, baza[i].telefon); strcpy(baza[i].telefon, baza[i+1].telefon); strcpy(baza[i+1].telefon, temp); /* Email */ strcpy(temp, baza[i].email); strcpy(baza[i].email, baza[i+1].email); strcpy(baza[i+1].email, temp); chaos = TRUE; } } } printf("\n Baza danych zostala posortowana! \n"); potwierdzenie(); } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Funkcja void info(void) * * * * zadania: prezentowanie informacji o programie * * * * argumenty przekazywane: brak * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void info(void) { printf("\n INFORMACJE O PROGRAMIE \n"); printf("\nNotatnik Telefoniczy:" "\n Podstawy Programowania (PRM) - projekt 2" "\n Program umozliwia wprowadzanie, usuwanie," "\n wyszukiwanie, sortowanie oraz przechowywanie" "\n w pliku danych o numerach telefonicznych\n\n"); potwierdzenie(); }
NALEZY JESZCZE DODAĆ PLIK telefony.txt (pusty) ))
Offline