Name für neues Objekt aus Stream auslesen?



  • Moin,
    folgende Frage:
    Ich baue an einem Programm, dass eine csv-Datei mit mehreren Schichten und je nach Schicht verschiedenen Zeiten öffnet und verarbeitet. Die Textdatei hat dabei folgende Struktur:

    Schicht1, 8, 8, 8, 7, 9, 8
    Schicht2, 10, 10, 10, 12, 12
    Schicht3, ...usw...
    

    Ich möchte, dass für jede Zeile ein Objekt einer vorher definierten Klasse erzeugt wird. Dabei soll das neu erstellte Objekt jeweils den Inhalt vor dem ersten Komma der Zeile (z.B. Schicht1) als Namen haben, alle darauf folgenden Werte als einzelne int-Member.
    Meine Frage: Wie kann ich einem neu erzeugten Objekt den aus dem Stream ausgelesenen Namen "Schicht 1"geben (und für jede Zeile danach den jeweiligen Namen aus der enstprechenden Zeile?)?
    Könnte ich "Schicht 1" zunächst in einen String einlesen und dann den string zum Initalisieren des Objekts nutzen?

    Bestimmt eine Noob-Frage, komme aber als Anfänger leider nicht weiter.
    Danke bereits im Vorraus!



  • Was ist der Name eines Objekts?



  • @manni66 sagte in Name für neues Objekt aus Stream auslesen?:

    Was ist der Name eines Objekts?

    Angenommen ich habe die Klasse Schicht via

    class schicht { Implementierung... }
    

    definiert.
    Angenommen, ich möchte dann das Objekt "schicht 1" der Klasse "schicht" erstellen via

    Schicht schicht1;
    

    dann ist für mich "schicht1" der Name dieses Objekts.



  • Also sprichst du vom Variablennamen. Zur Laufzeit eines Programms gibt es keine Variablennamen.

    Was willst du erreichen?
    Wie würdest du die Objekte benutzen, wennn du auf magische Weise einen Namen vergeben könntest?

    Suchst du std::unordered_map<std::string, Schicht> (https://en.cppreference.com/w/cpp/container/unordered_map)?

    Oder doch einfach nur std::vector<Schicht>?



  • @manni66 sagte in Name für neues Objekt aus Stream auslesen?:

    Was willst du erreichen?
    Wie würdest du die Objekte benutzen, wennn du auf magische Weise einen Namen vergeben könntest?

    Ich würde einfach nur auf das Objekt und deren Member zugreifen wollen, um mit ihnen zu rechnen

    @manni66 sagte in Name für neues Objekt aus Stream auslesen?:

    Suchst du std::unordered_map<std::string, Schicht> (https://en.cppreference.com/w/cpp/container/unordered_map)?

    Oder doch einfach nur std::vector<Schicht>?

    Klingt gut, aber wie ordne ich in der Map dann das Objekt meinem "Namen" zu? Also wie spreche ich das Objekt an? Einfach via Adresse?



  • @cmoe sagte in Name für neues Objekt aus Stream auslesen?:

    Klingt gut, aber wie ordne ich in der Map dann das Objekt meinem "Namen" zu? Also wie spreche ich das Objekt an? Einfach via Adresse?

    map["Schicht1"].einMember(10);

    Das ist natürlich nur sinnvoll, wenn man wirklich mit dem Namen arbeiten muss.



  • @cmoe sagte in Name für neues Objekt aus Stream auslesen?:

    @manni66 sagte in Name für neues Objekt aus Stream auslesen?:

    Was willst du erreichen?
    Wie würdest du die Objekte benutzen, wennn du auf magische Weise einen Namen vergeben könntest?

    Ich würde einfach nur auf das Objekt und deren Member zugreifen wollen, um mit ihnen zu rechnen

    @manni66 sagte in Name für neues Objekt aus Stream auslesen?:

    Suchst du std::unordered_map<std::string, Schicht> (https://en.cppreference.com/w/cpp/container/unordered_map)?

    Oder doch einfach nur std::vector<Schicht>?

    Klingt gut, aber wie ordne ich in der Map dann das Objekt meinem "Namen" zu? Also wie spreche ich das Objekt an? Einfach via Adresse?

    Das ist recht einfach. Was du suchst ist eigentlich sowas:

    std::unordered_map<std::string,MeinObject> ObjectMap;
    MeinObject obj;
    obj.initFromTextLine( Line ); // Setzt verschiedene Informationen aus der Zeile
    ObjectMap[ obj.getName() ] = obj; // Fuegt Objekt mit Namen als Key in die Map ein.
    

    Im Prinzip musst du nur noch die Funktion 'initFromTextLine' und die Membervariablen implementieren.



  • @cmoe sagte in Name für neues Objekt aus Stream auslesen?:

    Ich würde einfach nur auf das Objekt und deren Member zugreifen wollen, um mit ihnen zu rechnen

    @manni66 sagte in Name für neues Objekt aus Stream auslesen?:

    Suchst du std::unordered_map<std::string, Schicht> (https://en.cppreference.com/w/cpp/container/unordered_map)?

    Oder doch einfach nur std::vector<Schicht>?

    Klingt gut, aber wie ordne ich in der Map dann das Objekt meinem "Namen" zu? Also wie spreche ich das Objekt an? Einfach via Adresse?

    Guck mal auf den link von @manni66, unten ist ein Beispiel. Es ist nicht das beste für das was du suchst. Wenn du aber auf die member-Funktionen von insert, emplace, try_emplace und find klickst kommen bessere Beispiele. Probiere damit mal ein bisschen rum.

    Ich würde aber dringend zu einem guten Einsteigerbuch raten, sonst macht C++- lernen keinen Spass...

    cu



  • @cmoe Wenn das deine Arbeitsschichten sind dann arbeitest du zuviel...

    Ein paar Fragen, Spalte 1 ist ja der Schlüssel. Ist garantiert das die Namen eindeutig sind. Also das Schicht2 nicht mehrmals vorkommt? Oder wiederholt sich das regelmäßig? Wenn die Zahlen Stunden sind die pro Tag gearbeitet wurden dann gibt es maximal 7 Zahlen pro Zeile. Bei weniger als 7 Arbeitstage sind entsprechend weniger Zahlen. Bei Schicht1 6 Arbeitstage und bei Schicht2 5 (Könnte ja auch ein Tippfehler sein).
    Sehe ich das richtig? Oder hat das alles eine ganz andere Bedeutung?

    Was willst du im Endeffekt erreichen? Die Zahlen pro Schicht addieren und am ende eine Gesamtsumme? Solange das nicht geklärt ist kann man dir nicht passende Container empfehlen.

    cu



  • @dirkski sagte in Name für neues Objekt aus Stream auslesen?:

    @cmoe Wenn das deine Arbeitsschichten sind dann arbeitest du zuviel...

    Sind nicht genau die korrekten Schichtzeiten, aber nicht weit weg davon 😉

    Ein paar Fragen, Spalte 1 ist ja der Schlüssel. Ist garantiert das die Namen eindeutig sind. Also das Schicht2 nicht mehrmals vorkommt? Oder wiederholt sich das regelmäßig? Wenn die Zahlen Stunden sind die pro Tag gearbeitet wurden dann gibt es maximal 7 Zahlen pro Zeile. Bei weniger als 7 Arbeitstage sind entsprechend weniger Zahlen. Bei Schicht1 6 Arbeitstage und bei Schicht2 5 (Könnte ja auch ein Tippfehler sein).
    Sehe ich das richtig? Oder hat das alles eine ganz andere Bedeutung?

    Das siehst du richtig, mein Snippet im ersten Beitrag war nicht originalgetreu übernommen, sondern nur beispielhaft angeführt.
    Jede Zeile besteht aus 8 Werten, wovon der erste Wert der Schlüssel (also nur einmal vorkommend) ist und die sieben darauffolgenden Werte jeweils die Schichtlänge je Wochentag.

    Was willst du im Endeffekt erreichen? Die Zahlen pro Schicht addieren und am ende eine Gesamtsumme?

    Nein, Ziel soll sein, dass anhand eines Dienstplanes (seperat) die Anzahl der insgesamt im Monat geleisteten Stunden errechnet werden soll.
    Daher war mein Gedanke, für jede Schicht ein Objekt zu erzeugen mit 7 Membervariablen, die ich dann zur Berechnung entsprechend abfragen kann. Nur dazu muss ich die Objekte irgendwie ansprechen können...



  • @cmoe Also Zeilenweise einlesen, Werte anhand des Separators ',' aufteilen, erster Wert ist der Schlüssel, restlichen Werte kommen in ein std::array und dies ist dann der Wert des std::unordered_map-Eintrags. So eine map hat eine Schlüssel->Wert Beziehung. Also std::string als Schlüssel und std::array als Wert...

    Dann eine Klasse 'Stundenzettel' drum rum bauen für den bequemen Zugriff. Als eine Möglichkeit...

    Klappt das mit dem aufdröseln der einzelnen Zeilen schon?

    cu

    PS: Guck erstmal das du mit einer Schleife die Datei Zeile für Zeile durchläufst, sie im Schleifenbody aufdröselst und gebe dann mit cout/cerr die einzelnen Felder aus. Der Rest ist dann nicht so schwer. Und poste dann den Code.


Log in to reply