enzelne Elemente des Vector vergleichen wenn unterschiedlich neu schreiben dann speichern ?
-
Guten Tag,
ich habe z.b mehrer vectoren :<typ des struct> dynSpeicher / <typ des struct> schreibeSpeicher und <typ des struct> leseSpeicher.
Jetzt möchte ich gerne in einer Funktion haben, lese datei aus speicher diese in leseSpeicher dann vergleich einzelne Elemente des Dynspeichers mit allen elementen des leseSpeichers. Wenn dann einzelene Elemente unterschiedlich und scheibe diese neu und speicher alle daten (schreibeSpeicher) ab.Kann man dieses schon mit vector realiesren ?
grüße
-
puuhhh kannst du eventuell ein bisschen code zeigen?
-
jepp kann ich, hoffe der ist soweit richtig denn wenn ich das programm beende bekomme ich junk pointer, too high tu make sense. aber nur beim beenden .
/*** Datensatz freigeben ***/ class Datensatz { string type; // 10 = Jalousie, 11 = Steckdosen, 12 = Licht, 13 = Aussen string number; // Welcher Eingang (bei Jalousie z.b 10-17) string count; // Anzahl der Schaltzeiten am tag (0-9) string status; // Zustand Aus/An bzw Auf/ab (0/1) string day; // Welcher Tag (1 -7 wo Montag 1) string time; // Uhrzeit public: Datensatz (string art, string nummer, string anzahl, string zustand, string tag, string zeit) { type = art; number = nummer; count = anzahl; status = zustand; day = tag; time = zeit;; } friend ostream &operator<<(ostream &out, const Datensatz &ds); //darf auf privat im class zugreifen (friend) }; /*** Dynamischen Speicher erstellen *** * vector ist die Schablone (welches ein dynamsiches Feld erzeugt) * * <Datensatz> ist der Typ der Elemente (int, chat usw) hier int * * da Datensatz im struct int hat (struct kann auch unterschiedlich sein. * * hier z.b "dynSpeicher" ist ein globales objekt (im ganzen progamm ) */ vector <Datensatz> dynSpeicher; /*** kompletten Datensatz erstellen (Aussehen) *** * ostream ist eine Funktion mit der man hier den (Verweis auf)Operator << * * ueberlaedt. Es werden die Daten aus dem Datensatz gelesen und in * * gewuenschter Ausgabe georndet ausgegeben. unbedint const sonst Fehler */ ostream &operator<<(ostream &out, const Datensatz &ds) { out <<ds.type<<ds.number<<ds.count <<ds.status<<ds.day<<ds.time; return out; } /*** Daten im dynSpeicher schreiben ***/ void imdynSpeicherschreiben (Datensatz erhalteDaten) { dynSpeicher.push_back(erhalteDaten); } /*** Datensatz lesen vergleichen speichern ***/ void speicherdaten () { //aus Datei lesem ifstream leseDatei("zeitdaten.txt",ios::in); vector<string> dynLese((istream_iterator<string>(leseDatei)), istream_iterator<string>()); leseDatei.close(); //in Datei schreiben ofstream speicherDatei("zeitdaten.txt",ios::out); copy (dynSpeicher.begin(), dynSpeicher.end(), ostream_iterator<Datensatz>(speicherDatei,"\n")); speicherDatei.close(); dynSpeicher.clear(); // in kontrolldatei schreiben was gelesen wurde ofstream cout("kontroll.txt",ios::out); copy (dynLese.begin(), dynLese.end(), ostream_iterator<string>(cout,"\n")); cout.close(); }hier werden die daten übergeben
void jalousiezeiten() { char jalouzeiten[7]; echo(); for (int i = 10; i < 11; i++) // Anzahl der Jalousien { for (int ii = 0; ii < 14; ii++) // 14 Schaltzeiten rauf/runter pro woche (2 am tag) { bool eingabepruefung = true; while (eingabepruefung) { mvwaddstr(wjalouschalt, ii+1, 20, " <--"); mvwgetnstr(wjalouschalt, ii+1, 20, jalouzeiten, 6); mvwaddstr(wjalouschalt, ii+1, 27, " "); eingabecheck(jalouzeiten); eingabepruefung = !eingabecheck(jalouzeiten); } string zeitja = jalouzeiten; string zustandja; string artja = "10"; int eingangjaint = i; ostringstream eingangjastr; eingangjastr << eingangjaint; string eingangja(eingangjastr.str()); string anzahlja = "0"; int tagjaint = (ii/2) + 1; ostringstream tagjastr; tagjastr << tagjaint; string tagja(tagjastr.str()); if (ii%2 == 0) {zustandja = "0";} // Setzte 0 fuer Jalousie auf else {zustandja = "1";} // Setzte 1 fuer Jalousie ab Datensatz Datenjalousie(artja,eingangja,anzahlja, zustandja,tagja,zeitja); imdynSpeicherschreiben(Datenjalousie); } } speicherdaten(); noecho(); }code erneuert
-
Also ich würde sagen, dass du die beiden Vektoren einfach per = vergleichst.
Und wenn sie anders sind, speichern. Und fertig.Wenn du jedes einezelne Element überprüfen willst, musst du halt mittels einer for-Schlaufe alle Werte durchgehen und überprüfen.
-
HAllo drakon, nun ich glaube das ist nicht so ganz das was ich möchte, ich versuch es mal genauer zu erklären wie ich mir das vorstelle.
der ostream setzt mein stream (daten aus class)sozusammen wie ich ihn gerne abspeichern möchte (das geht auch). hier wäre es der satz z.b 1010001111111
die ersten beiden ziffern (10)der Typ, die weiteren zwei zwiffern (10)die numme die nächste ziffer (0) ist die anzahl (welche) der schatzeit am tag, die nächste ziffer ist der zustand (0) kann 1 oder null entsprechen. die weiter ziffer 1 ist der tag (1-7) und dann die 6 ziffern ist die uhrzeit. Nun werden beim ersten mal eingeben der zeiten auch die erkennung gesetzt (das sind sogesehen die ersten 7 ziffern) und dann die uhrzeit dahinter. Nun kann ich ja nicht immer den ganzen vector vergleichen und neu schreiben weil ich ja nicht immer alle zeiten neu angebe (evtl bis zu 200stk)
Also würde ich gerne die ganze datei im vector leseSpeicher einlesen, ddie dadrin enthaltenden zahlenreihen vergleichen mit dem dynspeicher der dann die ltzten 6 ziffern der zahlreihe erstezt und neuschreibt falls diese unterschiedlich sind. Das ganze dann sogesehen im vector schreibeSpeicher legen und diesen in die Datei wieder auslagen.Hoffe ich könnte es etwas verständlich beschreiben
-
Habe nu den veränderten code drin, lese jetzt die datei erst aus und schreibe den vector <string> dynLese in eine Kontrolldatei damit ich weis ob er auch wirklich gelesen hat. Kann ich nun einzelne Elemente des Vectors mit der ganzen datei vergleichen und das er nur die neuschreibt die unterschiedlich oder nicht vorhanden sind ? die txt datei sind in einer zeile so aus:
1010001235959
die ersten 7 stellen (1010001) stellen die erkenneung da wohin die letzten 6 stellen (eine uhrzeit) gehören. und diese Uhrzeit soll z.b durch eine neue ersetzt werden wenn man die Funtkion zum uhrzeiteingeben aufruft. die funktion gibt die ersten7stellen automatisch vor und die uhrzeit darf der user bestimmern.
jemand eine Idee ? oder eine dicken zaunpfahl um mich auf den richtigen weg zu bringen ?

-
Ich sehe ehrlich gesagt nicht so ganz, WO dein Problem liegt.
Aber wie wäre es, wenn du einfach einen Abstand machst, dann kannst du die getrennt einlesen..
1010001 235959
std::ifstream in; int erkennung, zeit; in >> erkennung; in >> zeit;Damit liest du zuerst die erkennung, oder was das auch immer sein soll ein und dann die Uhrzeit.
-
hmm ich sollt wohl mal ein paar tage pause machen komme nicht weiter
besten dank