<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Klassenattribut nach einlesen überschreiben]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich speichere ein Objekt in eine Datei und lese dieses dann wieder ein.<br />
Das Objekt enthält eine std::list und diese macht Probleme. Diese Liste besitzt beim Speichern 0 Einträge und nach dem einlesen wird auch nur eine leere Liste benötigt.<br />
Das Problem ist, dass die Liste zwar im Debugger richtig als leer angezeigt wird, aber wenn man auf die Liste zugreifen will geht er ins Nirvana.<br />
Wie kann ich nach dem Einlesen, dass Attribut mit einer neuen Liste überschreiben. Es müsste irgendwie über nen Pointer gehen der auf das Attribut zeigt und dann an diese Stelle müsste dann eine leere Liste kommen.</p>
<p>Hoffe ihr versteht, was ich meine.</p>
<p>Danke</p>
<p>MfG<br />
NiBurhe</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/205900/klassenattribut-nach-einlesen-überschreiben</link><generator>RSS for Node</generator><lastBuildDate>Fri, 09 Oct 2026 23:40:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/205900.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 19 Feb 2008 10:19:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klassenattribut nach einlesen überschreiben on Tue, 19 Feb 2008 10:19:17 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich speichere ein Objekt in eine Datei und lese dieses dann wieder ein.<br />
Das Objekt enthält eine std::list und diese macht Probleme. Diese Liste besitzt beim Speichern 0 Einträge und nach dem einlesen wird auch nur eine leere Liste benötigt.<br />
Das Problem ist, dass die Liste zwar im Debugger richtig als leer angezeigt wird, aber wenn man auf die Liste zugreifen will geht er ins Nirvana.<br />
Wie kann ich nach dem Einlesen, dass Attribut mit einer neuen Liste überschreiben. Es müsste irgendwie über nen Pointer gehen der auf das Attribut zeigt und dann an diese Stelle müsste dann eine leere Liste kommen.</p>
<p>Hoffe ihr versteht, was ich meine.</p>
<p>Danke</p>
<p>MfG<br />
NiBurhe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1458690</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458690</guid><dc:creator><![CDATA[NiBurhe]]></dc:creator><pubDate>Tue, 19 Feb 2008 10:19:17 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenattribut nach einlesen überschreiben on Tue, 19 Feb 2008 10:22:25 GMT]]></title><description><![CDATA[<p>poste doch bsp. code</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1458696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458696</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Tue, 19 Feb 2008 10:22:25 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenattribut nach einlesen überschreiben on Tue, 19 Feb 2008 10:49:01 GMT]]></title><description><![CDATA[<p>Kurs.h</p>
<pre><code class="language-cpp">#pragma once
#include &quot;Dozent.h&quot;
#include &quot;Student.h&quot;
#include &lt;string&gt;
#include &lt;list&gt;
 using namespace std;
class Dozent;
class Student;
/*
Diese Klasse stellt einen Kurs dar.
*/
class Kurs
{
private:
	//Das Thema des Kurses.
	std::string _thema;
	//Das Spezialgebiet welches der Dozent benötigt um den Kurs halten zu dürfen.
	std::string _gebiet;
	//Semester für welches der Kurs geeignet ist.
	int _semester;
	//Liste der Studenten die in dem Kurs sind.
	std::list&lt;Student*&gt; _studenten;
	//Der Dozent, der den Kurs liest.
	Dozent *_dozent;
	//Gibt der Anzahl der teilnehmenden Studenten zurück.
	int getAnzahlTeilnehmer();
	//Id des Dozenten zum Speichern.
	int _dozentenId;
	//Id der Studenten zum Speichern.
	int _studentenId[20];

};
</code></pre>
<p>Wobei ich die _studenten beim speichern nich benötigt werden, da es über das Int Array rekonstruiert wird.</p>
<p>Zum einlesen:</p>
<pre><code class="language-cpp">//erzeugt ein studentenobjekt
	Student student(&quot;&quot;,&quot;&quot;,0,0);

	//erzeugt eine studentenliste
	 std::list&lt;Student&gt; liste;
	 //erstellt die betreffenden streams
	 ifstream in(fileN1.data(), ios::binary);
	 ifstream objekte(fileN.data(), ios::binary);

	 //liest die anzahl vorhandener objekte ein
	 objekte.read((char*)&amp;anzahlObjekte,sizeof(anzahlObjekte));

	 //liest die vorhandenen objekte ein und legt sie in der studentenliste ab
	 if(anzahlObjekte&gt;0)
	 {
		for(int i=0;i&lt;anzahlObjekte;i++)
		{
			in.read((char*)&amp;student, sizeof(student));

			liste.push_back(student);
		}
	 }
</code></pre>
<p>Das einlesen in das Kurs Objekt funktioniert, aber das Attribut _studenten des Kurses ist nicht mehr gültigt, dadurch stürzt push_back ab. Daher möchte ich das Attribut _studenten von Kurs durch eine neue leere Liste überschreiben, die Liste die gespeichert wurde ist auch leer gewesen.</p>
<p>Hoffe jetzt ist klarer.</p>
<p>MfG<br />
NiBurhe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1458728</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458728</guid><dc:creator><![CDATA[NiBurhe]]></dc:creator><pubDate>Tue, 19 Feb 2008 10:49:01 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenattribut nach einlesen überschreiben on Tue, 19 Feb 2008 11:25:25 GMT]]></title><description><![CDATA[<p>klar sind vor allem mehrere Dinge:</p>
<p>- du benutzt im header ein using namespace std. Das solltest du dir gleich wieder abgewoehnen, mehr zu dem Thema <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-205799.html" rel="nofollow">hier</a></p>
<p>- an die Mebmer deiner Kurs-Objekte kommt niemand heran, da alles private ist und du keinerlei Methoden definiert hast</p>
<p>- Die Art wie du deine Objekte abspeicherst ist alles andere als portabel, da du Die Objekte so, wie sie intern von deinem Compiler in den Speicher gelegt werden, aus der Datei ausliest, das ist pfui <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> Versuch eventuell erstmal durch Ueberladen von operator&lt;&lt; deine Studenten im Klartext abzuspeichern, wenn das dann klappt, kannst du daran gehen, eine portable binaere Speichermethode zu entwickeln (was nicht unbedingt trivial ist)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1458761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458761</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 19 Feb 2008 11:25:25 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenattribut nach einlesen überschreiben on Tue, 19 Feb 2008 11:29:35 GMT]]></title><description><![CDATA[<p>Hi,<br />
Du benutzt ja beim einlesen die variable _studenten gar nicht.</p>
<p>Du könntest es so machen:</p>
<pre><code class="language-cpp">class Kurs
{
private:
    //Liste der Studenten die in dem Kurs sind.
    std::list&lt;Student&gt; _studenten;
    // ... weitere Deklarationen
};
</code></pre>
<p>In der einlese Funktion:</p>
<pre><code class="language-cpp">//erstellt die betreffenden streams
ifstream in(fileN1.data(), ios::binary);
ifstream objekte(fileN.data(), ios::binary);

//liest die anzahl vorhandener objekte ein
objekte.read((char*)&amp;anzahlObjekte,sizeof(anzahlObjekte));

//liest die vorhandenen objekte ein und legt sie in der studentenliste ab
if(anzahlObjekte&gt;0)
{
   // Lösche alle Objekte aus der Liste vor dem erneuten füllen.
   _studenten.clear();

   for(int i=0;i&lt;anzahlObjekte;i++)
   {
      //erzeugt ein studentenobjekt
      Student student(&quot;&quot;,&quot;&quot;,0,0);
      in.read((char*)&amp;student, sizeof(student));
      _studenten.push_back(student);
   }
}
</code></pre>
<p>So werden die Student Objekte in die Liste kopiert und Du musst dich nicht explizit ums Speicher allozieren/freigeben kümmern. Natürlich müssen die Student Objekte kopierbar sein.</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1458763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458763</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Tue, 19 Feb 2008 11:29:35 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenattribut nach einlesen überschreiben on Tue, 19 Feb 2008 11:43:14 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a></p>
<p>Das mit dem Namespace std stammt so eins zu eins aus der Vorlesung <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Das muss nicht schön sein, es muss erstmal nur funktionieren, dumme unbenotete Testate.</p>
<p>Das Speichern und auslesen an sich funktioniert, das Objekt sieht im Debugger richtig aus. Nur die Liste _studenten macht Probleme, sie scheint zwar im Debugger eine leere Liste zu sein, sobald man aber auf die Liste zugreifen will, schiesst er sich ab. Daher wollte ich die Liste _studenten, die mit ausgelesen wurde, mit einer neuen Liste überschreiben, da ich ja nur eine leere Liste brauche. Er scheint halt eine Speicheradresse für die Liste zu speichern, aber wenn es wieder ausliest ist diese Speicheradresse nicht mehr gültig, deswegen wollte ich ne neue Liste anlegen und die Liste _student dann auf die neue Liste verbiegen, ohne direkt mit einem Zeiger auf eine Liste zu arbeiten, da ich sonst wieder alle Methoden ändern muss, also ein Workarround, nicht schön, aber soll nur funktionieren.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/734">@simon</a><br />
Ne, ich verwende die Variable an sich nicht direkt. Die Variable befindet sich halt im Kurs und wird später über eine andere Methoden und mithilfe des Id arrays wieder befüllt. Deswegen sollte die Liste _studenten im Objekt kurs überschrieben werden.</p>
<p>MfG<br />
NiBurhe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1458771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458771</guid><dc:creator><![CDATA[NiBurhe]]></dc:creator><pubDate>Tue, 19 Feb 2008 11:43:14 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenattribut nach einlesen überschreiben on Tue, 19 Feb 2008 12:05:22 GMT]]></title><description><![CDATA[<p>NiBurhe schrieb:</p>
<blockquote>
<p>Das mit dem Namespace std stammt so eins zu eins aus der Vorlesung <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>Dann hau deinen Prof <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<blockquote>
<p>Das muss nicht schön sein, es muss erstmal nur funktionieren, dumme unbenotete Testate.</p>
</blockquote>
<p>Das mag sein, trotzdem wirst du hier immer wieder<br />
Schoenheitstipps bekommen, denn schoen bedeutet lesbar, leicht wartbar und vor allem schnell verstaendlich. Und wer gleich von Anfang an schoenen (= lesbaren, wartbaren,...) Stil praktiziert, quaelt spaeter sich (und uns) nicht mit grausamem hack&amp;slay-Code <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<blockquote>
<p>Das Speichern und auslesen an sich funktioniert, das Objekt sieht im Debugger richtig aus. Nur die Liste _studenten macht Probleme, sie scheint zwar im Debugger eine leere Liste zu sein, sobald man aber auf die Liste zugreifen will, schiesst er sich ab. Daher wollte ich die Liste _studenten, die mit ausgelesen wurde, mit einer neuen Liste überschreiben, da ich ja nur eine leere Liste brauche. Er scheint halt eine Speicheradresse für die Liste zu speichern, aber wenn es wieder ausliest ist diese Speicheradresse nicht mehr gültig, deswegen wollte ich ne neue Liste anlegen und die Liste _student dann auf die neue Liste verbiegen, ohne direkt mit einem Zeiger auf eine Liste zu arbeiten, da ich sonst wieder alle Methoden ändern muss, also ein Workarround, nicht schön, aber soll nur funktionieren.</p>
</blockquote>
<p>Das Listenobjekt das du in deinem Kurs-Objekt hast, verwaltet intern seine Insassen mit Pointern. Die werden natuerlich ungueltig, sobald du das Objekt abspeicherst. Auch deshalb int das bitweise kopieren von Objekten aus dem Speicher in Dateien wirklich sehr, sehr, sehr, sehr unschoen. Mich wundert eh, dass das bisher bei dir funktioniert hat, schliesslich scheinen die Studenten-Objekte auch entweder const char* oder std::string-Member zu besitzen, die auch intern pointer besitzen, weshalb das bitweise Abspeichern und Auslesen in der Datei schiefegehn sollte (es sei denn du benutzt in student char-Arrays fester Laenge, was wiederum auch ein no-go in C++ ist).</p>
<p>Zeig uns doch mal den restlichen Code, also die Methoden von Kurs. Denn irgendwie scheinst du ja auf die Innereien von Kurs-Objekten Einfluss nehmen zu koennen.</p>
<p>Noch zwei Anmerkugnen:</p>
<ol>
<li>Die Liste die du beim Auslesen der Datei benutzt und die Liste _studenten in deiner Kurs-Klasse haben verschiedenen Typ. Die eine speichert studenten, die andere pointer auf studenten!</li>
<li>vermeide fuehrende Unterstriche bei Variablennamen (z.B. _studenten, _Dozent etc.) einige Bezeichner mit fuehrenden Unterstrichen (und auch mit doppelten Untestrichen innerhalb des Namens) sind fuer die Compiler reserviert. Daher ist es besser, sich fuehrende Unterstriche von vornherein grundsaetzlich abzugewoehnen, bevor man irgendwann Stunden damit verbringt, einen subtilen Bug zu finden, der entstehen kann, wenn z.B. ein Compiler ein Makro definiert hat das man unbewusst benutzt hat.</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1458783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458783</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 19 Feb 2008 12:05:22 GMT</pubDate></item></channel></rss>