PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Adressbuch - Brauche hilfe - Quellcode ist im thread dabei (zum lernen)



eRaSeR!
08.09.2009, 22:58
Hey ich hab die Aufgabe bekommen ein Adressbuch Programm zu machen.

Es soll Infos über die Person(en) abfragen. Diese können auch gelöscht oder geändert werden. Außerdem soll man die Einträge speichern und laden können. Hier ist das Problem. Speichern funktioniert. Es erstellt eine Textdatei und schreibt die Daten untereinander. Beim laden hab ich jedoch probleme mit dem übergeben der Werte aus der Funktion als Pointer.
Außerdem sollte ich es so machen, dass man sich selber einen Dateinamen aussuchen kann. Das funktioniert auch nicht ganz, hab deshalb als Name "test.txt" festgelegt.
Wer sich auskennt, Zeit hat und mir helfen will: Die "laden" Funktion ist die die verbessert werden muss. Die speichern Funktion ist auch direkt darunter.

Der Quellcode:

#include <cstdlib>
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
struct eintrag
{
string Name;
string Vorname;
string Adresse;
string Ort;
string PLZ;
string Tel;
string Email;
};

void speichern(string dateiname,eintrag *liste,int zaehler);
void laden(eintrag *liste);
void eingeben();
void aendern(int nr);
void loeschen(int nr);
void eintraganzeigen(int nr);
void anzeigen();
void auswahl();

eintrag liste[100];
int zaehler=0;

int main(int argc, char *argv[])
{
auswahl();

return EXIT_SUCCESS;
}
void auswahl()
{
int a=1;
while(a==1)
{
system("cls");
cout<<" 1 - Neuer Eintrag\n 2 - Eintrag anzeigen\n 3 - Speichern\n 4 - Laden";
cout<<"\n\nWaehlen Sie aus: ";
int eingabe;
cin>>eingabe;

switch (eingabe)
{
case 1:
eingeben();
break;
case 2:
anzeigen();
break;
case 3:
cout<<"Lege den Dateinamen fest: ";
char dateiname[50];
cin>>dateiname;
speichern(dateiname,liste,zaehler);
break;
case 4:
laden(liste);
break;
default:
a=0;
}
}
}
void laden(eintrag *liste)
{
int i=0,a=0;
string zeile;
ifstream datei ("test.txt");
while (! datei.eof())
{
getline (datei,zeile);

switch(i)
{
case 0:
liste[a].Name=zeile;
break;
case 1:
liste[a].Vorname=zeile;
break;
case 2:
liste[a].Adresse=zeile;
break;
case 3:
liste[a].Ort=zeile;
break;
case 4:
liste[a].PLZ=zeile;
break;
case 5:
liste[a].Tel=zeile;
break;
case 6:
liste[a].Email=zeile;
break;
}
i++;
if(i==7)
{
i=0;
a++;
}
}
}
void speichern(string dateiname,eintrag liste[100],int zaehler)
{
ofstream datei;
datei.open ("test.txt");
for(int a=0;a<zaehler;a++)
{
datei<<liste[a].Name<<endl;
datei<<liste[a].Vorname<<endl;
datei<<liste[a].Adresse<<endl;
datei<<liste[a].Ort<<endl;
datei<<liste[a].PLZ<<endl;
datei<<liste[a].Tel<<endl;
datei<<liste[a].Email<<endl;
}
datei.close();
}
void eingeben()
{
system("cls");
eintrag Adr;

cout<<"Name: ";
cin>>Adr.Name;
cout<<"Vornamen: ";
cin>>Adr.Vorname;
cout<<"Adresse: ";
cin>>Adr.Adresse;
cout<<"Ort: ";
cin>>Adr.Ort;
cout<<"PLZ: ";
cin>>Adr.PLZ;
cout<<"Tel: ";
cin>>Adr.Tel;
cout<<"Email: ";
cin>>Adr.Email;
liste[zaehler]=Adr;
zaehler++;
}
void aendern(int nr)
{
system("cls");
cout<<"Name: "<<liste[nr].Name<<endl;
cout<<"Neuer Name: ";
cin>>liste[nr].Name;
cout<<"Vorname: "<<liste[nr].Vorname<<endl;
cout<<"Neuer Vorname: ";
cin>>liste[nr].Vorname;
cout<<"Adresse: "<<liste[nr].Adresse<<endl;
cout<<"Neue Adresse: ";
cin>>liste[nr].Adresse;
cout<<"Ort: "<<liste[nr].Ort<<endl;
cout<<"Neuer Ort: ";
cin>>liste[nr].Ort;
cout<<"PLZ: "<<liste[nr].PLZ<<endl;
cout<<"Neue PLZ: ";
cin>>liste[nr].PLZ;
cout<<"Tel: "<<liste[nr].Tel<<endl;
cout<<"Neue Tel: ";
cin>>liste[nr].Tel;
cout<<"Email: "<<liste[nr].Email<<endl;
cout<<"Neue Email: ";
cin>>liste[nr].Email;
cout<<"\n\n Eintrag geaendert\n\n";
system("PAUSE");
}
void loeschen(int nr)
{
while(nr<zaehler)
{
liste[nr].Name=liste[nr+1].Name;
liste[nr].Vorname=liste[nr+1].Vorname;
liste[nr].Adresse=liste[nr+1].Adresse;
liste[nr].Ort=liste[nr+1].Ort;
liste[nr].PLZ=liste[nr+1].PLZ;
liste[nr].Tel=liste[nr+1].Tel;
liste[nr].Email=liste[nr+1].Email;
nr++;
}
zaehler--;
}
void eintraganzeigen(int nr)
{
int a=1;
while(a==1)
{
system("cls");
cout<<"Name: "<<liste[nr].Name<<endl;
cout<<"Vorname: "<<liste[nr].Vorname<<endl;
cout<<"Adresse: "<<liste[nr].Adresse<<endl;
cout<<"Ort: "<<liste[nr].Ort<<endl;
cout<<"PLZ: "<<liste[nr].PLZ<<endl;
cout<<"Tel: "<<liste[nr].Tel<<endl;
cout<<"Email: "<<liste[nr].Email<<endl;

cout<<"\n\n1 - Aendern\n";
cout<<"2 - Loeschen\n";
cout<<"3 - Zurueck\n";
int eingabe;
cin>>eingabe;

switch(eingabe)
{
case 1:
aendern(nr);
break;
case 2:
loeschen(nr);
a=0;
break;
default:
a=0;
}
}
}

void anzeigen()
{
int a=1;
while(a==1)
{
system("cls");

eintrag Adr;
for(int b=0;b<zaehler;b++)
{
Adr=liste[b];
cout<<b+1<<" - "<<Adr.Name<<","<<Adr.Vorname<<endl;
}
cout<<endl<<endl<<zaehler+1<<" - Zurueck"<<endl;
int eingabe;
cout<<"Waehlen Sie aus(1-"<<zaehler+1<<")";
cin>>eingabe;
if(eingabe>=zaehler+1||eingabe<1)
{
a=0;
}
else
{
eintraganzeigen(eingabe-1);
}
}
}



Ty schonmal
mfg, eRaSeR

inout
09.09.2009, 00:15
Hi,

Ich weiss nicht, ob es dir freigestellt ist, wie du diese Aufgabe bearbeitest, aber wenn dem so ist, dann nimm' doch einfach einen vector<eintrag> liste und arbeite mit typisierten Dateien, dann bleibt nur noch 10% von deinem bisherigen Code übrig ;)

MfG

eRaSeR!
09.09.2009, 00:21
könntest das pls etwas erklären oder mir ein beispiel geben? noch nie was von vector gehört (außer in mathe^^)

blackberry
09.09.2009, 00:25
#include <vector>

Vector = dynamischer Array

eRaSeR!
09.09.2009, 00:43
^^ok ty. ich gucks mir ma an aber pls back2topic (meine laden funktion. die werte richtig übergeben oder was auch immer da nicht geht)

ein cout innerhalb der funktion laden mit liste[0].blablaaa geht übrigends
die datei test.txt hat bei mir daten von 2 "personen"

inout
09.09.2009, 00:57
Also um den Dateinamen noch zu übergeben, brauchst du lediglich einen weiteren string-Parameter, den du dann nur bei der Übergabe an den ifstream-Konstruktor wieder zu einem C-String casten musst. Dafür gibt es die Methode c_str().

Das while(!datei.eof()) kannst du dir auch sparen und stattdessen einfach das getline(datei, zeile) in den Schleifenkopf schreiben.


Aber wie gesagt, für sowas eignen sich typisierte Dateien viel besser. Dann müsstest du allerdings auf die strings im struct verzichten...

eRaSeR!
09.09.2009, 01:02
ok ty. genau des problem hatte ich mit dem umwandeln oder was auch immer. der hat des nich akzeptiert. ich teste des dann aber erst morgen^^ grad TVen, bier, chillen...^^