File auslesen und vergleichen



  • Hallo,

    ich habe folgendes Problem, es gibt eine Datei, wo ein paar Daten drin stehen, z.B. Dateinamen oder Verzeichnisse oder auch Werte.
    Beispiel:
    myDir= c:/myDir
    myFile= hallo.txt
    myVar= xyz

    usw.
    Die Datei sollte ausgelesen werden und die einzelnen Werte zwecks Weiterverarbeitung in bestimmte Variable gespeichert werden.
    Das geht auch so weit mit den üblichen Verdächtigen, fstream, open, Zeile bis "=" auslesen, dann abgleichen, was genau vor "=" drin steht und die einzelnen Werte nach dem "=" auf die Variablen verteilen.
    Kann man es auch eleganter lösen? Ich meine damit, ohne den direkten Vergleich im Code, also ohne if(strcmp (tempVar, "myFile")? -> ich möchte also "myFile" aus dem Code raushaben. Geht das?

    Danke 🙂



  • Mit stdcmp schon mal gar nicht. Nimm std::string, dann kannst du dir das Rumgefummel mit den alten C-Funktionen sparen.

    Die Lösung für dein Problem ist vermutlich std::map.



  • Hmm, hab gerade nachgeschaut, was es mit std::map auf sich hat.
    Ich könnte damit also sowohl die Bezeichnung wie "myDir" als auch den dazugehörigen Wert wie "c:\myDir" als ein Paar einlesen, ist das korrekt?

    So weit so gut. Allerdings werden die unterschiedlichen Werte im Programm unterschiedlich gehandhabt (z.B. suche im Verz. myDir nach der Datei myFile, lese myFile, bis xyz gefunden, mach dann was und lese bis abc weiter). Mir ist nicht ganz klar, wie ich dann weiter vorgehen kann 😕, denn die Reihenfolge der einzelnen Daten in der Datei ist nicht fest vorgegeben.
    Müßte ich dann quasi in der map wieder nach myDir suchen?
    Sorry, bin in C++ nicht so fit.



  • Suchen in der Map geht ganz einfach:

    Map["myDir"]



  • Ich könnte damit also sowohl die Bezeichnung wie "myDir" als auch den dazugehörigen Wert wie "c:\myDir" als ein Paar einlesen, ist das korrekt?

    Einlesen, nein. Abspeichern, ja.



  • könnt ihr mir das vielleicht mal für ganz doofe erklären? Bitte.



  • Hier mal eine schnell hingeschriebene Möglichkeit, deine Schlüssel / Werte aus den eingelesenen Zeilen in eine map zu packen.

    // Die eingelesenen Zeilen aus deiner Datei
    std::vector<std::string> lines;
    
    // Speichert die Schlüssel und die Werte
    std::map<std::string, std::string>  keys;
    
    // Speichert die Position an der = gefunden wurde
    std::string::size_type found = std::string::npos;
    
    // Iterator zum Durchlaufen des Vektors
    std::vector<std::string>::iterator itr = lines.begin();
    while(itr != lines.end())
    {
    	// Existiert ein = ?
       found = (*itr).find("=");
    
       if(found != std::string::npos)
       {
       	// Speichert alles vor dem = als Schlüssel in der map
       	// Alles nach dem = wird zum Wert des Schlüssels
          keys[(*itr).substr(0, found)] = (*itr).substr(found+1, (*itr).length()-1);
       }
    
       ++itr;
    }
    


  • hm, schlagt mich nicht, aber kann man das ganze nicht auch so lösen, indem man die datei die ausgelesen werden soll einfach zu einer .INI datei umbenennt und zum auslesen der datei getprivateprofilestring() nimmt?

    gruß
    Daniel



  • Hi,
    keine Ahnung wo diese Methode getprivateprofilestring() herkommt (Windows?). Wenn die INI Files einlesen kann, warum nicht.



  • nucknuck schrieb:

    Hi,
    keine Ahnung wo diese Methode getprivateprofilestring() herkommt (Windows?). Wenn die INI Files einlesen kann, warum nicht.

    jo, WinAPI.

    Wenn die INI Datei so aufgebaut ist, kann auf die einzelnen Sektionen, Keys und die Werte der Keys zugegriffen werden:

    [Sektion1]
    key1=a
    key2=b
    key3=c
    
    [Sektion2]
    keyA=1
    keyB=2
    keyC=3
    

    einfach mal in der hilfe gucken.

    gruß
    Daniel

    ps: vielleicht könnte jemand von den "alten Hasen" noch was dazu sagen, bin auch noch relativ neu in c++



  • diese Win-Geschichte hilft mir nicht, da der Kram portabel sein muß, leider, sonst wäre es sicher interessant.

    Den Code sehe ich mir genauer an, Danke.



  • #include <vector>
    #include <map>
    #include <string>
    

    Hatte ich ganz vergessen.
    Wenn du

    using namespace std;
    

    verwendest, kannst du std:: weg lassen.


Anmelden zum Antworten