Verschiedene Zeilen Ab Text-File einlesen



  • Hallo liebe c++ler

    Ich hab mehrere Fragen bezüglich Hanhabung von files.
    Bin im google und den unentlich vielen Tutorials und meinen Lehrmitteln nicht schlau geworden. Bin leider noch blutiger Anfänger.

    Hier mein Main Programm welches eine Datei erzeugt.
    Das Funktioniert soweit ganz gut.

    int user = 1;
        char passwort[50] = {"Das ist ein Testpasswort"};
    
        ofstream pw; 
        pw.open("PasswortFile.txt",fstream::trunc);   
        pw <<"Das ist der user -> " <<user <<"  Passwort=> " <<passwort <<endl; 
        pw.close(); 
    
        user = 2;
        passwort[24]=' ';
        passwort[25]='2';
        passwort[26]='\n';
    
        pw.open("PasswortFile.txt",ios::app);
        pw <<"Das ist der user -> " <<user <<"  Passwort=> " <<passwort <<endl;   
        pw.close();
    

    Nun möchte ich Jede Zeile in ein Char Array und in ein int einlesen können.
    Und das ganze am Liebsten einmal mit einem Offset so dass nur der Benutzer in einem int landet.
    Und einmal mit einem Offsett so dass das Passwort in einem char Array landet.
    Hier mein zugegebenermassen kümmerlicher Versuch:

    int Lesen()
    {
        char pw1[100];
        char pw2[100];
        int user1=0;
        int user2=0;
        ifstream pw;
        pw.open("PasswortFile.txt",ios::in);
        // alles einlesen, um dieses kleine schnipsel wäre ich froh.
        // ich weiss das es was mit seekg und eof zu tun haben muss...
        return user;
        pw.close();   
    }
    

    am Schluss sollte in pw1 "Das ist ein Testpasswort" stehen
    in pw2 "Das ist ein Testpasswort2" stehen
    in user1 "1" stehen
    in user2 "2" stehen

    besten Dank an alle die mir aus der Patsche helfen!

    LG FLEXO



  • hier mal ein beispiel wie du es machen könntest:

    #include <fstream>
    #include <iostream>
    #include <string>
    #include <sstream>
    using namespace std;
    
    int main()
    {
        fstream f;
    	string passwort;
    	string s;
    	int user;
    	stringstream ss; // umwandeln string in int
    
    	f.open("test.txt", fstream::in);
    
    	f >> s >> passwort; // Wenn die Datei so aufgebaut ist, (siehe unten) kann man das so einlesen. Wenn du mehr benutzer hast 
    						// machst du alles in eine while schleife und mit der bedingung !f.eof(), dass ist false wenn das dateiende noch nicht
    						// erreicht ist.
    
    	cout << s << endl;
    	cout << passwort << endl;
    
    	ss << s;
    	ss >> user;
    
    	return 0;
    }
    

    Datei

    1 Das_ist_ein_Passwort
    

    Es muss dann aber alles zusammen geschrieben werden



  • Hallo FLEXO,

    willkommen im C++-Forum.

    Deine Datei soll anscheinend so aussehen (auch wenn das ein ungewöhnliches Format ist - siehe Posting von Gucky)

    Das ist der user -> 1  Passwort=> passwort1
    Das ist der user -> 2  Passwort=> passwort2
    

    FLEXO_C schrieb:

    ... Nun möchte ich Jede Zeile in ein Char Array und in ein int einlesen können.
    Und das ganze am Liebsten einmal mit einem Offset so dass nur der Benutzer in einem int landet.
    Und einmal mit einem Offsett so dass das Passwort in einem char Array landet.

    Das ist nicht so ganz klar, wie Du das meinst. Ich unterstelle mal, da ist eine int-Variable 'user', die für den USer steht und ein Passwort als String, was Du letzlich benötigst. Für den String benutze am besten einen std::string. Dann wird schon mal vieles einfacher und weniger fehleranfällig.

    Die 'richtigen' Stellen im Textfile finde ich mit Hilfe des Zeichens '>'. Hier wird einfach solange alles überlesen, bis ein '>' austaucht und danach jeweils die Variable. Der lesende Code könnte dann so aussehen:

    #include <iostream>
    #include <string> // std::string
    #include <fstream>
    #include <limits> // numeric_limits
    
    void Lesen()
    {
        using namespace std; // erspart das vorangestellte std::
        const streamsize ALLES = numeric_limits< streamsize >::max(); // die größste darstellbare Zahl dieses Typs
        string pw1;
        string pw2;
        int user1;
        int user2;
        ifstream pw( "PasswortFile.txt" ); // mit dem Anlegen oeffnen, basic_ios::in ist es sowieso
        if( !pw.is_open() )
        {
            cerr << "Fehler beim Oeffnen" << endl;
            return;
        }
        // alles einlesen, um dieses kleine schnipsel wäre ich froh.
        // ich weiss das es was mit seekg und eof zu tun haben muss... nein, weder seekg noch eof
        pw.ignore( ALLES, '>' ) >> user1;
        pw.ignore( ALLES, '>' ) >> pw1;
        pw.ignore( ALLES, '>' ) >> user2;
        pw.ignore( ALLES, '>' ) >> pw2;
        if( pw ) // heißt, bis hierhin ist das Einlesen gut gegangen
        {
            cout << "User2 " << user2 << " Passwort2 " << pw2 << endl;
        }
    }   // pw.close() ist unnötig, das geschieht im Destruktor von ifstream
    

    Wichtig dabei ist noch, dass die Passworte keine Leerzeichen oder Tabulatoren enthalten, so wie in Deinem Beispiel - das ist bei Passworten auch nicht üblich. Der Ausdruck std::istream>>std::string liest immer ein Wort.

    :xmas2: Werner


Anmelden zum Antworten