C++ Wörter in Textdokumenten finden und Stelle ausgeben.



  • Habe vor kurzem mit C++ angefangen und komme soweit super klar. Jetzt will ich quasi einen Client erstellen, bei dem man sich einen Account erstellen und anmelden kann. Ich habe es geschafft, dass man seinen Account erstellt (also Username und einem txt Dokument und Passwort in einem anderen. Halt jeweils in der selben Zeile). Jetzt will ich, dass man bei Anmelden seinen Username eingibt und das Programm dann im Username Textdokument nach dem Eingegebenen sucht und mir die Zeile sagt, damit ich diese als int speichern kann. Das selbe soll es dann auch bei dem Passwort machen und dann beide Werte abgleichen, damit ich quasi dann eingeloggt bin. Ich hoffe ihr konntet verstehen, was ich meine und dass ihr mir helfen könnt ^^ Vielen Dank schon mal 🙂

    #include <iostream>
    #include <string>
    #include <conio.h>
    #include <windows.h>
    #include <fstream> 
    #include <cstdlib>
    
    using namespace std;
    
        //Habe es hier mal auf Registrieren und Anmelden beschränkt
    
    void anmelden()           //HIER LIEGT MEIN HAUPTPROBLEM
    {
      string EingabeName, EingabePW;
      ifstream InsertName("Nutzernamen.txt"), InsertPW("Passwörter.txt");
      if()
    
      cout << "\nGib nun deinen Nutzernamen ein : ";
      cin >> EingabeName;
      if(EingabeName == InsertName)
        {
            cout << "Gib nun dein Passwort ein : ";
            cin >> EingabePW;
            if (EingabePW==InsertPW)
               {
                 Eingeloggt();                      
               }
            else
            {
                cout << "Ungültiges Passwort..\n";
                Sleep(1000);
                system("cls");
                anmeldenA();
            }
        }
        else
        {        
            cout << "Ungültiger Nutzername..\n";
            Sleep(1000);
            system("cls");
            anmeldenA();       
        }   
    
    }
    
    void registrieren()
    {
       ofstream NeuerName, NeuesPW;
       string NewName, NewPW;
       cout << "Gib deinen gewollten Nutzernamen ein : ";
       NeuerName.open("Nutzernamen.txt",ios::app);
       cin >> NewName;
       NeuerName << NewName << endl;
       NeuerName.close();
       cout << "Gib nun dein gewolltes Passwort ein : ";
       NeuesPW.open("Passwörter.txt",ios::app);
       cin >> NewPW;
       NeuesPW << NewPW << endl;
       NeuesPW.close();
       system("cls");
       Sleep(1000);
       cout << "Account erstellt, du kannst dich nun anmelden";
       Sleep(1000) ;
       cout << ".";
       Sleep(1000) ;
       cout << ".";
       Sleep(1000) ;
       cout <<"." ;
       Sleep(2000);
       system("cls");
       anmelden();
    }
    

  • Mod

    Passwortauthentifikation macht man ganz anders. Speicher Nutzername und Passwörter irgendwie so, dass du weißt, welches Passwort zu einen Namen gehört. Du speicherst auch nicht das Passwort, sondern einen kryptografischen Hash davon. Und bevor du den Hash berechnest, packst du noch ein paar zufällige Zeichen zum Passwort dazu, sogenanntes Salt. Und das Salt zu jedem Hash speicherst du dann auch noch dazu (denn jeder Hash hat anderes Salt!). \

    Wenn dann jemand einen Nutzernamen und Passwort eingibt, guckst du nach, welches Salt zu dem Nutzernamen gehört und rechnest das zum eingegebenen Passwort dazu, dann berechnest du wieder den Hash davon und den vergleichst du dann einfach mit dem gespeicherten Hash. Wenn sie übereinstimmen, ist der Nutzer authentifiziert.

    Mag vielleicht kompliziert klingen, ist es aber eigentlich nicht. Und für jeden dieser Schritte gibt es sehr gute Gründe, die aber hier zu lang zu erklären wären.





  • #include <iostream>
    #include <string>
    #include <conio.h>
    #include <fstream>
    
    using namespace std;
    
    void wahl();
    void anmelden();
    void registrieren();
    
    int main()            //Anfang
    {
      wahl();
      exit(1);
    }
    
    void wahl()           //Wahl, Anmelden oder Registrieren
    {
      char wahl=0;
      cout << "1 für Anmelden\n"
           << "2 für Registrieren\n";
      cin >> wahl;
    
      switch (wahl)
      {
        case '1' : anmelden();
        case '2' : registrieren();     
      }  
    }
    
    void registrieren()
    {
       ofstream NeuerName, NeuesPW;
       string NewName, NewPW;
       cout << "Gib deinen gewollten Nutzernamen ein : ";
       NeuerName.open("Nutzernamen.txt",ios::app);
       cin >> NewName;
       NeuerName << NewName << endl;
       NeuerName.close();
       cout << "Gib nun dein gewolltes Passwort ein : ";
       NeuesPW.open("Passwörter.txt",ios::app);
       cin >> NewPW;
       NeuesPW << NewPW << endl;
       NeuesPW.close();
       anmelden(); 
         }     
    
    void anmelden()      //Anmelden
    {
       //Hier weiss ich jetzt nicht, wie ich aus den beiden Textdokumenten die Richtige Kombination herausfinde..  
         }
    

    Das ist der vereinfachte Code. mein Problem habe ich im Kommentar erläutert. Ich hoffe ihr versteht was ich meine 🙂



  • mammum schrieb:

    und komme soweit super klar.

    Hast du schon mal von Rückgabewerten von Funktionen gehört/gelesen?
    Kennst du Schleifen?
    Lernst du wirklich C++?

    mammum schrieb:

    .. und das Programm dann im Username Textdokument nach dem Eingegebenen sucht und mir die Zeile sagt, damit ich diese als int speichern kann.

    Dann mach das doch so.
    Zeilenweise aus der Datei lesen und mitzählen. Aufhören, wenn der Name passt.

    mammum schrieb:

    Das selbe soll es dann auch bei dem Passwort machen und dann beide Werte abgleichen,

    Dann mach das doch so.
    Zeilenweise aus der Datei lesen und mitzählen. Aufhören, wenn der Zähler passt.

    Zwei Funktion, die auch nur diese Aufgaeb haben. Nichts anderes. Kein cout, sleep, system.
    Mit Rückgabewert, ob die Funktion erfolgreich war.

    Das dies nur eine Pseudosicherheit ist, sollte dir klar sein.



  • DirkB schrieb:

    Dann mach das doch so.

    Würde ich wissen wie das geht würde ich ja nicht fragen ^^ Mache das jetzt seid ca einer Woche und hab noch kaum Erfahrung und da wäre Hilfe echt nett. Wie zähle ich denn Zeilen mit ? Und natürlich ist das nicht sicher, sondern meine ersten Versuche nach einer Woche. Hilfe und Verständnis wären nett 😃



  • mammum schrieb:

    Würde ich wissen wie das geht würde ich ja nicht fragen

    Es ist wirklich so einfach wie du das beschrieben hast.

    [quote="mammum" Wie zähle ich denn Zeilen mit ? [/quote]Also kennst du keine Schleifen.
    Fang doch damit an.

    Und es muss keine for-Schleife sein (kann aber). Die Abbruchbedingung muss kein Numerischer Vergleich sein.

    Du brauchst noch mehr Grundlagen.
    Grundlagen. Die wird dir hier keiner vermitteln.
    Wiederhole nochmal die Übungen aus dem Buch.

    Oder hilft dir das:

    int eingabe = 1;
    for(int zaehler=0; eingabe > 0; zaehler++)
    { cout << "Zahl eingeben\n";
      cin >> eingabe ;
    }
    cout << "Sie haben " << zaehler << "-mal Zahlen > 0 eingegeben";
    


  • DirkB schrieb:

    int eingabe = 1;
    int zaehler;
    for(zaehler=0; eingabe > 0; zaehler++)
    { cout << "Zahl eingeben\n";
      cin >> eingabe ;
    }
    cout << "Sie haben " << zaehler << "-mal Zahlen > 0 eingegeben";
    

    FTFY


Log in to reply