Datei einlesen



  • Ich hätte da mal eine Frage.
    Ich lese eine Datei ein in der z.B. steht

    Username:Password
    

    . Dann trennt mein Code Username und Passwort (: ist das Trennzeichen).
    Dabei benutze ich string::iterator und springe damit sozusagen zum :. Wie kann ich es machen wenn z.B. meine Datei so aussieht

    Usernmae:Password:Age
    

    , ich zum zweiten Doppelpunkt gelange?
    Hier mal der Code vielleicht versteht man die Frage dann besser. 😃

    #include <iostream>
    #include <string>
    #include <fstream>
    #include <conio.h>
    
    using namespace std;
    
    int main(){
        fstream p_shadow;
        p_shadow.open("shadow.txt", ios::in);
        string shadow = "";
            if(!p_shadow){
                cout << "Diese Datei exestiert nicht!";
                getch();
                return 0;
            }
            else{
                while (!p_shadow.eof()){
                    getline(p_shadow, shadow);
                }
            }
        p_shadow.close();
    //ab hier
        int double_point=shadow.find(":");
        string::iterator pointer=shadow.begin();
        cout << "Username: ";
            for(int i=0;i<double_point;i++, pointer++){
                cout << *pointer;
            }
        cout << "\n\nPassword: ";
            for(++pointer;pointer!=shadow.end();pointer++){
                cout << *pointer;
            }
        getch();
    }
    


  • Du kannst std::getline ein Trennzeichen mitgeben, bei dem es stoppen soll. Bei dir bietet sich ':' als Delimiter an.

    std::istringstream is("Username:Password:Age\nUsername2:Password2:Age2");
    for (std::string username, passwd, age; getline(getline(getline(is, username, ':'), passwd, ':'), age);) {
      std::cout << "username: " << username << '\n'
                << "passwd  : " << passwd   << '\n'
                << "age     : " << age      << '\n';
    }
    


  • ...



  • Danke für die Mühe erstmal!
    @Swordfish: nur leider vestehe ich von deinem Code so gut wie gar nichts.
    Z.B. habe ich noch nie mit einem friend Element zutun gehabt, oder so einem krassen (für mich :P) struct. Ist das von forloop nicht in etwas das gleiche?

    forloop schrieb:

    Du kannst std::getline ein Trennzeichen mitgeben, bei dem es stoppen soll. Bei dir bietet sich ':' als Delimiter an.

    std::istringstream is("Username:Password:Age\nUsername2:Password2:Age2");
    for (std::string username, passwd, age; getline(getline(getline(is, username, ':'), passwd, ':'), age);) {
      std::cout << "username: " << username << '\n'
                << "passwd  : " << passwd   << '\n'
                << "age     : " << age      << '\n';
    }
    

    Es wäre sehr hilfreich wenn du mir die ersten 2 Zeilen erklären könntest. 😃



  • Swordfish schrieb:

    std::istream & operator>>( std::istream & is, user_t & user )
    {
    	is.imbue( std::locale( is.getloc(), new colon_is_space_t ) );
    	is >> user.name >> user.pass >> user.age;
    	return is;
    }
    

    lol.
    Wenn du es kompliziert machen willst, dann doch bitte richtig. Und zwar in dem du die aktuelle locale des istreams berücksichtigst und nachher wiederherstellst.



  • Fensterscheibe schrieb:

    forloop schrieb:

    Du kannst std::getline ein Trennzeichen mitgeben, bei dem es stoppen soll. Bei dir bietet sich ':' als Delimiter an.

    std::istringstream is("Username:Password:Age\nUsername2:Password2:Age2");
    for (std::string username, passwd, age; getline(getline(getline(is, username, ':'), passwd, ':'), age);) {
      std::cout << "username: " << username << '\n'
                << "passwd  : " << passwd   << '\n'
                << "age     : " << age      << '\n';
    }
    

    Es wäre sehr hilfreich wenn du mir die ersten 2 Zeilen erklären könntest. 😃

    Du könntest auch schreiben

    std::ifstream input( "shadow.txt" ); // std::istringstream liest von einem string, ifstream von einer Datei.
    std::string username, passwd, age; // Das sind die Variablen, die eingelesen werden
    while (getline(input, username, ':') && // getline(...) ist true, wenn das Lesen erfolgreich war
           getline(input, passwd, ':') &&   // Es ist guter Stil, das immer so zu 
           getline(input, age, ':')) {      // überprüfen.  So werden auch andere Lesefehler
                                            // wie eof() behandelt.
      std::cout << "username: " << username << '\n'
                << "passwd  : " << passwd   << '\n'
                << "age     : " << age      << '\n';
    }
    


  • Du kannst es auch auf Deine Weise machen:

    int double_point=shadow.find(":");
    

    findet den ersten Doppelpunkt.

    double_point=shadow.find(":", double_point + 1);
    

    findet den nächsten,

    double_point=shadow.find(":", double_point + 1);
    

    den dritten usw.
    Du solltest Dich nur darum kümmern, ob wirklich (noch) einer gefunden wurde.



  • forloop schrieb:

    Du könntest auch schreiben

    std::ifstream input( "shadow.txt" ); // std::istringstream liest von einem string, ifstream von einer Datei.
    std::string username, passwd, age; // Das sind die Variablen, die eingelesen werden
    while (getline(input, username, ':') && // getline(...) ist true, wenn das Lesen erfolgreich war
           getline(input, passwd, ':') &&   // Es ist guter Stil, das immer so zu 
           getline(input, age, ':')) {      // überprüfen.  So werden auch andere Lesefehler
                                            // wie eof() behandelt.
      std::cout << "username: " << username << '\n'
                << "passwd  : " << passwd   << '\n'
                << "age     : " << age      << '\n';
    }
    

    Gut das verstehe ich soweit.
    Nur mich verwirrt immer noch die ersten Zeile warum nicht einfach mit:

    fstream p_shadow;
    p_shadow.open("shadow.txt", ios::in);
    p_shadow.close();
    

    Oder sagt man damit schon das er lesen soll und man braucht keine extra Schleife mehr?



  • Belli schrieb:

    Du kannst es auch auf Deine Weise machen:

    int double_point=shadow.find(":");
    

    findet den ersten Doppelpunkt.

    double_point=shadow.find(":", double_point + 1);
    

    findet den nächsten,

    double_point=shadow.find(":", double_point + 1);
    

    den dritten usw.
    Du solltest Dich nur darum kümmern, ob wirklich (noch) einer gefunden wurde.

    Oh Super danke! 😃



  • ...


Log in to reply