Bekommt struct keine Daten ??
-
Wenn du komplexere Strukturen schreiben willst, empfiehlt sich ja ein struct. Zum Beispiel:
struct JZeiten{ int nummer; int zustand; // 0 runter, 2 rauf, 1 mittig, was auch immer int tag; // 0 - 7 float zeit; // in stunden seit 0:00 }; ostream &operator<<(ostream &stream, const JZeiten &jzeit){ stream << jzeit.nummer << jzeit.zustand << jzeit.tag << jzeit.zeit; return stream; } istream &operator>>(istream &stream, JZeiten &jzeit){ stream >> jzeit.nummer >> jzeit.zustand >> jzeit.tag >> jzeit.zeit; return stream; }Etwa in der Art, weiß nicht aus dem Kopf ob da nicht ein kleiner Fehler drin ist.
Dann könntest du die einfach einlesen, vergleichen (eine Methode die den Index testet (über Nummer, Tag und Uhrzeit?)) und das alte rausschreiben oder bei Gleichheit eben das neue.
-
Klingt gut mit struct da kann ich ja auch längere zeichenketten schreiben wie ich bei int hinbekomme. ostream ifstream ? da mus ich mal wieder die suchmaschine anschmeißen..danke dir aufjeden fall schonmal dafür
wenn ich das bislang richtig erkenne müste const bei ostream raus meldet mir fehler und beim suchen mit google isses auch weg.
-
Brusko schrieb:
.. oder besser noch anders und zwar z.b 0-7 für jalousienummer 0/1 für auf oder ab 1-7 für tag und dann die uhrzeit. ware z.b Jalousie 1 hoch am montag um 12 uhr
also 11120000 und diesen als int suchen aus der datei und vergleichen und am besten dann mit dem neuen überschreiben. das müste doch auch gehen oder ?Im Prinzip geht alles ... zunächst solltest Du Dir ein vernünftiges Format ausdenken. So wie ich das bis jetzt verstanden habe, brauchst Du einen Zeitpunkt - innerhalb einer Woche - zu der eine bestimmte Jalousie hoch oder runtergefahren wird. Also vielleicht so
So 08:30 J2 auf So 09:15 J1 auf Mo 20:15 J1 ab Fr 23:59 J2 abDann solltest Du Dir eine struct überlegen, die für eine (!) Schaltzeit steht - so wie schon von Fellhuhn vorgeschlagen. Sie muss enthalten:
- Wochentag und Uhrzeit
- Jalousie
- auf oder abWie die Zeit (Wochentag und Uhrzeit) abgelegt wird, sollte ausschließlich davon abhängen, wie Du später im Programm die Zeit brauchst. Das kann eine eigene Struct sein
struct wday_time { int m_wday; // So := 0 bis Sa := 6 int m_min; // Minuten seit 0:00 }oder die C++-Struktur std::tm oder einfach ein int, das die Minuten oder Sekunden seit Sonntag 0:00 Uhr angibt.
Die Jalousie ist wahrscheinlich ein int und für das auf und ab reicht ein bool.
Also alles zusammen - jetzt mit std::tm als Beispiel
struct Schaltzeit { std::tm m_time; int m_kanal; // abstrakt der zu schaltende Kanal; für die Jalousie bool m_on; // true := auf };Und erst jetzt Gedanken über das richtige Ausgeben machen. Wie schon erwähnt, braucht man dazu einen sogenannten Streaming-Operator - hört sich vielleicht für den Anfänger befremdlich an, ist aber nur eine Funktion mit zwei Parametern, von denen einer ein Stream ist - wie etwa
std::ostream& schreibe( std::ostream& out, const Schaltzeit& sz ) { // hier jetzt eine Schaltzeit 'sz' nach 'out' schreiben return out; }nur dass das 'schreibe' durch 'operator<<' ersetzt wird
std::ostream& operator<<( std::ostream& out, const Schaltzeit& sz ) { // hier jetzt eine Schaltzeit 'sz' nach 'out' schreiben return out; }wenn das fertig ist, braucht man nur noch die Datei zu öffnen und alle Schaltzeiten hineinschreiben. Diese speichert man am besten in einem Container - z.B. std::vector<>
vector< Schaltzeit > jalousiezeiten; // 'jalousiezeiten' sind gefüllt ofstream datei("zeitdaten.txt"); copy( jalousiezeiten.begin(), jalousiezeiten.end(), // so ist es am einfachsten ostream_iterator< Schaltzeit >( datei, "\n" ) ); // fertig!Wenn Du mehr Details wissen möchtest, so frage nach. Das Einlesen geht vom Prinzip genauso.
Gruß
Werner
-
also wie die strukt aussieht und der genaue datensatz sein sollte weis ich schon
struct { int art; // Erkennung ob Jalousie ,steckdosenz u.s.w z.b 01 für jalousie int nummer; // Welcher Eingang (bei jalousie z.b 0 bis 7 ) int anzahl; // Anzahl der Schaltzeiten am Tag (um mehrmals an/aus schalten) int zustand; // zustand zuordnen der Uhrzeit (0 oder 1 für an oder aus) int tag; // welcher tag (1 -7 wobei 1 montag ist) int zeit; //Schaltuhrzeit }das hatte ich mir so gedacht, beim zuordnen von ostream scheint kein fehler zusein zumindest , aber wie ich dann oftream zuordne mus ich noch versuchen da bekomme ich zurezit immerm nur die eins rein in die datei
vector< Schaltzeit > jalousiezeiten; // 'jalousiezeiten' sind gefüllt ofstream datei("zeitdaten.txt"); copy( jalousiezeiten.begin(), jalousiezeiten.end(), // so ist es am einfachsten ostream_iterator< Schaltzeit >( datei, "\n" ) ); // fertig!must der ostream_iterator extra im header eingebunden werden ?? oder ist der mit iostream/fstream mit drin ??
bekomme fehler ostream_iterator was not declared in this scope
ist ein extra header habs soweit gefunden
-
nun Fehler werden mir nu nicht mehr gemeldet aber es wird auch nichts geschrieben bzw bleibt die datei zeitdaten leer.
//***** Datenelemente geben ***** struct Speicherdaten { int art; // 01 = Jalousie, 02 = Steckdosen, 03 = Licht, 04 = Aussen int nummer; // Welcher Eingang (bei Jalousie z.b 0-7) int anzahl; // Anzahl der Schaltzeiten am tag (0-9) int zustand; // Zustand Aus/An bzw Auf/ab (0/1) int tag; // Welcher Tag (1 -7 wo Montag 1) int zeit; // Uhrzeit }sp; //****** Daten setzen ****** ostream& operator<<(ostream& out, const Speicherdaten& sdaten) { out << sdaten.art <<sdaten.nummer <<sdaten.anzahl << sdaten.zustand << sdaten.tag <<sdaten.zeit<<"test"; return out; } //****** Daten schreiben ***** void schreibedaten() { vector <Speicherdaten> datenschreiben; // datenschreiben sind gefüllt ofstream dateiout ("zeitdaten.txt"); // oeffne datei copy(datenschreiben.begin(), datenschreiben.end(), ostream_iterator<Speicherdaten>(dateiout,"\n")); }hier werden die werte übergeben am struct
for (uint16_t i = 10; i < 19; i++) // Anzahl der Jalousien { for (uint16_t ii = 0; ii < 14; ii++) // 14 Schaltzeiten rauf/runter mal tage { bool eingabestand = true; while (eingabestand) { mvwaddstr(wjalouschalt, ii+1, 20, " <--"); mvwgetnstr(wjalouschalt, ii+1, 20, jalouzeiten, 6); mvwaddstr(wjalouschalt, ii+1, 27, " "); eingabecheck(jalouzeiten); eingabestand = !eingabecheck(jalouzeiten); } int schaltzeiten = atoi(jalouzeiten); int zustand; int tag = (ii/2) + 1; if (ii%2 == 0) {zustand = 0;} // Setzte 0 fuer Jalousie auf else {zustand = 1;} // Setzte 1 fuer Jalousie ab Speicherdaten sp; sp.art = 01; sp.nummer = i; sp.anzahl = 0; sp.zustand = zustand; sp.tag = tag; sp.zeit = schaltzeiten; schreibedaten(); } }vector <Speicherdaten> datenschreiben;wenn ich nun hinter datenschreiben (20) einführe schreibt er mir 20datensätze
a 6 nullen hineinund ( anscheinend für jede variable eine Null) und test jeweils hinten an.
kann es sein das die struct nicht die werte bekommt ?
-
Struct daten sind doch allgemein schon public oder ? bei class mus ich doch extra public angeben.
-
Hallo
Genau. Das ist der einzige Unterschiede:
struct - default public
class - default privatechrische
-
Und wie ich die daten am struct übergebe (im mein fall sb.nummer = 01) ist doch auch richtig wenn ich vorher den struct aufrufe (Speicherdaten sp;)
darum verstehe ich nicht soganz warum ich nur nullen inner speicherung habe. den String von ostream mus Vector doch bekommen sonst würde das test ja nicht dadrin erscheinen.Hab mittleiweile die überschrift geändert ist wohl besser

-
Der Methode schreibedaten() solltest du auch die zu schreibenden Daten übergeben.
Also du hast einen std::vector<Schaltzeit>, das ist eine Liste von einzelnen Schaltzeit-Objekten. Die musst du selber erstellern (oder einlesen) und in den Vector schreiben. Diesen übergibst du dann (bitte als (const) Referenz) an die schreibedaten-Funktion, die eben jene dann rausschreibt. Also quasi "vector <Speicherdaten> datenschreiben;" durch einen Parameter ersetzen.
Ansonsten erzeugst du in der Methode einen leeren Vector und schreibst diesen (also ncihts) in die Datei.
-
Also wenn ich das richtig verstehe mus ich void schreibedaten() erstmal die daten noch von struct Speicherdaten noch übermitteln ? ich dachte das kommt mit ostream hin da er ja auch test mit in die datei schreibt.
-
Halt, noch einmal der ganze Prozess wie er ablaufen sollte:
- Du erstellst einen vector<Schaltzeit> (ist leer)
- Du öffnest die Datei
- Für jede Zeile:
- Du erstellst ein Struct vom Typ Schaltzeit
- Liest diese Datei zeilenweise ein in das struct
- du schiebst das struct in den vector
- Nun hast du alle Einträge in dem Vector drin.
- Jetzt änderst du den gewünschten eintrag
- dann öffnest du die datei wieder zum schreiben
- iterierst über den vector und schreibst jedes struct in die datei
- du schließt die datei und bist fertig
-
ich glaub ich geh eine runde lesen *hmmm*