Arbeiten mit Dateien in C++
-
Hey @all
Ich will aus einer Datei, folgende Informationen lesenDateiaufbau:
Benutzer:Passwort:BenuterID:GruppenID:Echter Name:Heimatverzeichnis:Shell
.
.
.
Benutzer:Passwort:BenuterID:GruppenID:Echter Name:Heimatverzeichnis:Shell#include <iostream> #include <fstream> #include <vector> #include <string> #include <iterator> using namespace std; int main() { ifstream file("dat.txt"); string line; vector<string> vec; while(getline(file,line)) vec.push_back(line); copy(vec.begin(),vec.end(),ostream_iterator<string>(cout,"\n")); }
ok, das heisst momentan sieht das so aus:
vec[0]: Benutzer:Passwort:BenuterID:GruppenID:Echter Name:Heimatverzeichnis:Shell
vec[1]: 2.Benutzer:2.Passwort:2.BenuterID:2.GruppenID:2.Echter Name:2.Heimatverzeichnis:2.Shell
.
.
.
usw.Nun da ich jetzt jede Zeile in meinem Vector habe, möchte ich das ganze unterteilen, somit sollen also die ":" wegfallen. Das ganze sollte also so aussehen:
vec[0]: Benutzer
vec[1]: Passwort
vec[2]: BenuterID
vec[3]: GruppenID
vec[4]: Echter Name
vec[5]: Heimatverzeichnis
vec[6]: Shell
vec[7]: 2.Benutzer
vec[8]: 2.Passwort
vec[9]: 2.BenuterID
vec[10]: 2.GruppenID
vec[11]: 2.Echter Name
vec[12]: 2.Heimatverzeichnis
vec[13]: 2.Shell
.
.
.usw.
Könnte mir da jemand helfen? Ich habe nämlich absolut keine Ahnung wie ich das machen könnte!
Vielen Dank im Voraus
MfG smog_at
-
als erstes legten wir mal eine stuct an
struct foo { std::string Benutzer_; std::string Passwort_; std::string BenuterID_; std::string GruppenID_; std::string Echter_Name_; std::string Heimatverzeichnis_; std::string Shell_; };
jetzt wäre es noch gut dafür ein op>> zu haben
istream & operator >>( istream & is, foo & f ) { getline( is, f.Benutzer_, ':' ); getline( is, f.Passwort_, ':' ); getline( is, f.BenuterID_, ':' ); getline( is, f.GruppenID_, ':' ); getline( is, f.Echter_Name_, ':' ); getline( is, f.Heimatverzeichnis_, ':' ); getline( is, f.Shell_ ); return is; }
benutzen kanns du es dann so
#include <iostream> #include <fstream> #include <vector> #include <string> #include <iterator> using namespace std; int main() { ifstream file("dat.txt"); vector<foo> vec; for(foo f; file >> f; ) vec.push_back( f ); copy(vec.begin(),vec.end(),ostream_iterator<foo>(cout,"\n")); /* damit das geht brauchs du jetzt noch ein op << */ }
-
wofür brauchst du den Inhalt der etc\passwd
:p Pure Neugier
-
@PAD will mir ein Konfigurationstool schreiben, ausserdem übe ich mich ständig an C++:)
@all ok, bin schon fast fertig, jedoch kommen noch kleine Fehler, hier mal der Code:
#include <iostream> #include <fstream> #include <vector> #include <algorithm> using namespace std; int main(int argc, char*argv[]) { string line, str; vector <string> vectorstring; vector <string> vs; int pos=0, i=0, j=0; ifstream File("/etc/passwd"); if(File) { // Einlesen des Strings in einen Vektor while(getline(File, line)) vectorstring.push_back(line); File.close(); } // Zerlegen des Strings vom Vektor, und die Einzelteile in einen anderen Vektor ablegen while(j!=vectorstring.size()) { i=0; while(pos!=vectorstring[j].length()) { if(i==7) break; if(i<=5) pos = vectorstring[j].find(":"); else if(i>5) pos = vectorstring[j].length(); str = vectorstring[j].substr(0,pos); vs.push_back(str); vectorstring[j].erase(0,pos+1); i++; } } }
Nun, mein Problem ist, das einige Zeilen komplett sind, und dann sind immer welche dabei die den letzten Eintrag(also Shell) nicht mehr schreiben, beim einlesen jedoch funktioniert das.
Kann mir bitte jemand helfen?
MfG Flex