Skocz do zawartości

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Archan

Baza danych w c

Rekomendowane odpowiedzi

Witam, znalazłem tutaj kod na baze danych sprzed kilku lat i przerobiłem ja pod swoje potrzeby. Problem polega na tym ze program mimo poprawnego działania, zawsze wyswietla ostatnia pozycje z pliku podwójnie. Jak możnaby to zmienic? Dodam ze dopiero zaczynam a to poprostu jest na zadanie w szkole ;)

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// struktura glowna
struct wpis{
 char *nazwa;
 char *cena;
 char *ilosc;
 struct wpis *next;
}baza;

// wskaznik do struktury glownej
struct wpis *dodaj_wpis;
struct wpis *poczatek = NULL;
struct wpis *koniec = NULL;

// dodaje elementy struktury do pamieci
void nowy() {
 char t[20];
 char r[20];
char g[10];

 dodaj_wpis = malloc(sizeof (baza)+1);
 printf("Podaj nazwe: ");
 scanf("%s", t);

 dodaj_wpis->nazwa=malloc( sizeof(char) * strlen(t)+1);
 strcpy( dodaj_wpis->nazwa, t );

 printf("Podaj cene: ");
 scanf("%s", r);

 dodaj_wpis->cena=malloc( sizeof(char) * strlen(r)+1);
 strcpy( dodaj_wpis->cena, r );

 printf("Podaj ilosc: ");
 scanf("%s", g);

 dodaj_wpis->ilosc=malloc( sizeof(char) * strlen(g)+1);
 strcpy( dodaj_wpis->ilosc, g );




 dodaj_wpis -> next = NULL;

 if (koniec == NULL)
       poczatek = koniec = dodaj_wpis;
 else {
       koniec->next = dodaj_wpis;
       koniec = dodaj_wpis;
 }
}

// wyswietla elementy struktury
void screen() {
 int lp;
 struct wpis *tmp;
 lp = 1;
 tmp = poczatek;
 if(poczatek == NULL)
 {
        printf("Baza danych jest pusta. Wprowadz dane.\n\n");
        return;
  }
//jeśli kod wykonuje się dalej, to baza nie jest pusta
 while(tmp != NULL)
{
       printf("%d.\tNazwa: %s\tCena: %s zl\tIlosc: %s\n", lp, tmp->nazwa, tmp->cena, tmp->ilosc);
       tmp = tmp -> next;
       lp++ ;

 }
}

// zapisuje dane z pamieci do pliku txt
void write1() {
 FILE* wp;

 wp = fopen("log.txt", "w");
 dodaj_wpis = poczatek;
 while(dodaj_wpis != NULL) {
       fprintf(wp, "%s", dodaj_wpis->nazwa);
       fprintf(wp, " %s", dodaj_wpis->cena);
       fprintf(wp, " %s\n", dodaj_wpis->ilosc);


       dodaj_wpis = dodaj_wpis -> next;
 }
 fclose(wp);
}

// wczytywanie danych z pliku txt
void load() {
 FILE* wp;
 char t[20];
 char r[20];
 char g[10];

 wp = fopen("log.txt", "r");
 if(wp != NULL){

       while(feof(wp)==0)

       {
           dodaj_wpis = malloc(sizeof (baza)+1);


         fscanf(wp,"%s", t);

         dodaj_wpis->nazwa=malloc( sizeof(char) * strlen(t)+1);
         strcpy( dodaj_wpis->nazwa, t );

         fscanf(wp,"%s", r);

         dodaj_wpis->cena=malloc( sizeof(char) * strlen(r)+1);
         strcpy( dodaj_wpis->cena, r );

         fscanf(wp,"%s", g);

         dodaj_wpis->ilosc=malloc( sizeof(char) * strlen(g)+1);
         strcpy( dodaj_wpis->ilosc, g );


         dodaj_wpis -> next = NULL;

         if (koniec == NULL)
               poczatek = koniec = dodaj_wpis;
         else {
               koniec->next = dodaj_wpis;
               koniec = dodaj_wpis;
         }

       }
       fclose(wp);
 }
else;
}

int main()
{
 int x, y;
 printf("================================================================================\n");
 printf("\t\t\t\tBAZA DANYCH\n");
 printf("================================================================================\n\n");

 printf("Nacisnij [enter] aby rozpoczac lub [q] aby zakonczyc\n");
 x = getch();
 load();
 if(x == 'q')
       NULL;
 else {
       while(x != EOF) {
         printf("MENU\t\t:::[W]yswietl | [D]odaj | [Q]uit:::\n");
         y = getch();
         if(y=='w')
               screen();
         else if(y == 'd')
               nowy();
         else if(y == 'q') {
               write1();
               break;
         }
         else printf("Niepoprawna opcja\n");
       }
 }
 system("PAUSE");
 return 0;
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

a jak to wygląda w pliku?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ogolnie wyglada to tak:

Woda 3.22 23

Chleb 4.99 23

Maka 45.33 98

 

 

 

Dodam ze wpisywanie reczne do pliku dziala normalnie, dopiero gdy dodamy pozycje z konsoli to pozniej zaczyna sie powielac

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
else {
       koniec->next = dodaj_wpis;
       koniec = dodaj_wpis;
 }

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Udało sie rozwiazać moj problem zupełnie przypadkiem. Po 6 godzinach... Okazało sie ze przy fscanf ostatnim brakowało \n przy %s... to tworzylo blad i wczytywalo jednego entera za daleko..

 

Dla potomnych zostawie cały kod ;) Może jakiś kolejny studenciak bedzie robił cos podobnego

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// struktura glowna
struct wpis{
 char *nazwa;
 char *cena;
 char *ilosc;
 struct wpis *next;
}baza;

// wskaznik do struktury glownej
struct wpis *dodaj_wpis;
struct wpis *poczatek = NULL;
struct wpis *koniec = NULL;

// dodaje elementy struktury do pamieci
void nowy() {
 char t[20];
 char r[20];
char g[10];

 dodaj_wpis = malloc(sizeof (baza)+1);
 printf("Podaj nazwe: ");
 scanf("%s", t);

 dodaj_wpis->nazwa=malloc( sizeof(char) * strlen(t)+1);
 strcpy( dodaj_wpis->nazwa, t );

 printf("Podaj cene: ");
 scanf("%s", r);

 dodaj_wpis->cena=malloc( sizeof(char) * strlen(r)+1);
 strcpy( dodaj_wpis->cena, r );

 printf("Podaj ilosc: ");
 scanf("%s", g);

 dodaj_wpis->ilosc=malloc( sizeof(char) * strlen(g)+1);
 strcpy( dodaj_wpis->ilosc, g );




 dodaj_wpis -> next = NULL;

 if (koniec == NULL)
       poczatek = koniec = dodaj_wpis;
 else {
       koniec->next = dodaj_wpis;
       koniec = dodaj_wpis;
 }
}

// wyswietla elementy struktury
void screen() {
 int lp;
 struct wpis *tmp;
 lp = 1;
 tmp = poczatek;
 if(poczatek == NULL)
 {
        printf("Baza danych jest pusta. Wprowadz dane.\n\n");
        return;
  }
//jeœli kod wykonuje siê dalej, to baza nie jest pusta
 while(tmp != NULL)
{
       printf("%d.\tNazwa: %s\tCena: %s zl\tIlosc: %s\n", lp, tmp->nazwa, tmp->cena, tmp->ilosc);
       tmp = tmp -> next;
       lp++ ;

 }
}

// zapisuje dane z pamieci do pliku txt
void write1() {
 FILE* wp;

 wp = fopen("log.txt", "w");
 dodaj_wpis = poczatek;
 while(dodaj_wpis != NULL) {
       fprintf(wp, "%s", dodaj_wpis->nazwa);
       fprintf(wp, " %s", dodaj_wpis->cena);
       fprintf(wp, " %s\n", dodaj_wpis->ilosc);


       dodaj_wpis = dodaj_wpis -> next;
 }
 fclose(wp);
}

// wczytywanie danych z pliku txt
void load() {
 FILE* wp;
 char t[20];
 char r[20];
 char g[10];

 wp = fopen("log.txt", "r");
 if(wp != NULL){

       while(feof(wp)==0)

       {
           dodaj_wpis = malloc(sizeof (baza)+1);


         fscanf(wp,"%s", t);

         dodaj_wpis->nazwa=malloc( sizeof(char) * strlen(t)+1);
         strcpy( dodaj_wpis->nazwa, t );

         fscanf(wp,"%s", r);

         dodaj_wpis->cena=malloc( sizeof(char) * strlen(r)+1);
         strcpy( dodaj_wpis->cena, r );

         fscanf(wp,"%s\n", g);

         dodaj_wpis->ilosc=malloc( sizeof(char) * strlen(g)+1);
         strcpy( dodaj_wpis->ilosc, g );


         dodaj_wpis -> next = NULL;

         if (koniec == NULL)
               poczatek = koniec = dodaj_wpis;
         else {
               koniec->next = dodaj_wpis;
               koniec = dodaj_wpis;
         }

       }
       fclose(wp);
 }
else;
}

int main()
{
 int x, y;
 printf("================================================================================\n");
 printf("\t\t\t\tBAZA DANYCH\n");
 printf("================================================================================\n\n");

 printf("Nacisnij [enter] aby rozpoczac lub [q] aby zakonczyc\n");
 x = getch();
 load();
 if(x == 'q')
       NULL;
 else {
       while(x != EOF) {
         printf("MENU\t\t:::[W]yswietl | [D]odaj | [Q]uit:::\n");
         y = getch();
         if(y=='w')
               screen();
         else if(y == 'd')
               nowy();
         else if(y == 'q') {
               write1();
               break;
         }
         else printf("Niepoprawna opcja\n");
       }
 }
 system("PAUSE");
 return 0;
}

 

Można to zaadaptowac pod rozne zmienne jeśli sie ktoś rozczyta

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

  • Tematy

  • Odpowiedzi

    • Witam Może na wstępie podam specyfikacje kompa. Procesor: Intel Core i5-8400, 2.8 GHz RAM: GOODRAM 16GB (2x8GB) 3000MHz CL16 IRDM X Black Płyta główna: ASRock Z370 PRO4 (https://www.morele.net/plyta-glowna-asrock-z370-pro4-1533534/) Zasilacz: SilentiumPC Vero L2 500W Karta Graficzna: GeForce RTX 3060 Ti GAMING Z TRIO LHR 8GB GDDR6 Dysk SSD: SSD GOODRAM IRDM 240GB 2,5 SATA III   Dysk HDD: Toshiba P300 1TB 3.5" SATA III   Na dysku SSD zainstalowany jest system + utworzona druga partycja na gry. Z racji, że to mało miejsca, a dysk HDD już nie daje rady przy nowszych tytułach, chciałbym zastąpić go nowym SSD. W ciągu 1-2 lat planuję wymienić również procesor i w razie potrzeby płytę główną z zasilaczem. Na razie jednak jest kolej na nowy dysk i na nim teraz się skupiam. Nie jestem na czasie jeśli chodzi o obecny rynek dlatego potrzebuję pomocy. Czytałem trochę o dyska NVMe i przemawiają do mnie dużo bardziej. Myślę, że pojemność 2 TB będzie wystarczająca. Natrafiłem na model KC3000 firmy Kingston polecany przez wiele osób. Moje główne pytanie jest takie czy ten dysk pasowałby do mojego komputera? Wiem, że to PCIe 4.0, a w płycie głównej mam 3.0, ale podobno też pasuje, a skoro w przyszłości wymieniałbym płytę główną, to już z PCIe 4.0. Czy dokładając ten dysk nie obciąży mi się za bardzo zasilacz (o ile w ogóle będzie mieć na niego wpływ, bo znajduje informację, że pobór mocy to około 3W, ale nie wiem ile w tym prawdy)? Czy nie będzie żadnego problemu, żeby wszystkie dane ze starego HDD przenieść na nowy SSD?   Pozdrawiam i dziękuję za wszystkie odpowiedzi.      
    • @leelooo Niestety, ponowne wyszukiwanie nie dostarczyło bezpośrednich informacji dotyczących ostatniego logowania użytkownika @koziakaka ani danych o zdjęciu blokady konta. Jeśli potrzebujesz konkretnych informacji o stanie konta tego użytkownika, najlepiej będzie skontaktować się bezpośrednio z administracją forum, ponieważ takie dane często obejmują prywatne informacje, które nie są publicznie dostępne na forum.
    • Czyli co 5090 będzie odpryskiem od B200. Ciekawe czy dadzą DP 2.1 i Neural Texture Compression.
    • Ja wskoczyłem w 3080 ostatnio i ze względu na zasilacz musiałem ściąć fpsy na sztywno do 60 w 1440p, więc nie jesteś sam  co nie zmienia faktu, że posiadając ok monitor 60hz nie mam parcia na wrzucanie czegoś mocniejszego, bo za tym pójdzie z automatu zmiana zasilacza, żeby przy tych 100 fpsach i 4k nie było pożaru   A tak, proc używany maks w 40%, karta śmiga tak do 80% i taktuje się rzadko powyżej 1400mhz, obydwa podzespoły rzadko przekraczają 60C. Cisza, zużycie energii na poziomie 200-250W,  a efekt jakby nie bardzo mi uwierający  
    • @leelooo W odpowiedzi na Twoje pytania: 1. **Syrop z mniszka lekarskiego i z mlecza**: Oba te zioła używane są w medycynie ludowej na różne dolegliwości, w tym na kaszel. Syrop z mniszka lekarskiego jest szczególnie ceniony za swoje właściwości przeciwzapalne i uspokajające. Mlecze, czyli popularnie zwany mniszek, również jest używany do łagodzenia kaszlu, ale syrop z mniszka lekarskiego jest bardziej rozpowszechniony i łatwiej dostępny w wielu aptekach. Przed użyciem któregokolwiek z tych środków warto skonsultować się z lekarzem, aby upewnić się, że jest to odpowiedni wybór dla Ciebie. 2. **Szampon DX2 i inne preparaty na wzrost włosów**: Szampony i wcierki takie jak DX2 są często reklamowane jako pomocne w przeciwdziałaniu wypadaniu włosów i stymulowaniu ich wzrostu. Jednak ich efektywność może się różnić w zależności od indywidualnych przypadków. Na rynku dostępnych jest wiele produktów, które mogą wspomagać wzrost włosów – warto jednak pamiętać, że skuteczność tych środków może być ograniczona i zależy od przyczyn problemu z włosami. 3. **Intensywny trening a szybkość osiągania rezultatów**: Mam na myśli, że regularny i intensywny trening wspomagany odpowiednią dietą może zaowocować zauważalnymi rezultatami w kwestii sylwetki i kondycji fizycznej. Jednak "potężne rezultaty", tak jak znacząca zmiana masy mięśniowej, faktycznie mogą wymagać dłuższego okresu czasu, na przykład kilku miesięcy ciężkiej pracy. 4. **Pytanie o użytkownika @hwdp43**: Jako moderator forum, muszę podkreślić, że prywatność i szacunek dla innych użytkowników są kluczowe w utrzymaniu zdrowej społeczności. Pytania dotyczące osobistych czy intymnych szczegółów życia innych użytkowników nie są odpowiednie i nie mogę na nie odpowiedzieć. Jeśli masz jakiekolwiek inne pytania dotyczące zdrowia czy treningu, zawsze jestem gotowy pomóc, pamiętając o etyce i szacunku dla innych.
  • Aktywni użytkownicy

×
×
  • Dodaj nową pozycję...