[c++] Baza danych

0

Witam,
Mam problem z programem obslugujacym baze danych.Mam plik csv i kazde nazwisko wyglada tak:

Imie,Nazwisko,Numer_indeksu
Imie1,Nazwisko,Numer_indeksu
.............................................
.............................................

Chciałbym zczytywać całą listę studentów do tablicy wskażników która mam tworzona dynamicznie.Potrzebuję róznież zczytywać odpowiedniego studana - o określonym naziwsku/indeksie - kompletnie nie wiem jak się za to zabrać

WIELKIE DZIĘKI ZA WSZELKIE ODWPOWIEDZI

0

Ja bym zamiast tablicy zrobiła sobie listę dynamiczną. Czyli takie struktury, gdzie każda pokazuje na następną.
Struktura mogła by wyglądać tak:

typedef struct Student
{
char* imie;
char* nazwisko;
char* nr_indeksu;
struct Student *next; //wskaznik na nastepny element
}student;

odczytywanie z pliku mozesz potraktowac jako tworzenie listy.
Proponuje bys imie,nazwisko,mr indeksu nie oddzielal przecinkami tylko TABem. Odczytywanie stanie się wtedy bardzo proste. Oto przykładzik:
Z gory zaznaczam, ze moga byc tu drobne bledy, gdyz pisze od reki.

I gdzies np globalnie zadeklaruj sobie wskaznik poczatku tej listy.
Np.
student *pocz=NULL;

void dodaj (void)
{
student *rob;
rob=pocz;
char a[10],b[10],c[10];
plik=fopen("studenci.txt","r");
while(!feof(plik))
{
if (rob==pocz)
{
pocz=new student;
fscanf(plik,"%s \t %s \t %s\n",a,b,c);
pocz->imie=new char[strlen(a)+1];
strcpy(pocz->imie,a)
pocz->nazwisko=new char[strlen(b)+1];
strcpy(pocz->nazwisko,b)
pocz->nr_indeksu=new char[strlen(c)+1];
strcpy(pocz->nr_indeksu,c)
pocz->nast=NULL;
}
else //czyli jest juz cos w liscie
{
while (rob->nast!=NULL) rob=rob->nast;
rob->nast=new student;
rob=rob->nast;
fscanf(plik,"%s \t %s \t %s\n",a,b,c);
rob->imie=new char[strlen(a)+1];
strcpy(rob->imie,a)
rob->nazwisko=new char[strlen(b)+1];
strcpy(rob->nazwisko,b)
rob->nr_indeksu=new char[strlen(c)+1];
strcpy(rob->nr_indeksu,c)
rob->nast=NULL ;
}
fclose(plik)
}

Na tej podstawie mozesz wykopnac kazda operacje na bazie jaka tylko Ci sie podoba.
Pozdrawiam!

0

Przypominam, że zapis listy studentów w pliku musi tak wyglądać:

imie nazwisko nr
imie nazwisko nr
imie nazwisko nr

czyli dane tej samej osoby oddzielone tabulatorem natomiast kolejne osoby oddzielone od siebie enterem.

0

Ale się namęczyłaś wielkie dzięki - ale widzisz to jest program na zaliczenie i niestety tak go trzeba zrobić :(

0

No to stworz sobie ta strukture student. A potem zadeklaruj tablice wskaznikow na te struktury.
O ile sie nie myle bedzie to
student *tablica[20] //i tutaj masz zadeklarowana tablice wskaznikow.

Zczytywanie z pliku zrób fgetc. Z takim założeniem, że jeżeli spotka przecinek to przechodzi do wpisywania nazwiska, jak kolejny przecinek to do nr indeksu. A jak enter to przeskakuje na następny element tablicy.

I będzie tak jak musisz mieć.
Pozdrawiam.

0

Niby jest tak jak mówisz - ale nasz pan wykładowca kazał numer indeksu zadeklarować jako int - i tutaj jest problem własnie ze zczytywaniem - (dodawanie już dorobiłem)... i teraz problem bo ok - jeżlei napotka przecienk zczytuj do imienia jezeli napotka przecinek zczytuj do naziwska - i co - przrwij zczytywanie ?? czy może zczytuj do inta - ale czym bo read to nie bardzo :( on zczytuje char`y...

0

Spoko! Zrób na skrót. Zczytaj jako char do jakieś innej zmiennej np char a[10]. Teraz do zmiennej typu int wpisz tak:
zmienna=atol(a);
Ot cały problem :)

Pozdrawiam i życzę miłego pisania :)

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

int main(){
  FILE * f=fopen("twojplik","rt");
  char* s;
  char a[512];
  while(s=fgets(a,512,f)){ // warning ble... Impossibly correct assignment :D
    //clear(a); //definicja nizej
    char* p;
    char cyfra='1'; // indeks calkowicie niepotrzebny jak wywalisz printf()
    printf("before: %s\nafter:",a);
    while(p=strtok(s,",")){ // jak wyzej: niesamowicie ok 
      printf("\t%c: %s",cyfra++,p); // tu zamiast printfa wsadz swoja obsluge, p wskazuje na szukany ciag
      if(!s)*(--p)=','; // bo strtok miesza w sprawdznym ciagu znakow, zeby nie stracic danych w a, ale nie za pierwszym razem, usun, jesli ci nie zalezu juz na tym, co sie dzieje z a
      s=0; // s=NULL; obojetnie, bo to to samo #define NULL 0L 
    }
    if(!s)printf("\n"); // pomija wyswietlanie pustych linii, bo przy pustych wskaznik s sie nie zeruje. Przy okazjii... fgets wczytuje rowniez znak \n konca linii stad u ciebie dodatkowa linijka przerwy :)
  }
  fclose(f);
  return 0;
}
  • odpal helpa dla fgets() i strtok(). banalnie, nie ? :)

usuwanie znaku \n z konca char* zmienna:

int clear(char* zmienna){
  char* temp=strchr(zmienna,'\n');
  if(temp)*temp=0; 
  return !!temp;
}  // zwroci 1 gdy znalazl \n i zero, gdy nie bylo zadnej zmiany

Przy okazji :

Przypominam, że zapis listy studentów w pliku musi tak wyglądać:

hmm to juz drugi post, w ktorym usilnie próbujesz narzucić swoje wlasne poglądy na jakąs sprawę. Co powiesz na haslo...

"Unix to zawsze wybór"

// za głębokie :> ? hmmm, właśnie wpadłem na pomysł na wieloznaczną stopke :

0

Ludzie pomóżcie czemu to nie zczytuje dobrze ;( ;( ;( ;( ;( ;( ;(

int zczytaj(student *tab_wsk[],int rozmiar)
       {
           student *wsk;
           int zmienna1,licznik=0;
           char bufor[1000],zmienna[10],imie[100],naziwsko[100];
           cout <<"\nZczytywanie...";
           odczyt.open("lista.csv",ios::in);
           do
           {
               odczyt.getline(bufor,1000,'\0');
                  do
                  {
                     wsk = new student ;
                     while(bufor[licznik]!=',')
                        {
                           wsk->imie[licznik]=bufor[licznik];
                           licznik++;
                        }
                        licznik++;
                        while(bufor[licznik]!=',')
                           {
                              int k=0;
                              wsk->nazwisko[k]=bufor[licznik];
                              licznik++;
                              k++;
                           }
                        licznik++;
                        while(bufor[licznik]!='\0')
                           {
                              int c=0;
                              zmienna[c]=bufor[licznik];
                              licznik++;
                              c++;
                           }
                        zmienna1=atoi(zmienna);
                        wsk->nr_albumu=zmienna1;
                        cout <<"\n"<<wsk->imie<<" " <<wsk->nazwisko<<" "<<wsk->nr_albumu<<endl;
                        tab_wsk[rozmiar]=wsk;
                        rozmiar++;
                  }while(bufor[licznik]!='\0');
           }while(!EOF);
           odczyt.close();
           return rozmiar;
       } 

Jak zawsze - WIELKIE DZIĘKI ZA JAKIKOLWIEK HELP!!!!!!!!!!!!!!!!!!!

0

Dodam tylko ze za peirwszym razem zczytuje mi Imie,Ostatnia_literaa_nazwiska,0
potem
, Last_letter,0
, Last_letter,0
, Last_letter,0
, Last_letter,0
, Last_letter,0
, Last_letter,0
, Last_letter,0

^w sensie bez imienia - dla ios:: binary - te same błędy - co robić pomóżcie... :(:(:(

0

Odkyrłem większość błedów - zczytuje normalnie nazwisko i ime numer indeksu dalej zero ale spoko :D

Powiedzcie jak zrobić zaby zejść do nowej lini :D:D

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