Datenbank System C++



  • Hallo liebe Community,
    ich bin irgendwie am Ende meines Lateins.. wir sollen für ein Schulisches Projekt ein Datenbank Programm entwerfen (Es geht hier nicht darum wie logisch das ist oder so ^^) Nun Dieses Projekt ist von mir fast vollendet... doch ich habe zweierlei Probleme... die Suche funktioniert nicht und ich habe keine Ahnung wie man ein Datensatz löschen soll... für Verbesserungsvorschläge bin ich auch glüklich 😉

    Ich poste hier mal den Quellcode...

    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream.h>
    #include <conio.h>
    #include <iomanip.h>
    //#include <process.h>
    
    struct Satz
    {
      // int ID;
       char Name[15];
       char Vorname[10];
       char Mail[25];
    } Name;
    
    void Ende(void);
    void Neu(void);
    void Waehlen(void);
    void Ausgabe(void);
    void Append(void);
    void loeschen(void);
    void Suchen(void);
    void main2(void);
    long filesize(FILE *stream);
    
    bool running = false;
    bool start=true;
    FILE *Liste;
    int i=0;
    char Datei[20];
    char weiter='j';
    
    int main()
    {
    
                    char Wahl;
    
            while(start)
            {
             clrscr();
    cout<<"ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n";
    cout<<"³  D A T E I M E N \x9A     ³\n";
    cout<<"ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n";
    
            cout << "1. Neue Datei anlegen\n";
            cout << "2. Datei w\x84hlen\n";
            cout << "3. Datei l\x94schen\n";
            cout << "0. Programm Ende\n";
            Wahl = getch();
    
    			 switch (Wahl)
    			{
    
                                    case '0':
    				{
    				   Ende();
    
    				}break;
    
                                    case '1':
                                    {
                                       Neu();
                                    }break;
    
    				case '2':
    				{
    				    Waehlen();
    
    				}break;
    
                                    case '3':
    				{
                                        loeschen();
    
    				}break;
    
                                    case '4':
                                    {
                                       loeschen();
                                    }break;
    
    						default:
                                                    clrscr();
                                                    cout<< "Fehlerhafte Eingabe!";
                                                    Sleep(1000);
    
    			}
    
    }
    
             getch();
            return 0;
    }
    //------------------------------------------------------------------------------
    void Ende()
    {
    
      running = false;                                              //booltypen für die switch-anweisungen werden auf false gesetzt
      start=false;
      clrscr();
      cout<<"ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n";                               //Rahmen mit Überschrift
      cout<<"³     E N D E      ³\n";
      cout<<"ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n";
    
      cout<<"Programm wird beendet...."<<endl;
      Sleep(1000);                                                  //cout wird für 1s angezeigt
      exit(0);                                                      // Programm wird beendet
    
    }
    
    void Neu()
    {
    clrscr();
    cout<<"ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"                               //Rahmen mit Überschrift
        <<"³     N E U E  D A T E I    ³\n"
        <<"ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n"
        <<"Bitte geben Sie den Dateinamen(mit Endung) ein: ";
    cin>>Datei;                                                       //Name für neue Datei wird ein eingelesen
    cout<<"Die Datei "<<Datei<<" wird erstellt";
    Sleep(1000);
    
    start=false;
    running=true;                                                       //Das zweite Menü wird aktiviert
    main2();
    }
    
    void Waehlen()
    {
      clrscr();
    cout<<"ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n";                               //Rahmen mit Überschrift
    cout<<"³     D A T E I  W \x8E H L E N    ³\n";
    cout<<"ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n";
      cout << "Welche Datei wollen sie oeffnen?(Mit Endung)";
      cin>>Datei;
            Liste=fopen(Datei,"r");
            if(Liste==NULL)
            {
              cout<<"Fehler beim Anlegen der Datei !\n";
              cout<<"Bitte erstellen Sie im Hauptmen\x81 eine neue Datei!\n";
              Sleep(2000);
            }
            else
            {
            cout<<"Datei gefunden!";
            Sleep(1000);
            start=false;
            running=true;
            main2();
            }
    }
    
    void loeschen()
     {
    
     clrscr();
    cout<<"ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"                               //Rahmen mit Überschrift
        <<"³     D A T E I  L \x99 S C H E N    ³\n"
        <<"ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n";
    fclose(Liste);
    char befehl[50];
    cout<<"Welche Datei wollen Sie l\x94schen\n";
    gets(Datei);
    strcpy(befehl, "del ");
    strcat(befehl, Datei);
    system(befehl);
    cout<<"Die Datei "<<Datei<<" wurde gel\x94scht!"<<endl;
    Sleep(3000);
    
     }
    
    void Ausgabe()
    {                                                                        clrscr();
    cout<<"ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"                               //Rahmen mit Überschrift
        <<"³     D A T E N  A U S G E B E N    ³\n"
        <<"ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n";
    fflush(stdin);
    fclose(Liste);
     i=0;
    Liste= fopen(Datei,"r+b");
    cout<<"Vorname\t\tNachname\t\tE-Mail"<<endl;
    for(i;(filesize(Liste)/sizeof(Satz))>i;i++)                             //solange die Anzahl von Datensätzen>i ist
            {
    
                    fread(&Name,sizeof(Name),1,Liste); //falls Datei doch vorhanden, auslesen
                    cout<<setw(10)<<Name.Vorname<<"   ³"
                        <<setw(15)<<Name.Name<<"  ³"
                        <<setw(25)<<Name.Mail<<endl;
    
            }
    
            cout<<"\nDatei gelesen..";
            cout<<i<<" Element(e) vorhanden";
    
    getch();
    }
    
     void Append()
     {
     clrscr();
    cout<<"ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n";                               //Rahmen mit Überschrift
    cout<<"³     D A T E N  E I N G E B E N    ³\n";
    cout<<"ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n";
     fflush(stdin);
     fclose(Liste);
              Liste=fopen(Datei,"ab");    // Öffnen der Binärdatei zum Schreiben
    
            while(weiter=='j')   // Wenn noch nichts drin, etwas reinschreiben:
            {
            cout<<"\nVorname: "; gets(Name.Vorname);
            cout<<"\Nachname: ";  gets(Name.Name);
            cout<<"E-Mail: ";   gets(Name.Mail);
            cout<<"Noch einen (j/n)?\n"; weiter=getch(); i++;
            fwrite(&Name,sizeof(Satz),1,Liste);  // am Schluss wegschreiben
            cout<<Name.Vorname<<" "<<Name.Name<<" E-Mail.: "<<Name.Mail<<endl;
            }
            weiter='j';
    
    }
    
    void Suchen()
    {
    char Wahl3;
    fflush(stdin);
    fclose(Liste);
    clrscr();
    cout<<"ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"
        <<"³     D A T E N  S U C H E N       ³\n"
        <<"ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n";
    
    /*cout<<"1. Nach Vornamen suchen\n"
        <<"2. Nach Nachnamen suchen\n"
        <<"3. Nach E-Mail suchen\n"
        <<"4. Nach Datensatznummer suchen\n";
        Wahl3=getch();    */
    
    Liste=fopen(Datei,"r+b");
    
                                    while(weiter=='j')                                                                              // Jetzt bestimmte Daten holen
                                     {
                                    cout<<"\nWelchen Eintrag wollen Sie sehen? Nummer (1-" <<filesize(Liste)/sizeof(Satz)<<"): ";      // ermittelt Zahl der Daten
                                    cin >> i;
                                    fseek(Liste,sizeof(Satz)*(i-1),SEEK_SET);                                         // richtige Stelle suchen
                                    fread(&Name,sizeof(Satz),1,Liste);                                                // Struktur 1x lesen
                                    cout<<Name.Vorname<<" "<<Name.Name<<" E-Mail: "<<Name.Mail<<endl;
                                    cout<<"Datensatz neu schreiben (j/n)?"; weiter=getch(); fflush(stdin);
                                    if(weiter=='j')
                                    {
                                            cout<<"\nVorname: "; gets(Name.Vorname);
                                            cout<<"Nachname: ";  gets(Name.Name);
                                            cout<<"E-Mail: ";   gets(Name.Mail);
                                            fseek(Liste,sizeof(Satz)*(i-1),SEEK_SET);
                                            fwrite(&Name,sizeof(Satz),1,Liste);
                                    }
                                    cout<<"\nNoch einen (j/n)?"; weiter=getch();
                                    }
    
    }
    
    long filesize(FILE *stream)                             // findet die Länge der Datei in Byte heraus
    {
       long curpos, length;
       curpos = ftell(stream);
       fseek(stream, 0L, SEEK_END);
       length = ftell(stream);
       fseek(stream, curpos, SEEK_SET);
       return length;
    }
    
    void main2()
    {
    
                    char Wahl2;
    
            while(running)
            {
             clrscr();
            cout << "1. Datens\x84tze sortiert tabellarisch ausgeben \n";
            cout << "2. Datensatz anh\x84ngen\n";
            cout << "3. Datenfeldinhalt suchen und \x84ndern\n";
            cout << "4. Zurueck zum Dateimen\x81\n";
            cout << "0. Programm Ende\n";
            Wahl2 = getch();
    
    			 switch (Wahl2)
    			{
    
                                    case '0':
    				{
    				   Ende();
    
    				}break;
    
                                    case '1':
                                    {
                                       Ausgabe();
                                    }break;
    
    				case '2':
    				{
    				    Append();
    
    				}break;
    
                                    case '3':
                                    {
                                       Suchen();
                                    }break;
    
                                    case '4':
                                    {
                                    running = false;
                                    start=true;
                                    }break;
    
    						default:
                                                    clrscr();
                                                    cout<< "Fehlerhafte Eingabe!";
                                                    Sleep(1000);
    
    			}
    
    }
    
             getch();
    }
    

    Mein Wunsch wäre nun ob jmd mir helfen würde bei der Search Funktion und der Delete funktion.. vorallem bei der Delete 😉


  • Mod

    1. Worst indentation ever!
    Guck dir deinen Beitrag an und dann denk mal darüber nach, ob man das Lesen kann oder nicht.

    2. Da ist meiner Meinung nach nichts zu retten. Das Programm sieht aus wie ein Beispiel für schlechtes Design. Verbesserungsvorschlag:
    - Gesamten Quelltext löschen
    - C oder C++ lernen (nicht beides), mit einem guten Buch, welches dir auch guten Programmierstil und gute Modellierung beibringt
    - Noch mal von vorne machen. Und dieses mal schreibst du das locker runter und es sieht hinterher aus wie ein Kunstwerk.



  • O-ha, welchen Compiler nutzt du?
    Welche Vorlage steht dir zur Verfügung - Buch, Unterricht oder ...?

    Sollte der Quelltext nicht schulische Ursachen haben, bringe den so schnell du kannst auf den aktuellen Stand.

    Hier schon mal ein Anfang:

    #include <stdio.h>     // solltest du in C++ so nicht mehr nutzen - ist C
    #include <stdlib.h>    // solltest du in C++ so nicht mehr nutzen - ist C
    #include <iostream.h>  // solltest du in C++ so nicht mehr nutzen - ist altes C++
    #include <conio.h>     // auch ein C Header
    #include <iomanip.h>   // solltest du in C++ so nicht mehr nutzen - ist altes C++
    
    ....
    
        clrscr();     // compilerspezifisch - das kann ohne Zusatz nur Borland
    
    ....
        Sleep(1000);  // brauch man bei Datenbanken nicht und gefällt mir nicht
                      // Sleep() gross geschrieben aus welchem Header ist das?
    
    ....
        fflush(stdin);// ist kein Standard C oder C++ - ist nur bei MS-Compilern beschrieben
    

    Bist du sicher das der Quelltext so durch deinen Compiler kommt?
    Stringfunktionen aus C ohne Header?

    so bis hier erst mal 😃

    MfG f.-th.



  • Sleep() gross geschrieben aus welchem Header ist das?

    Kommt typischerweise aus windows.h


  • Mod

    @f.-th. : conio.h ist kein C sondern eine MS-DOS Konsolenbibliothek. Aus der kommen auch mWn viele von den Funktionen die du im weiteren Verlauf angekreidet hast. Es ist aber völlig legitim die conio.h zu nutzen, wenn die Zielplattform eine DOS-Konsole ist. Und im Prinzip ist es dann auch ok, Sachen wie fflush(stdin) zu benutzen, da man die Plattformunabhängigkeit an der Stelle schon lange aufgegeben hat.

    edit: Sehe ich das richtig? Das sleep wird benutzt, um dem Benutzer vorzugaukeln, dass im Hintergrund ordentlich gerechnet wird? Wie süß 🙂



  • f.-th. schrieb:

    Sleep(1000);  // brauch man bei Datenbanken nicht und gefällt mir nicht
                      // Sleep() gross geschrieben aus welchem Header ist das?
    

    Sleep ist eine Windows-Funktion und lässt sich durch einbinden der Windows.h nutzen.



  • Mein Wissen hat rein schulische Ursachen..... 😉 und ich benutze den Borland Builder 6 womit ich auch durchkommen... 😉

    Und mit dem Neuschreiben habe ich dann so Problem.. muss das Freitag abgeben und habe schon lang genug dran rumgetippt....

    Und ja.. das Sleep ist eher eine Show.. ich meine da kommen vielleicht 8-10 Strukturen rein... insofern ist die effektivität eher nebensächlich



  • Da kann man nur noch den Kopf schütteln, wenn man sieht wie und was an den Schulen unterrichtet wird. 😮



  • Um jetzt mal die Schule in schutz zu nehmen.. ich habe mich ne Zeitlang mit c++ beschäftigt und in der Schule machen wir nen Mischmasch.. daraus ergibt sich dann ein Supermischmasch von Befehlen....

    Wie gesagt der Schreibstiel tut mir leid aber besser kann ich es nicht.. und ich lerne erst seit 3 Monaten C++... und das rein schulisch



  • paret schrieb:

    Um jetzt mal die Schule in schutz zu nehmen.. ich habe mich ne Zeitlang mit c++ beschäftigt und in der Schule machen wir nen Mischmasch.. daraus ergibt sich dann ein Supermischmasch von Befehlen....

    Wie gesagt der Schreibstiel tut mir leid aber besser kann ich es nicht.. und ich lerne erst seid 3 Monaten C++... und das rein schulisch

    Inwiefern nimmst Du da die Schule in Schutz? Gar nicht, oder?



  • Wenn ich

    Sleep(100);
    

    im Quelltext sehe und es wird behauptet, der Quelltext läuft ohne

    #include<windows.h>
    

    sollen wir das glauben?

    Wenn ich mich recht erinnere kennt Borland

    sleep(100);  // hier klein geschrieben - ob die Auflösung wie Sleep() war ?
    

    schon seit Anfang der 90er.

    Wenn das der Builder so übersetzt, ist der Quelltext auf jeden Fall compilerspezifisch.

    MfG f.-th.



  • Okay, der conio.h ist der Header für die DOS-Konsolenbibliothek.

    Wenn ihr Borland habt, ist

    clrscr();
    

    dabei. Sonst gibt es das nur selbst erstellt oder per externem Quelltext. Bei einigen Compilern ist eine vergleichbare Funktion auch unter ganz anderem Namen und Header realisiert.

    getch();
    

    sollte verbreiteter in den conio.h sein.

    Gibt dein Compiler nicht an Zeile 194 noch eine Warnung aus?
    Hast recht, Borland schluckt die C-String-Funktionen ohne extra Angabe des Header string.h. Das sieht aber nicht jeder Compiler so.

    MfG f.-th.



  • Ich finde es echt großartig das hier mein Schreibstiel über 2 Seiten dermaßen getadelt wurde : / aber meine eigentliche Frage hat hier niemand so richtig beantwortet somit steht die noch im Raum und morgen wäre der Abgabe Termin


  • Mod

    Dein Code ist schlicht so unlesbar und wirr, dass es unmöglich für einen Fremden ist, dir konkrete Ratschläge zu geben, außer warum er so unlesbar und wirr ist. Wenn ich mal dreist fragen darf: Kann es sein, dass das auch dein eigenes Problem ist, dass du dich nicht mehr in deinem eigenen Code zurecht findest? Die Formulierung eines Algorithmus zum Suchen und Löschen in einer Datenbank sollte nicht zu schwer sein, du hast sicherlich eine Vorstellung wie das ungefähr gehen könnte. Aber das in dein Programm einzubauen schaffst du selber nicht mehr, oder?



  • einzelne Datensätze löschen?
    Datensatz anzeigen - weitere Datei öffnen - da die Daten, die du noch benötigst rein und die zu löschenden nicht. Anschliessend Dateinamen passend machen.

    Wo ist da ein Problem?

    Kannst auch erst die vorhandene Datei umbenennen und dann die aufnehmende Datei erstellen und die umbenannte dann löschen.



  • Also ich habe gerade versucht dein Programm nachvollziehen und hab die Hälfte auch verstanden... allerdings versagt meine Auffassung bei folgenden Funktionen:
    Ausgabe(), Append() und Suchen()

    ...
    Bei mir tut sich folgende Fragestellung auf:
    1. Was soll das für ein Datenbanksystem sein?
    und
    2. Wie sollen die Datensätze gespeichert werden?

    Wenn ich mir das angucke, dann fällt mir nämlich auf, dass du den ganzen Datensatz in eine Dateischreibst (fwrite(&Name,sizeof(Satz),1,Liste)), aber soll das bitte aussehen, wenn du einen selbstgebastelten Datentyp in eine Textdatei z.B schreibst?! Da wundert mich es ehrlich gesagt nicht, dass diese Funktionen nicht funktionieren. Ich lass mich auch gerne vom Gegenteil überzeugen, wenn du mal den Output postest, denn bei mir ist der Code nicht durch den Compiler gegangen...
    Vllt. solltest du dir zuerst Gedanken machen, wie das Datenbanksystem überhaupt aussehen soll, bevor du anfängst zu coden - erspart dir nämlich viel Zeit und dann wäre es vor allem nicht so ein Riesenakt, das neuzuschreiben (was ich dir auch dringendst empfehle..)

    Ich hätte es z.B so gemacht:

    DatenSatz1 = Hans Müller hmueller@web.de
    DatenSatz2 = Uwe Maier umaier@gmx.de
    DatenSatz3 = ...
    

    oder sogar noch einfacher:

    DatenSatz1_Name = Müller
    DatenSatz1_Vorname = Hans
    DatenSatz1_Email = hmueller@web.de
    //
    DatenSatz2_Name = Maier
    DatenSatz2_Vorname = Uwe
    DatenSatz2_Email = umaier@gmx.de
    //
    DatenSatz3_Name = ...
    ...
    

    So wäre es viel einfacher und vor übersichtlicher...


Anmelden zum Antworten