Datei einlesen
-
Ich hätte da mal eine Frage.
Ich lese eine Datei ein in der z.B. stehtUsername: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 aussiehtUsernmae: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!
-
...