Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

16.05.2007, 21:40

Datenbankabfrage funzt nicht richtig....

Ich hab mal hier so ein kleines prog geschrieben...

Kurze Beschreibung zum prog:

Am Anfang hat man die Wahl zwischen der Option (R)egistrieren und (L)ogin. Da man noch nicht registriert ist, drückt man die Taste 'r' um in den Menüpunkt (R)egistrieren zu kommen. Dort füllt man 3 Angaben (Name, Passwort, Passwort wiederholen) aus. Die Angaben werden in einer .txt Datei gespeichert(C:\\user.txt. Nun hat man die Wahl zwischen (B)eenden und (L)ogin. Wir drücken die Taste 'l' um das Programm fortzusetzten. Nun werden zwei Angaben abgefragt: Name und Passwort. Man gibt nun den Namen und das Passwort ein, welches man bei der Registrierung eingegeben hat. Man gelangt in den letzten Menüpunkt, falls das Passwort mit dem Passwort bei der Registrierung übereinstimmt. Weiter geht das Prog noch nicht.

Nun mein Problem:
Falls sich zwei user registrieren, klappt die ganze Passwortkontrolle nicht mehr. Es erscheint immer : Falsches Passwort! Programm wird beendet! (Es wird die if-Schleife ausgeführt, welche die Bedingung enthält: Falls Passwort nicht gleich dem Passwort was gespeichert wurde)


Hier ist der Quellcode:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
//C++ Alexander Stepanov


#include <iostream>
#include <string>
#include <windows.h>
#include <fstream>


int Login();
void Taschenrechner();

using namespace std;

int main()
{
    ofstream dat_aus;
    ifstream dat_ein;

    
    string name;
    string nameneu;
    string passwort;
    string passwortneu;
    string passwortwdh;
    string dateiname = ("C:\\user.txt");
    string falsch ="Falsches Passwort! Programm wird beendet!";
    char chZeichen;
    char chzeich;

    
    dat_ein.open(dateiname.c_str(), ios_base::out | ios_base::app);

    dat_aus.open(dateiname.c_str(),ios_base::out | ios_base::app);
     
    cout << "(R)egistrieren / (L)ogin"<<endl; 
    cin >> chZeichen;
    
    if(chZeichen == 'r')
    {
    cout << " - Bitte geben Sie ihren Benutzernamen ein: ";
    cin >> nameneu;
    
    cout << endl << " - Bitte geben Sie ihr Passwort ein: ";
    cin >> passwortneu;
    
    cout << endl << " - Bitte Passwort wiederholen: ";
    cin >> passwortwdh;
    
    if( passwortwdh != passwortneu)
    {
    cout << "Die Passworter stimmen nicht uberein! Bitte starten Sie das Programm neu! " << endl;
    
    Sleep(3000);
    
    return -1;
    }
    }

    else
    {
    
    cout << " Bitte warten! Neue Benutzereinstellungen werden gespeichert!" << endl;

    dat_aus << nameneu << endl;
    dat_aus << passwortneu << endl;
    dat_aus.close();
    
    Sleep(1000);
    
    }
    
    cout << "(L)ogin / (B)eenden" << endl;
    cin >> chzeich;
    
    if(chzeich == 'l')
    {
    Login();
    }
    else if(chzeich == 'b')
    {
    Sleep (2000);
    
    return -1;
    }
    
    
    if(chZeichen == 'l')
    {
    Login();
    }
    
    
    dat_ein.close();
    
    
    
    return 0;
    

}

int Login()
{
    string name;
    string passwort;
    string passwortneu;
    string nameneu;
    string dateiname =("user.txt");

    ifstream dat_ein;
    ofstream dat_aus;
    
    dat_ein.open(dateiname.c_str(), ios_base::out | ios_base::app);
    
    cout << "Benutzername: " << endl;
    cin >> name;
    
    cout << " Passwort: " << endl;
    cin >> passwort;
    
    dat_ein >> nameneu >> passwortneu;
    
    if(passwortneu != passwort)
    {
        cout << "Falsches Passwort! Programm wird sofort beendet!" << endl;
        
        Sleep(2000);
        
        
    }
    
    else
    {
        cout << "Bitte Warten!" << endl;
        cout << "Hier endet die Betaversion des Programms ASTA!" <<endl;
        
        Sleep(3000);
        
            
    }
    
    return 0;

}








Könnt ihr mir helfen???

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

16.05.2007, 22:15

Sagt dir debuggen was? Wenn nicht einfach nochmal nachfragen, wenn ja einfach mal machen :)

Ansonsten wie sieht denn der Inhalt der txt aus, wenn die 2 User reingeschrieben wurden?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Dofter

Treue Seele

Beiträge: 159

Wohnort: im wunderbaren EBERMANNSTADT

Beruf: Schüler^^

  • Private Nachricht senden

3

16.05.2007, 23:25

kann ja gar nicht gehn. du speicherst nämlich nie irgenetwas ab.
Schau dir diese Zeilen nochmal an (ich hab mal Tabulaturen eingebaut, dann sieht mans besser

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
if(chZeichen == 'r')
    {
        cout << " - Bitte geben Sie ihren Benutzernamen ein: ";
        cin >> nameneu;
       
        cout << endl << " - Bitte geben Sie ihr Passwort ein: ";
        cin >> passwortneu;
       
        cout << endl << " - Bitte Passwort wiederholen: ";
        cin >> passwortwdh;
       
        if( passwortwdh != passwortneu)
        {
            cout << "Die Passworter stimmen nicht uberein! Bitte starten Sie das Programm neu! " << endl;
           
            Sleep(3000);
           
            return -1;
        }
    }

    else
    {
   
        cout << " Bitte warten! Neue Benutzereinstellungen werden gespeichert!" << endl;

        dat_aus << nameneu << endl;
        dat_aus << passwortneu << endl;
        dat_aus.close();
       
        Sleep(1000);
   
    }


gespeichert wird wenn der Benutzer l eingibt also Login.
Du musst die else Bedingung hinter die return -1} schreiben also so dann

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if( passwortwdh != passwortneu)
        {
            cout << "Die Passworter stimmen nicht uberein! Bitte starten Sie das Programm neu! " << endl;
           
            Sleep(3000);
           
            return -1;
        }

        else
        {
       
            cout << " Bitte warten! Neue Benutzereinstellungen werden gespeichert!" << endl;

            dat_aus << nameneu << endl;
            dat_aus << passwortneu << endl;
            dat_aus.close();
           
            Sleep(1000);
       
        }


ich würd dir generell raten Zeileneinschübe zu machen. dann sieht man sowas sofort.

Gehn tuts aber immer noch nicht, denn beim Login hast du einen flaschen Pfad angegeben (Leichtsinnsfehler :) ): in der Login Methode musst du natürlich

C-/C++-Quelltext

1
string dateiname =("C:\\user.txt");
anstatt von

C-/C++-Quelltext

1
string dateiname =("user.txt");
schreiben.


Jetzt kann sich aber immer nur der erstregistrierte benutzer einloggen, da du in der Login-Methode immer nur die ersten 2 Strings anschaust. Du kannst z.B. eine while Schleife einbaun die solange immer zwei Zeilen einliest, also Name und Passwort, bis das Ende der Datei erreicht is. Gibt gleub ich so ne Funktion die EOF zurückgibt wenns ende der satei erreicht ist, ich hab heut aber keine Lust mehr die nachzuschlagen. Wennst nix findes schau ich morgen mal.

Gute Nacht
Dofter
"Wo kämen wir hin, wenn alle sagten, wo kämen wir hin, und keiner ginge,
um zu sehen, wohin wir kämen, wenn wir gingen"

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

4

16.05.2007, 23:44

C-/C++-Quelltext

1
2
3
    dat_ein.open(dateiname.c_str(), ios_base::out | ios_base::app);

    dat_aus.open(dateiname.c_str(),ios_base::out | ios_base::app); 


Wenn du einmal lesen und einmal schreiben willst dann solltest du nicht zwei mal ios_base::out verwenden ;)

5

17.05.2007, 11:03

LOL jetzt geht das Programm etwas mehr als früher :P Danke an Alle!!
Aber es hängt immernoch am 2 Benutzter :-(


@grek40

Wie soll ich dann des anders machen?

@Dofter

Und wie sieht so ein While-Schleife aus, die dann alle Namen und Passwörter durchgeht?

@Nox

Der Inhalt der .txt Datei:

Quellcode

1
2
3
4
5
6
7
8
9
10
Name1
Passwort1
Name2
Passwort2
Name3
Passwort3
.
.
.
usw.

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

6

17.05.2007, 11:35

zum auslesen der Daten:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    std::string name, username;
    std::string password, userpassword;
    std::string dateiname=L"C:\\user.txt";

    std::ifstream datei(dateiname.c_str(), std::ios::in);

    std::cout << "Nutzername eingeben: ";
    std::cin >> username;
    std::cout << "Passwort eingeben: ";
    std::cin >> userpassword;

    do {
        std::getline(datei, name);
        std::getline(datei, password);
    } while ( (username.compare(name)!=0) && ( !datei.eof() ) );
    if (username.compare(name)!=0)
        std::cout << "Nicht registrierter Nutzer";
    else if (userpassword.compare(password)!=0)
        std::cout << "Falsches Passwort";
    else
    {
        // Passwort und Nutzername sind richtig

    }


So in der Art müsste es gehen - keine Garantie auf Fehlerfreiheit.

Dofter

Treue Seele

Beiträge: 159

Wohnort: im wunderbaren EBERMANNSTADT

Beruf: Schüler^^

  • Private Nachricht senden

7

17.05.2007, 12:06

Schleife siehe Grek40.
ich hätt nur ne while anstatt ner do while Schlefe genommen. kann ja sein, dass die Datei von Anfang an leer ist.
"Wo kämen wir hin, wenn alle sagten, wo kämen wir hin, und keiner ginge,
um zu sehen, wohin wir kämen, wenn wir gingen"

8

17.05.2007, 17:41

lol
so weit so gut..

1. was heisst das 'L' bei std::string dateiname=L"C:\\user.txt";

2. was heisst std:: vor den ganzen cout und cin befehlen?

3. was heisst std::getline();

4. was heisst username.compare() ?


Mein Ziel ist immernoch lernen.. das Prog zum laufen zum bringen ist nicht so wichtig :P

9

17.05.2007, 17:52

wie wärs wenn du dir die STL mal anguckst bevor du sie benutzt?
Und wissen was UNICODE ist solltest du auch, dann erklärt sich das auch mit diesem komischen 'L'
Das Böse ist des Menschensbeste Kraft - Friedrich Nietzsche

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

17.05.2007, 19:14

Zitat von »"DEATH"«

lol
so weit so gut..

1. was heisst das 'L' bei std::string dateiname=L"C:\\user.txt";

2. was heisst std:: vor den ganzen cout und cin befehlen?

3. was heisst std::getline();

4. was heisst username.compare() ?


Mein Ziel ist immernoch lernen.. das Prog zum laufen zum bringen ist nicht so wichtig :P


1. Das L vor dem string gibt an das der string aus widechars besteht (unicode).
2. Die Objekte cout und cin befinden sich im namespace std, deshalb muss dieser vorher angegeben werden, da der Compiler sonst keines dieser Objekte findet.
3. getline ist eine Funktion die aus einem istream objekt eine Zeile liest und in einem string ablegt.
4. compare ist eine Methode des basic_string<> Templates. Sie vergleicht zwei String Objekte.
@D13_Dreinig

Werbeanzeige