Problem: 2-dimensionale Map



  • Hallo,

    folgendes Problem:

    Ich habe eine Datei:

    # Kommentar
    # ab   cd   ef    gh
    # Zeile 1
       0.1  2.3  4.3  off
    # Zeile 2
       0.2  5.6  7.6  on
    # Zeile 3
       0.3  8.7  9.8  on
    

    Nun muss ich die Datei einlesen und auf die Werte zugreifen können.

    Das Ganze soll jetzt mit einer 2-dimensionalen Map realisiert werden, so dass man dann z.B. über test [1] ["ef"] auf den Wert 4.3 zugreifen kann.

    Irgendwie weiß ich jetzt aber gar nicht, wie ich da anfangen soll...

    Angelehnt daran, wie die Funktion vorher ausgesehen hat, hab ich jetzt mal angefangen, ein bißchen rumzuprobieren, aber irgendwie will das nicht funktionieren...

    Das kann man alles mit Sicherheit noch viel besser lösen, aber ich bin ja jetzt nicht so der Profi... : 😞

    bool read()
    {
        vector<string> lines;
        int i;
        ifstream IN ("datei.txt");
        if (IN.is_open())
        {
            string line;
            while (getline(IN, line))
            {
                if (!line.empty() && line[0] != '#')
                {
                    lines.push_back(line);
                    stringstream sstr;
                    string gh;
                    double ab, cd, ef;
                    sstr << lines[i-1];
                    sstr >> ab >> cd >> ef >> gh;
                    if (gh == "on")
                    {
                        vector <double> v;
                        v.push_back(ab);
                        v.push_back(cd);
                        v.push_back(ef);
    
                        test ["ab"] = v[0];
                        test ["cd"] = v[1];
                        test ["ef"] = v[2];
                    }
                    else
                    {
                        cout<<"line "<<i<<" is off\n";
                    }
                }
            }
        IN.close();
        return true;
        }
        else
        {
            cout<<"ERROR\n";
            return false;
        }
    }
    

    Das Problem ist, dass ich halt nicht auf die bestimmte Zeile zugreifen kann, auf die ich gerne möchte.

    Könnt ihr mir da vielleicht weiterhelfen?



  • Hallo,

    Was hat denn test für einen Typ? Ich würde hier sowas wie

    vector<map<string,double> >
    

    nehmen.



  • Eigentlich sah die map irgendwie so aus:
    map<int, map<string, double> >

    Aber wenn ich dann als Integer z.B. die Zeile 2 übergebe, dann weiß ich nicht, wie ich das in der Funktion schreiben soll, weil das ja dann dem lines[2-1] entspricht, was ja ein string ist...



  • Mach doch einfach ein struct und definier für den einen Stream-Operator.

    struct Entry{
      double ab;
      double cd;
      double ef;
      std::string gh;
    };
    
    istream &operator>>(istream &stream, Entry &entry){
      stream >> ab >> cd >> ef >> gh;
      return stream;
    }
    

    Müsste so stimmen, glaube ich. Nicht getestet.

    Dann kannst du einfach:

    Entry entry;
    stream >> entry;
    

    schreiben.


Anmelden zum Antworten