Arbeiten mit Dateien in C++



  • Hey @all
    Ich will aus einer Datei, folgende Informationen lesen

    Dateiaufbau:
    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


Anmelden zum Antworten