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

21

16.07.2009, 21:36

koschka, du könntest genausogut den hier: >> benutzen. und Flo hat die Zahl binär gespeichert, und nicht als Zeichenkette, von daher war C-- goldrichtig ;)

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

22

17.07.2009, 09:39

Ja, ich habe ja auch nicht gesagt, dass es nicht funktioniert, aber der Code oben ist wesentlich erweiterbarer (und meiner Meinung auch schöner, bis auf das atoi). Wenn jemand in diesen Thread irgendwann einmal hineinschaut und eine Lösung braucht die eben nicht nur genau eine Zahl berücksichtigt, dann ist der Code oben die richtige Lösung. Für den speziellen Fall von Flo recht aber der Cast, ja.

Im übrigen:

C-/C++-Quelltext

1
2
  // convert the buffer into a number

  a = atoi (buffer ); 


Das Beispiel ist rauskopiert aus einer Referenz, bis auf das atoi(..)

FLO2

Treue Seele

  • »FLO2« ist der Autor dieses Themas

Beiträge: 221

Beruf: Schüler

  • Private Nachricht senden

23

18.07.2009, 18:01

Hi
Ich hab jetzt die Version von C-- erweitert, nur das Programm macht nicht was es soll.
Beim ersten Start fragt es den Benutzer nach einem Passwort ab.
Danach kann er sein Passwort eingeben und Daten lesen.
Doch wenn ich mein Passwort richtig eingebe gibt er mir trotzdem die Meldung wegen falschem Passwort aus.
main-Funktion

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
int main ()
{
    int Zaehler = 0;
    int RichtigerBuchstabe = 0;
    char Eingabe[500];

    cout << "FLO BLOG\n\n" << endl;
    
    ifstream input ("Daten3.dtn", ios::binary);

    if (!input.is_open())
    {
        FragePasswortAb ();
        input.open("Daten3.dtn", ios::binary);

        if (!input.is_open())
            cout << "Fehler beim oeffnen der Datei(en)" << endl;
    }

    int Passwort[500];
    cout << "Passwort: ";
    cin.clear();
    cin.ignore();
    cin.get (Eingabe, 499);
    ifstream Input ("Daten3.dtn", ios::binary);
    Input.read((char *) &Passwort, sizeof (Passwort));
    Input.close ();

    while (Zaehler <= 499)
    {
        if (Eingabe[Zaehler] == Passwort[Zaehler])
        {
            RichtigerBuchstabe++;
            Zaehler++;
        }
        else
        {
            cout << "ERROR1: Falsches Passwort. Zugriff verweigert!" << endl;
            Sleep(500);
            return 3;
        }
    }
    if (RichtigerBuchstabe == 499)
    {
        ZeigeDaten();
    } 

    cin.clear ();
    cin.ignore ();
    cin.get ();
    return 0;
}


FragePasswortAb

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int FragePasswortAb ()
{
    char Passwort[500];

    cout << "Ihr gewuenschtes Passwort(max. 500 Zeichen): ";
    cin.get (Passwort, 499);

    ofstream Output ("Daten3.dtn", ios::binary);

    Output.write ((char *) &Passwort, sizeof (Passwort));
    Output.close ();
    
    return Passwort[500];
}


Ich suche den Fehler schon länger komme aber nicht darauf.

Danke im Voraus :D
Pi mal Daumen = 18.84955592

C--

Alter Hase

Beiträge: 465

Beruf: Schüler

  • Private Nachricht senden

24

18.07.2009, 21:59

Kleine Frage zu FragePasswortAb(): Warum ist der Rückgabewert ein int und du gibst ein char-Array zurück, was dann doch nicht verwendet wird??

Edit:

Noch ne Frage, warum deklarierst du in main() Passwort als int- und nicht als char-Array?

Edit2:

Eingabe wird ja nirgends ein Wert zugewiesen, daher ist der Wert von Eingabe immer uninitialisiert, es stehen zufällige Werte drin, die vorher im Speicher standen.

Edit3: zu Edit2: Tschuldigung, hab cin.get() übersehen.

Edit4: Ich glaube der Fehler ist das int-Array Passwort.
Ich spreche: C/C++, C++/CLI C#, VBA, VB.NET, Delphi, (HTML, Javascript(bisschen))
------------------------------------------------------------
Hier steht eventuell schon in ein paar Monaten der Link zu meiner Homepage!

return 0;
;)

25

18.07.2009, 22:40

Zitat von »"C--"«

Kleine Frage zu FragePasswortAb(): Warum ist der Rückgabewert ein int und du gibst ein char-Array zurück, was dann doch nicht verwendet wird??

um genau zu sein, er gibt keinen zeiger auf ein lokales char-array zurück (was aber auch absoluter mist wäre), sondern das 500. Element desselben (worin ich jetz aber auch keinen sinn sehe Oo)

Nebulak

Frischling

Beiträge: 9

Wohnort: Karlsruhe

Beruf: Brennschneider

  • Private Nachricht senden

26

19.07.2009, 00:18

wenn du den code so wie hier machst geht es

int Passwort[500] solltest du in char ändern.

ich weiss jetzt net was cin.ignore eigentlich macht aba beim debuggen hab ich gefunden das es den ersten char von cin.get(Eingabe, 499) nicht mit liest

in der while schleife musst du stat <= nur < machen

und gucken ob eingabe und password den string-zu-ende zeichen haben '\0'

mfg nebulak

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
int main ()
{
    int Zaehler = 0;
    int RichtigerBuchstabe = 0;
    char Eingabe[500];

    cout << "FLO BLOG\n\n" << endl;
   
    ifstream input ("Daten3.dtn", ios::binary);

    if (!input.is_open())
    {
        FragePasswortAb ();
        input.open("Daten3.dtn", ios::binary);

        if (!input.is_open())
            cout << "Fehler beim oeffnen der Datei(en)" << endl;
    }

    char Passwort[500];               //mach hier ein char array

    cout << "Passwort: ";
    cin.clear();
    //cin.ignore();                        //ignore ingoriert das erste char den du bei Eingabe eingibst, also muss das auch weg

    cin.get (Eingabe, 499);
    ifstream Input ("Daten3.dtn", ios::binary);
    Input.read((char *) &Passwort, sizeof (Passwort));
    Input.close ();

    while (Zaehler < 499)  // stat <= kommt hier hin <

    {
           if (Eingabe[Zaehler] == Passwort[Zaehler])
          {
                       // hier musst du gucken ob die strings auch zu ende sind!

                       if((Eingabe[Zaehler] == '\0') && (Passwort[Zaehler] == '\0'))
                  {
                      RichtigerBuchstabe = 499;
                      Zaehler = 499;
                  }
                  else
                  {
                      RichtigerBuchstabe++;
                     Zaehler++;
                  }
        }
        else
        {
            cout << "ERROR1: Falsches Passwort. Zugriff verweigert!" << endl;
            Sleep(500);
            return 3;
        }
    }
    if (RichtigerBuchstabe == 499)
    {
        ZeigeDaten();
    }

    cin.clear ();
    cin.ignore ();
    cin.get ();
    return 0;
}
mfg Nebulak

C--

Alter Hase

Beiträge: 465

Beruf: Schüler

  • Private Nachricht senden

27

19.07.2009, 00:31

Zitat von »"PCShadow"«

Zitat von »"C--"«

Kleine Frage zu FragePasswortAb(): Warum ist der Rückgabewert ein int und du gibst ein char-Array zurück, was dann doch nicht verwendet wird??

um genau zu sein, er gibt keinen zeiger auf ein lokales char-array zurück (was aber auch absoluter mist wäre), sondern das 500. Element desselben (worin ich jetz aber auch keinen sinn sehe Oo)


PCShadow, ich glaub sogar, dass das Element[ 500 ] gar nicht existiert, da er ja char Passwort[500] deklariert hat und wenn ich mich nicht irre, ja von Index 0 bis 499 gezählt wird.

Bei mir war grad der Router abgestürzt, daher ist mir Nebulak zuvorgekommen mit der Lösung. :roll:
Ich spreche: C/C++, C++/CLI C#, VBA, VB.NET, Delphi, (HTML, Javascript(bisschen))
------------------------------------------------------------
Hier steht eventuell schon in ein paar Monaten der Link zu meiner Homepage!

return 0;
;)

FLO2

Treue Seele

  • »FLO2« ist der Autor dieses Themas

Beiträge: 221

Beruf: Schüler

  • Private Nachricht senden

28

19.07.2009, 09:35

Hi
Danke für die vielen Antworten. :)
Ich habe die main-Funktion von Nebulak übernommen,
die FragePasswortAb Funktion in einen char gemacht und in der main()
das int Passwort[500] in ein char Passwort[500] geändert.
In der FragePasswortAb Funktion habe ich nun return Passwort geschrieben. Jetzt bekomme ich folgenden Fehler:

Quellcode

1
1>.\TestListing8_10i.cpp(85) : error C2440: 'return': 'char [500]' kann nicht in 'char' konvertiert werden

Ich weiß ungefähr was es bedeutet kann es aber nicht lösen.

@Nebulak
cin.ignore "säubert" den Buffer. Jetzt wartet das nächste cin.get nicht auf meine Eingabe, sondern macht einfach mit der Fehlermeldung weiter.

Hier nochmal der Code, falls ich was übersehen habe :roll: !

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
int main () 
{ 
    int Zaehler = 0; 
    int RichtigerBuchstabe = 0; 
    char Eingabe[500]; 

    cout << "FLO BLOG\n\n" << endl; 
    
    ifstream input ("Daten7.dtn", ios::binary); 

    if (!input.is_open()) 
    { 
        FragePasswortAb (); 
        input.open("Daten7.dtn", ios::binary); 

        if (!input.is_open()) 
            cout << "Fehler beim oeffnen der Datei(en)" << endl; 
    } 

    char Passwort[500];               //mach hier ein char array 

    cout << "Passwort: "; 
    cin.clear(); 
    //cin.ignore();                        //ignore ingoriert das erste char den du bei Eingabe eingibst, also muss das auch weg 

    cin.get (Eingabe, 499); 
    ifstream Input ("Daten7.dtn", ios::binary); 
    Input.read((char *) &Passwort, sizeof (Passwort)); 
    Input.close (); 

    while (Zaehler < 499)  // stat <= kommt hier hin < 

    { 
           if (Eingabe[Zaehler] == Passwort[Zaehler]) 
          { 
                       // hier musst du gucken ob die strings auch zu ende sind! 

                       if((Eingabe[Zaehler] == '\0') && (Passwort[Zaehler] == '\0')) 
                  { 
                      RichtigerBuchstabe = 499; 
                      Zaehler = 499; 
                  } 
                  else 
                  { 
                      RichtigerBuchstabe++; 
                     Zaehler++; 
                  } 
        } 
        else 
        { 
            cout << "ERROR1: Falsches Passwort. Zugriff verweigert!" << endl; 
            Sleep(500); 
            return 3; 
        } 
    } 
    if (RichtigerBuchstabe == 499) 
    { 
        ZeigeDaten(); 
    } 

    cin.clear (); 
    cin.ignore (); 
    cin.get (); 
    return 0; 
} 

char FragePasswortAb ()
{
    char Passwort[500];

    cout << "Ihr gewuenschtes Passwort(max. 500 Zeichen): ";
    cin.get (Passwort, 499);

    ofstream Output ("Daten7.dtn", ios::binary);

    Output.write ((char *) &Passwort, sizeof (Passwort));
    Output.close ();
    
    return Passwort;
}


Vielen Dank im Voraus :D

Edit: Vielleicht liegt die Fehlermeldung daran das ich nach Aufruf der Funktion FragePasswortAb nicht

C-/C++-Quelltext

1
Input.read ((char *) &Passwort, sizeof (Passwort));

benutzt habe.
Pi mal Daumen = 18.84955592

C--

Alter Hase

Beiträge: 465

Beruf: Schüler

  • Private Nachricht senden

29

19.07.2009, 09:41

FLO2, wozu gibst du überhaupt etwas in FragePasswortAb zurück, wenn du den Rückgabewert doch nicht nutzt :?:

Edit:

Falls du den Rückgabewert wirklich brauchst, dann würde ich das so machen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void FragePasswortAb (char Passwort[]) 
{ 
    //char Passwort[500]; // brauchst du nicht mehr 


    cout << "Ihr gewuenschtes Passwort(max. 500 Zeichen): "; 
    cin.get (Passwort, 499); 

    ofstream Output ("Daten3.dtn", ios::binary); 

    Output.write ((char *) &Passwort, sizeof (Passwort)); 
    Output.close (); 
    
    //return Passwort; // auch nicht nötig

}


Der Aufruf:

C-/C++-Quelltext

1
2
char Rückgabewert[500];
FragePasswortAb(Rückgabewert);



Zur Info: Arrays werden standardmässig als Referenz übergeben.

EDIT2:

Der Fehler mit cin tritt bei mir nur auf, wenn die Datei schon existierte, also wenn FragePasswortAb gar nicht aufgerufen worden ist. Ich denke das liegt daran, dass du wenn die Datei nicht existierte ja vor cin.get(Eingabe, 499) in main() den Puffer nicht leerst, obwohl schon eine Eingabe in FragePasswortAb stattgefunden hat.

Ich würde dann ein cin.ignore() in FragePasswortAb nach dem cin.get in FragePasswortAb einbauen. So kannst du dir sihcer sein, dass cin.ignore() zur richtigen Zeit aufgerufen wird. ;)
Ich spreche: C/C++, C++/CLI C#, VBA, VB.NET, Delphi, (HTML, Javascript(bisschen))
------------------------------------------------------------
Hier steht eventuell schon in ein paar Monaten der Link zu meiner Homepage!

return 0;
;)

FLO2

Treue Seele

  • »FLO2« ist der Autor dieses Themas

Beiträge: 221

Beruf: Schüler

  • Private Nachricht senden

30

19.07.2009, 16:07

Juhu, hat wieder mal geklappt.
Danke :D
Pi mal Daumen = 18.84955592

Werbeanzeige