ein String im Vector suchen /getline oder get usw ?



  • warum benutzt du eigentlich zeichenketten.
    die kennung, bzw. erkennung und die zeit kannst du locker jeweils in einen zahldatentypen packen.
    das ganze dann in eine struktur oder klasse verpackt:

    #include <time.h>
    struct Datensatz
    {
        unsigned kennung;
        time_t zeit;
    };
    

    bzw.

    class Datensatz
    {
    // private, public, je nachdem
        unsigned kennung;
        time_t zeit;
    };
    

    🙂



  • nun auf string war ich erst gekommen da ich den Datensatz in eins hatte und nicht wie jetzt mit leertaste unterbrochen.wenn ich das hinbekommen hätte, würde ich alles gerne auf int haben. Vergleiche im ganzen programm int.

    ich bin gerade noch mit deiner schleife zugange da hab ich bei mir noch ein fehler gesehen



  • for ( unsigned int i=0; i<dynSpeicher.size(); i++)
           {
            if (dynSpeicher.at(i) == erkennung)
            {cout << erkennung<<" gefunden."<<endl;}
           }
    

    das läuft noch nicht so ganz rund, er geht nicht in die schleife rein wegen erkennung, der datensatz ist aber da und wird eingelesen



  • Brusko schrieb:

    autsch das mit dem abstürzen lag an den 15 zeicchen, eigentlich reichte das denn 1111111 000000 wäre die länge, 14 zeichen plus ein dazu.
    ich weis noch nicht warum aber er speicher mit das etwas konfuss ab was vorger klappte. mus wohl was verändert haben

    *das* ist konfus. zeig mal den code mit find, der angeblich abgestürzt ist.



  • std::map<std::string, std::string> daten;
       daten.insert(std::make_pair("test","daten1"));
       daten.insert(std::make_pair("test2","daten2"));
    
       std::map<std::string, std::string>::iterator iter = daten.find("test");
       if(iter == daten.end()) {
           std::cout<<"nix da";
       } else {
           std::cout<<"gefunden: "<<iter->second;
           iter->second="daten geändert";
       }
    
       iter = daten.find("test");
       if(iter != daten.end()) {
          std::cout<<"gefunden: "<<iter->second;
       }
    


  • Also ich hab erst schon erstmal wohl noch ein fehler festgestellt, und zwar lass ich die daten zeilenweise einlesen eine zeile enspricht z.b 1010001 235959 wenn ich nin mit mit dynSpeicher.at(4) ein element anzeigen lasse, zeigt er mir das ganze an ich mus aber beim einlesen eine trennung ab der lerhezile schon haben.
    get() liest ja z.b zeichenweise ein gibt es auch eine funktion die immer bis zum Leerzeichen oder newlinezeichen liest ?



  • ok - es hat jz vll nicht unbedingt was mit dem thema an sich zu tun und ich hab die beiträge auch nicht alle ganz genau durchgelesen, aber wozu brauchst du hier strings?
    warum legst du nicht einfach ne binärdatei an und liest eben die binärwerte aus und machst dir daraus deine structs? nat. musst du die dann trotzdem durchsuchen oder wie auch immer - aber 000101011010101 als string einlesen ist vll ein wenig ineffektiv (2 / 256) - also unter 1%...

    bye



  • Also die string besteht ja nicht nur aus 0 und 1 deer 6stelle string ist ja die uhrzeit also auch 235959.....ich möchte aber nachet wohl alles in int machen und nicht in string. String hatte ich erst dir erst weil die zeichenkette anders war.

    Ich bin auch ehrlich froh das ich es schon soweit hinbekomme das er mir das neue element mit eines vergleicht *g*.

    gibt es auch etwas um das element versetzten ?? dynspeicher.at(element) sagt mir ja welches element das ist bzw welche stelle, nun möchte ich gerne das 2 element daraif löschen und durch ein neues element ersetzen.

    /*** Daten im dynSpeicher schreiben ***/
    void imdynSpeicherschreiben ()
    	{
    	 string erkennung = setzedaten.type+setzedaten.number+setzedaten.count
    			  + setzedaten.status+setzedaten.day;
    	 string schaltzeit = setzedaten.time;
    	 string komplettdatensatz =" " + erkennung + " " + schaltzeit + "\n";
    	 cout <<"vor der schleife";
    	 for (unsigned int i=0; i<dynSpeicher.size();i++)
    	   {
    	    if (dynSpeicher.at(i) == erkennung)
    	      {dynSpeicher.erase(i);}
    	    else
    	      {dynSpeicher.push_back(komplettdatensatz);}
    	   }
    	}
    

    erase und intiger meldem mir dann
    no matching function for call to 'std::vector (gaaanz iel zu drann------>)

    in zeile 12



  • wenn ich das richtig gelesen habe mus erase usw ein iterator haben ?

    Wenn ich nun z.n eingebe.

    vector<string>:: iterator iter = dynSpeicher.begin();

    verweigert der pc da schon und macht unerlaubt paus



  • erase erwartet einen iterator des typs, den du löschen willst.

    Siehe:
    http://www.cppreference.com/cppvector/erase.html



  • Jepp so wie aussieht hab ich das aber mir ist aufgefallen das er an der stelle wohl hängt wo ich es am ende anhängen will. was mache ich denn da falsch ?

    /*** Daten im dynSpeicher schreiben ***/
    void imdynSpeicherschreiben ()
    	{
    	 string erkennung = setzedaten.type+setzedaten.number+setzedaten.count
    			  + setzedaten.status+setzedaten.day;
    	 string schaltzeit = setzedaten.time;
    	 string komplettdatensatz =" " + erkennung + " " + schaltzeit + "\n";
    	 cout <<"vor der schleife";
    	 vector<string>:: iterator iter = dynSpeicher.begin();
    	 for (unsigned int i=0; i<dynSpeicher.size();i++)
    	   {
    	    if (dynSpeicher.at(i) == erkennung)	      
    	      { cout<<"gefunden";dynSpeicher.erase(iter);}
    	    else
    	      {dynSpeicher.end(); dynSpeicher.push_back(komplettdatensatz);} */<----- hier hängt er/*
    	    iter++;
    	   }
    	}
    

    ich kann auch dynSpeicher.end() weglassen selbst dann hängt er



  • hya !
    wenn du von vorn herein eine struktur benutzen würdest,
    könntest du dir dieses gewurschtel mit den strings sparen 😉

    #include <time.h>
    struct Datensatz
    {
        unsigned nr;
        time_t   zeit;
    };
    


  • naja nun hab ich es ja nicht soweit aber warum hängt er denn da wenn ich per push_back das am ende dransetzen will ??



  • /*** Daten im dynSpeicher schreiben ***/
    void imdynSpeicherschreiben ()
    	{
    	 string erkennung = setzedaten.type+setzedaten.number+setzedaten.count
    			  + setzedaten.status+setzedaten.day;
    	 string schaltzeit = setzedaten.time;
    	 string komplettdatensatz =" " + erkennung + " " + schaltzeit + "\n";
    	 cout <<"vor der schleife";
    	 vector<string>:: iterator iter;
    	 for ( iter = dynSpeicher.begin();iter != dynSpeicher.end();iter++)
    	   {
    	    if (*iter == erkennung)	      
    	      { cout<<"gefunden";dynSpeicher.erase(iter);}
    	    else
    	      {dynSpeicher.insert(iter,komplettdatensatz);}	
    	   }
    	}
    

    habe nun versucht mit dem iterator zu suchen was auch funktioniert, auch das löschen scheint zu gehen da er mit den stream anders abspeichert, nur das push_back bzw das hinter dem stream anfügen will er nicht da bleibt er hängen. Gibt es da evt noch eine andere funktion ?



  • ich weiss nicht ob das so gesund ist, mit einem gelöschten iterator wieder einfügen zu wollen.
    wie viele datensätze sollen denn in der schleife gelöscht werden ?
    hast du doppelte einträge ?
    wenn nicht dann spring doch aus der schleife raus, wenn der datensatz gefunden und gelöscht wurde.
    das einfügen kannst du ausserhalb der schleife machen.



  • doppelte einträge soll er ja finden und (die erkennung finden) und dann die zeit ersetzten, es geht soweit auch.
    der fehler war auch das ich push_back inner schleife hatte, so hat er ja jedesmal wenn er nicht gefunden hat was einsetzten wollen . Das soll er ja ersst machen wenn schleife vorbei ist und nichts gefunden wurde.

    /*** Daten vergleichen und im  dynSpeicher schreiben ***/
    void imdynSpeicherschreiben ()
    	{
    	 string erkennung = setzedaten.type+setzedaten.number+setzedaten.count
    			  + setzedaten.status+setzedaten.day;
    	 string schaltzeit = setzedaten.time + "\n";
    	 string komplettdatensatz =" " + erkennung + " " + schaltzeit;
    	 vector<string>:: iterator iter;
    	 int gefunden = 0;
    	 for ( iter = dynSpeicher.begin();iter != dynSpeicher.end();iter++)
    	   {
    	    if (*iter == erkennung)
    	      {
    	       iter =iter+2;
    	       gefunden = 1;
    	       dynSpeicher.erase(iter);
    	       dynSpeicher.insert(iter,schaltzeit);
    	      }
    	   }
    	 if (gefunden == 0)
    	   { cout<<" drinnnnnn";dynSpeicher.push_back(komplettdatensatz);}
    	}
    

Anmelden zum Antworten