Datei einlesen ergibt nur Zufallszahlen

hallo …schon wieder :smiley: !

folgendes Problem. ich habe ein Programm geschrieben, was ein Art „Bank“ sein soll, d.h. der User trägt sich ein gibt ein paar daten an (Anrede, vor- und nachname, Kontonummer, PIN) diese Daten werden dann in eine datei geschrieben die genauso heißt wie der User mit nachnamen, also einfach „müller“ sie hat also keine dateiendung so will ich verhindern das selbst unerfahrene nutzer ihr konto zu leicht manipulieren können ;D.

das schreiben Funktionier wunderbar, aber beim auslesen haperts noch gewaltig.

in der Datei die ausgegeben wird steh folgendes
note: die erklärungen dahinter stehen natürlich nicht in der datei die habe ich jetzt nachträglich hinzugefügt um zu verdeutlichen was später zu welcher variable werden soll

Herr //char[5] Anrede
Hans //char[20] vname
Müller //char[20] nname
123456123456 //long long echte\_kontonummer
1234 //int echte\_pin
50 //int Guthaben

diese methode fragt also nun den nachnamen (char[20] nname) ab und sucht nach einer Datei die so heißt.
dann öffnet sie die datei und geht sie zeile für zeile durch. wenn sie an einer bestimmten zeile angelangt is, ließt sie die zeile mit getline() aus und soll sie dann entweder über strcpy(), bei Anrede vname und nname oder über atoi bzw atol in die richitge variable
bringen.
allerdings ist die ausgabe der konsole hier mehr als merkwürdig.

Bild: http://img824.imageshack.us/img824/9559/unbenanntzipz.png

hier ist die methode

void Kunde::laden(){
 string inhalt\_anrede, inhalt\_vname, inhalt\_nname, inhalt\_knummer, inhalt\_pin, inhalt\_guthaben;
 int anrede, vorname, nachname, knummer, pin, guthaben;

 system("cls");
 cout \> nname;

 user1.open(nname, ios::in);

 if(!user1.is\_open()){
 cout 

und hier die klasse



    
    class Kunde{
    private:
     char Anrede[5];
     char vname[20];
     char nname[20];
     long long echte\_kontonummer;
     int echte\_pin;
     int Guthaben;
     fstream user;
     ifstream user1;
    public:
     void einpflegen();
     void login();
     void einzahlen();
     void speichern();
     void laden();
     void zeige\_guthaben();
    };




hoffe ihr könnt mir weiterhelfen, ich drehe hier solangsam echt am rad.

Hallo ,

Dein Beispiel

Herr //char[5] Anrede
Hans //char[20] vname
Müller //char[20] nname
123456123456 //long long echte_kontonummer
1234 //int echte_pin
50 //int Guthaben

gehen wir das mal in pseudocode durch :

anrede = getLine()
vorname = getLine()
nachname = getLine()
ktn = atoi(getLine())
pin = atoi(getLine())
haben = atof(getLine())

fertig .

um das noch ein bissel logischer zu halten, könnte man sagen
1,2,3 nix machen
4,5 in integer wandeln
6 in double wandeln

So nun was du machst :

system(„cls“);
cout > nname;

datei wird geöffnet

user1.open(nname, ios::in);

if(!user1.is_open()){
cout

Ich glaub du willst eigentlich sowas machen

int counter = 0;
while (!user1.eof()) {
getline(user1, inhalt);
++counter;
switch(counter)
{
case 1: strcpy(Anrede,inhalt.c_str());
break;
case 2: strcpy(vname,inhalt.c_str());
break;
case 3: strcpy(nname,inhalt.c_str());
break;
case 4: echte_kontonummer=atol(inhalt.c_str());
break;
case 5: echte_pin=atoi(inhalt.c_str());
break;
case 6: Guthaben=atoi(inhalt.c_str());
break;
default: cout

was aber bei so einem einfachen file etwas umständlich ist :

einfachst wäre :

getline(user1, inhalt)
strcpy(Anrede,inhalt.c_str());
getline(user1, inhalt)
strcpy(vname,inhalt.c_str());
getline(user1, inhalt)
strcpy(nname,inhalt.c_str());
getline(user1, inhalt)
echte_kontonummer=atol(inhalt.c_str());
getline(user1, inhalt)
echte_pin=atoi(inhalt.c_str());
getline(user1, inhalt)
Guthaben=atoi(inhalt.c_str());

ich sehe was du meinst und werde das zwecks einfacheit einbauen, trotzdem würde es mich schon einmal interessieren warum ist mir diese zufällige ausgaben bastelt.

ich hatte etwas herumgeguckt und gesucht wie man eine datei, zeile für zeile einlesen kann, da dies das erste mal ist das ich mit einer externen Datei arbeite.
die sache mit der for schleife habe ich bei vielen bsp gesehen und es wirkte auf mich recht logisch desshalb habe ich das so gewählt. im nachhinein ist der fehler schon offensichtlich.

letztendlich will ich, das alle eigenschaften des users, + seinem aktuellem Guthaben in eine Datei gespeichert werden und bei späterem gebrauch der software wieder verwendet werden können.

bei etwas muss ich dich jedoch korrigieren.

1,2,3 nix machen
4,5 in integer wandeln
6 in double wandeln

stimmt nicht ganz. getline() lädt, in sofern ich das gelesen habe, einen string. 1, 2, 3 sind aber chars und bereits im programm verwendet. daraus folgt, das die strings jeweil in das richtige char konvertiert werden muss.

4 wird eine 12 stellige zahl und damit, laut foren, zum korrekten verwenden ein long long

5 ist ein PIN also bei mir zumindest eine 4 stellige zahl. int würde hier denke ich zutreffen.

bei 6 gebe ich dir auch recht da wäre ein double wirklich sinnvoller.

Moin moin ,

bei etwas muss ich dich jedoch korrigieren.

1,2,3 nix machen
4,5 in integer wandeln
6 in double wandeln

stimmt nicht ganz. getline() lädt, in sofern ich das gelesen
habe, einen string. 1, 2, 3 sind aber chars und bereits im

nix machen , weil bleiben zeichen . Welches Speicherformat du dann wählst ist deine sache . Ich arbeite mit String Klassen :smile:

programm verwendet. daraus folgt, das die strings jeweil in
das richtige char konvertiert werden muss.

4 wird eine 12 stellige zahl und damit, laut foren, zum
korrekten verwenden ein long long

Wie du halt möchtest

5 ist ein PIN also bei mir zumindest eine 4 stellige zahl. int
würde hier denke ich zutreffen.

Naja , wenn führende Nullen ignoriert werden bei deiner PIN , dann schon, ich würde es aber als Zeichen organisieren.

bei 6 gebe ich dir auch recht da wäre ein double wirklich
sinnvoller.

War ja auch alles nur ein Beispiel um Dir zu zeigen, das man bei so einem simplen Datenaufbau , kein FOR braucht . Und um eine Datei zu durchsuchen reicht wiederum genau ein FOR .

Einfach mal sachen per Stifft und Zettel Zeile für Zeile nach machen. Da sieht man am besten was wo Fehler sind.

Viel glück .

danke für den tipp ;D

Moin moin,

ich sehe was du meinst und werde das zwecks einfacheit
einbauen, trotzdem würde es mich schon einmal interessieren
warum ist mir diese zufällige ausgaben bastelt.

Du defenierst die Variablen
void Kunde::laden(){
string inhalt_anrede, inhalt_vname, inhalt_nname, inhalt_knummer, inhalt_pin, inhalt_guthaben;
int anrede, vorname, nachname, knummer, pin, guthaben;

aber diese haben keine Werte bekommen.

Ein String wird z.b. normalerweise mit einem String Ende Zeichen abgeschlossen. Gibts du dem Ding keinen Wert , wird bei Ausgabe das ausgegeben was es findet . Dann kann alles mögliche sein.

Deswegen wird nach der Defenition die Variable Initialisiert , bei int wohl mit wert 0 bei Zeichenketten mit Leer .

Ansonsten tritt dein Problem auf und es wird irgendwas was vorher an der Speicherstelle war ausgegeben und das ist eben nicht 0 oder nichts.