DatenBank programm in C++

KCobain

Mitglied
hi vielleicht kann mir ja jemand dabei helfen.
ich will das die eingegebenen Daten immer wie tabellen gespeichert werden.
also Z.b.
1. Kundenname: Hanst
2. Kundenname: Klaus
usw.
will aber das man nicht immer die zahlen eingeben muss sondern das das programm das macht. und dann man beim löschen nur noch die nummer eingeben muss von der Person die man löschen möchte!
hier mein derzeitiger source!

Main.cpp
Code:
//DataBase Programm zum erfasseb von Userdaten

#include <iostream>
#include <stdio.h>
using namespace std;
#include "Main.h"

FILE *Datei = fopen("c:\\DataBase.db","w"); //"w" für write

//Funktionen
void NeueDaten(void);
void DatenAendern(void);
void DatenEinsehen(void);
void DatenLoeschen(void);


//Hauptteil
void main(void)
{
	//lokale Deklarationen
	int Auswahl;

	cout << "Willkommen beim DataBase Programm\n\n";
	cout << "Was moechten sie tun?\n";
	cout << " -----------------------\n";
	cout << "| 1.Neue Daten anlegen	|\n";
	cout << "| 2.Alte Daten aendern	|\n";
	cout << "| 3.Daten Einsehen	|\n";
	cout << "| 4.Daten Loeschen	|\n";
	cout << "| 5.Programm Beenden	|\n";
	cout << " -----------------------\n\n";
	cout << "Bitte auswaehlen: ";
	cin >> Auswahl;

	if (Auswahl == 1)
	{
		NeueDaten();		
	}
	if (Auswahl == 2)
	{
		DatenAendern();
	}
	if (Auswahl == 3)
	{
		DatenEinsehen();
	}
	if (Auswahl == 4)
	{
		DatenLoeschen();
	}
	if (Auswahl == 5)
	{
		fclose(Datei);
		return;
	}

	if (Auswahl >=6 || Auswahl <=0)
	{
		system("cls"); //löscht inhalt von konsole!
		cout << "\n Falsche eingabe!\n\n\n";
		main();	
	}
}

void NeueDaten(void)
{
	Datei = fopen("c:\\DataBase.db","w"); //"w" für write
	//lokale deklaration
	char Frage;
	//Kundendaten Deklarieren
	Kundendaten Kundendaten;
		
	cout << "\n Bitte geben Sie ihre Daten ein!\n\n";
	cout << "Name:";
	cin >> Kundendaten.Kunde;
	cout << "Alter:";
	cin >> Kundendaten.Alter;
	cout << "Wohnort:";
	cin >> Kundendaten.Wohnort;
	
	while(true)
	{
	//Beendigungsfrage
	cout << "\n Weitere Daten eingeben?(J/N):";
	cin >> Frage;

	if (tolower(Frage) == 'j') 
	{ 
			NeueDaten();
			
	}
	else if (tolower(Frage) == 'n')
	{
		//Daten speichern
		cout << "\nWollen Sie ihre Daten speichern?";
		cin >> Speichern;
		if (tolower(Speichern) == 'j')
		{
			cout << "\nDaten an Datei anhaengen?";
			cin >> Anhängen;
			if (tolower(Anhängen) == 'j')
			{
				//zum Hauptmenü zurückkehren
				system("cls");
				main();
				break;
			}
			else if(tolower(Anhängen) == 'n')
			{
				fwrite(&Kundendaten,sizeof(Kundendaten),1,Datei);
				//Datei schließen
				fclose(Datei);
				//zum Hauptmenü zurückkehren
				system("cls");
				main();
				break;
			}
			
		}
		else if (tolower(Speichern) == 'n')
		{
		//zum Hauptmenü zurückkehren
		system("cls");
		main();
		break;
		}
	}
	else
	{
		cout << "\n Falsche eingabe \n";
	} 
	}
}

void DatenAendern(void)
{
	//Kundendaten Deklarieren
	Kundendaten Kundendaten;
		//zum Hauptmenü zurückkehren
		system("cls");
		main();
}

void DatenEinsehen(void)
{
	//Kundendaten Deklarieren
	Kundendaten Kundendaten;
	Datei = fopen("c:\\DataBase.db","r"); //"r" für read
	fread(&Kundendaten,sizeof(Kundendaten),1,Datei);
	
	cout << "\nName:" << Kundendaten.Kunde << " | Alter:" << Kundendaten.Alter << " | Wohnort:" << Kundendaten.Wohnort << "\n";
	
		//zum Hauptmenü zurückkehren
	cout << "\n";	
	main();
}

void DatenLoeschen(void)
{
	//Kundendaten Deklarieren
	Kundendaten Kundendaten;
		//zum Hauptmenü zurückkehren
		system("cls");
		main();
}

und hier die Main.h
Code:
//DataBase Header Datei
#include <iostream>
#include <stdio.h>
using namespace std;


//Globale Deklarationen
char Speichern;
char Anhängen;

//Globale Strukturen
struct Kundendaten
{
char Kunde[30];
int Alter;
char Wohnort[50];
};

Postet eure meinung und verbesserungen. bin newbie in C++.
 
Ich habe noch nicht gross über dein Programm nachgedacht, aber mir ist aufgefallen, dass du -- anstatt in der main() eine Schleife zuverwenden -- immer wieder die main() selbst aufrufst, um den Ablauf von vorne zu starten. Das ist übel. Bei jedem Aufruf der main() werden alle lokalen Variablen neu auf dem Datentack angelegt, ebenso wird für den Rücksprung die augenblickliche Psoition im Code auf dem Returnstack abegelegt. Da aber niemals zurückgesprungen wird, laufen die Stacks irgendwann voll - Rummmms!
Mach's lieber so:

Code:
int main()
{
  // ...

  int Auswahl = 0;
  // wenn 5 eingeben, bricht Schleife ab
  while ( Auswahl != 5 )
  {
	  cout << "Bitte auswaehlen: ";
	  cin >> Auswahl;
    if ( Auswahl == 1 )
	  {
		  NeueDaten();		
	  }
    else if ( Auswahl == 2 )
    {
		  DatenAendern();
    }

    //...
    // weitere else-ifs und Fehlerbehandlung
    //...
  }
}
Und in den Unterfunktionen wie NeueDaten() lass dann diesen Block weg:
Code:
		//zum Hauptmenü zurückkehren
		system("cls");
		main();
		break;
 
fehler, wenn ich nun 5 eingebe beendet das progrmm nicht!

Code:
//DataBase Programm zum erfasseb von Userdaten

#include <iostream>
#include <stdio.h>
using namespace std;
#include "Main.h"

FILE *Datei = fopen("c:\\DataBase.dBase","w"); //"w" für write

//Funktionen
void NeueDaten(void);
void DatenAendern(void);
void DatenEinsehen(void);
void DatenLoeschen(void);


//Hauptteil
void main(void)
{
	//lokale Deklarationen
	int Auswahl = 0;

	cout << "Willkommen beim DataBase Programm\n\n";
	cout << "Was moechten sie tun?\n";
	cout << " -----------------------\n";
	cout << "| 1.Neue Daten anlegen	|\n";
	cout << "| 2.Alte Daten aendern	|\n";
	cout << "| 3.Daten Einsehen	|\n";
	cout << "| 4.Daten Loeschen	|\n";
	cout << "| 5.Programm Beenden	|\n";
	cout << " -----------------------\n\n";


	 // wenn 5 eingeben, bricht Schleife ab
  while ( Auswahl != 5 )
  {
	cout << "Bitte auswaehlen: ";
	cin >> Auswahl;

	if (Auswahl == 1)
	{
		NeueDaten();		
	}
	else if (Auswahl == 2)
	{
		DatenAendern();
	}
	else if (Auswahl == 3)
	{
		DatenEinsehen();
	}
	else if (Auswahl == 4)
	{
		DatenLoeschen();
	}

	else if (Auswahl >=6 || Auswahl <=0)
	{
		system("cls"); //löscht inhalt von konsole!
		cout << "\n Falsche eingabe!\n\n\n";
		main();	
	}
  }
}

void NeueDaten(void)
{
	
	//lokale deklaration
	char Frage;
	//Kundendaten Deklarieren
	Kundendaten Kundendaten;
		
	cout << "\n Bitte geben Sie ihre Daten ein!\n\n";
	cout << "Name:";
	cin >> Kundendaten.Kunde;
	cout << "Alter:";
	cin >> Kundendaten.Alter;
	cout << "Wohnort:";
	cin >> Kundendaten.Wohnort;
	
	while(true)
	{
	//Beendigungsfrage
	cout << "\n Weitere Daten eingeben?(J/N):";
	cin >> Frage;

	if (tolower(Frage) == 'j') 
	{ 
			NeueDaten();
			
	}
	else if (tolower(Frage) == 'n')
	{
		//Daten speichern
		cout << "\nWollen Sie ihre Daten speichern?";
		cin >> Speichern;
		if (tolower(Speichern) == 'j')
		{
			cout << "\nDaten an Datei anhaengen?";
			cin >> Anhängen;
			if (tolower(Anhängen) == 'j')
			{
				Datei = fopen("c:\\DataBase.dBase","a"); //"a" für anhängen
				fwrite(&Kundendaten,sizeof(Kundendaten),1,Datei);
				//Datei schließen
				fclose(Datei);
				//zum Hauptmenü zurückkehren
				system("cls");
				main();
				break;
			}
			else if(tolower(Anhängen) == 'n')
			{
				Datei = fopen("c:\\DataBase.dBase","w"); //"w" für write
				fwrite(&Kundendaten,sizeof(Kundendaten),1,Datei);
				//Datei schließen
				fclose(Datei);
				//zum Hauptmenü zurückkehren
				system("cls");
				main();
				break;
			}
			
		}
		else if (tolower(Speichern) == 'n')
		{
		//zum Hauptmenü zurückkehren
		system("cls");
		main();
		break;
		}
	}
	else
	{
		cout << "\n Falsche eingabe \n";
	} 
	}
}

void DatenAendern(void)
{
	//Kundendaten Deklarieren
	Kundendaten Kundendaten;
		//zum Hauptmenü zurückkehren
		system("cls");
		main();
}

void DatenEinsehen(void)
{
	//Kundendaten Deklarieren
	Kundendaten Kundendaten;
	Datei = fopen("c:\\DataBase.dBase","r"); //"r" für read
	fread(&Kundendaten,sizeof(Kundendaten),1,Datei);
	
	cout << "\nName:" << Kundendaten.Kunde << " | Alter:" << Kundendaten.Alter << " | Wohnort:" << Kundendaten.Wohnort << "\n";
	
		//zum Hauptmenü zurückkehren
	cout << "\n";	
	main();
}

void DatenLoeschen(void)
{
	//Kundendaten Deklarieren
	Kundendaten Kundendaten;

	remove("c:\\DataBase.dBase");
		//zum Hauptmenü zurückkehren
		system("cls");
		main();
}
 
aber wie kann ich des so machen wie ganz oben beschreiben? damit der die bentuert mit 1 2 3 4 .... usw ordnet und ich beim löschen nur noch die num angebe wo ich rauslöschen will?
 
Eine vortlaufende Nummer ist einfach anzulegen:

Füg in int main() die Variable ´
Code:
int counter=0;
hinzu.
Den Funktionsaufruf
Code:
NeueDaten();
änderst du zu
Code:
NeueDaten(counter);
und
Code:
void NeueDaten(void);
zu
void NeueDaten(int count)
dann halt noch die
Code:
Kundendaten.Kundennummer = count;
setzen.

Um Daten anhand der Kundennummer zu löschen brauchst du glaub ich eine verkettete oder doppeltverkette Liste, und da ich das nicht so gut kann sollte dir da jemand anderes weiterhelfen :-)


MfG Radhad
 
Um Daten anhand der Kundennummer zu löschen brauchst du glaub ich eine verkettete oder doppeltverkette Liste, und da ich das nicht so gut kann sollte dir da jemand anderes weiterhelfen
Nicht unbedingt, wäre aber eleganter und flexibler.
Zum Thema verkettete Listen gabs hier im Forum schon vieles, einfach mal die Suche verweden.

Gruß Homer
 
ok das klappt, aber auch wenn ich mehrere daten eingebe is die kundennummer immer 0 obwohl sie erst bei 1 Anfangen soll
 
Zuletzt bearbeitet:
Zurück