Bekommt struct keine Daten ??



  • klingt nach viel arbeit ? *g* ääm gibs die seiten auch irgendwo auf deutsch ?
    fremdsprachen sind nicht gerade mein spezialgebiet



  • Naja, je nachdem, was du reinschreibst. 😉 - Habs noch nie wirklich gemacht, aber das dürfte dir helfen:

    http://www.willemer.de/informatik/cpp/fileop.htm

    Such mal nach seek. (geiler Satz. :D).



  • Also eigentlich werden nur zahlen reingeschrieben....ich habe schon gedacht ob man z.b erst die "stelle" angibt und dann die 6 weiter zahlen nach dem leerzeichen einliest (weis noch nicht wie müste aber doch gehen ?) z.b wie
    126(die stelle) 235959(dieuhrzeit)
    also
    126 235959
    127 234459

    den daten satz dann später evtl einlesen und dann wieder nach stellen aufteilen (mal ebend so einfach 😕 🙂 )

    wenn es einfacher geht gerne *g*

    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 ?



  • 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 ab
    

    Dann 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 ab

    Wie 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 private

    chrische



  • 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*


Anmelden zum Antworten