<?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[Objekte in Datei schreiben und wieder lesen bringt zusätzlichen leeren Eintrag]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>im Rahmen meines Studiums sitze ich an einer Uebungsklausur und schreibe<br />
Objekte in eine Datei. Das funktioniert auch ohne Probleme, Probleme bereitet<br />
nur das Lesen aus der Datei: da wird ein &quot;leeres&quot; bzw. Objekt ohne Namen angelegt und in die STL List eingetragen.<br />
Die Objekte sind von folgendem Typ:</p>
<pre><code class="language-cpp">Town::Town(string &amp;_name)
{
name = _name; size=1; money=1; research=1; luxuryGoods=1; rundenGespielt=0;
}
</code></pre>
<p>Funktion um Objekte aus der Liste zu holen:</p>
<pre><code class="language-cpp">{
ofstream outFile( &quot;towns.dta&quot;, ios_base::binary |  ios_base::out  ); // write
list&lt;Town&gt;::iterator iter;
if(!outFile){
   cerr &lt;&lt; &quot;Fehler Datei konnte nicht geoeffnet werden.&quot; &lt;&lt; endl;
}
for(iter = allTowns.begin(); iter != allTowns.end(); ++iter ){
   cout &lt;&lt; &quot;Sichern...&quot; &lt;&lt; endl;
   Town tempTown = *iter;	
   tempTown.write(outFile);
}
outFile.close();
cout &lt;&lt; &quot; Die Staedte wurden gespeichert!\n\n&quot;;
break;
}
</code></pre>
<p>Funktion um die Objekte in die Datei zu schreiben:</p>
<pre><code class="language-cpp">ostream &amp; Town::write(ostream &amp; os)
{
os &lt;&lt; name &lt;&lt; '\0'; // write string
// write 5 int starting at address of name
os.write( reinterpret_cast&lt; char* &gt;(&amp;size), 5 * sizeof( int ) );
return os;
}
</code></pre>
<p>Analog dazu zurück pushen in die Liste:</p>
<pre><code class="language-cpp">{
ifstream inFile( &quot;towns.dta&quot;, ios_base::binary |  ios_base::in ); //  read
if(!inFile){
	cerr &lt;&lt; &quot;Fehler Datei konnte nicht geoeffnet werden.&quot; &lt;&lt; endl;
}
else{
   while (!(inFile.eof()) )
         {
         Town tempTown(_name);					
	cout &lt;&lt; &quot; Laden....&quot; &lt;&lt; endl;
	tempTown.read(inFile);
	allTowns.push_back(tempTown);
	}
inFile.close();
}
</code></pre>
<p>und die Funktion zum Lesen:</p>
<pre><code class="language-cpp">istream &amp; Town::read(istream &amp; is)
{
Town tempTown;
getline( is, name, '\0' ); // read string 
// read 5 int starting at address of name 
is.read( reinterpret_cast&lt; char* &gt;(&amp;size), 5* sizeof( int ) ); 
return is;
}
</code></pre>
<p>Ergebnis des ganzen ist, dass ich zwar alle Objekte in die Datei reinschreiben<br />
kann, aber eins mehr als drin stehen ausgelesen wird.<br />
Kann mir jemand helfen?<br />
Wo ist mein Fehler?</p>
<p>Gruß Alex</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/184075/objekte-in-datei-schreiben-und-wieder-lesen-bringt-zusätzlichen-leeren-eintrag</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Apr 2026 18:29:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/184075.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 12 Jun 2007 07:58:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Objekte in Datei schreiben und wieder lesen bringt zusätzlichen leeren Eintrag on Tue, 12 Jun 2007 07:58:45 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>im Rahmen meines Studiums sitze ich an einer Uebungsklausur und schreibe<br />
Objekte in eine Datei. Das funktioniert auch ohne Probleme, Probleme bereitet<br />
nur das Lesen aus der Datei: da wird ein &quot;leeres&quot; bzw. Objekt ohne Namen angelegt und in die STL List eingetragen.<br />
Die Objekte sind von folgendem Typ:</p>
<pre><code class="language-cpp">Town::Town(string &amp;_name)
{
name = _name; size=1; money=1; research=1; luxuryGoods=1; rundenGespielt=0;
}
</code></pre>
<p>Funktion um Objekte aus der Liste zu holen:</p>
<pre><code class="language-cpp">{
ofstream outFile( &quot;towns.dta&quot;, ios_base::binary |  ios_base::out  ); // write
list&lt;Town&gt;::iterator iter;
if(!outFile){
   cerr &lt;&lt; &quot;Fehler Datei konnte nicht geoeffnet werden.&quot; &lt;&lt; endl;
}
for(iter = allTowns.begin(); iter != allTowns.end(); ++iter ){
   cout &lt;&lt; &quot;Sichern...&quot; &lt;&lt; endl;
   Town tempTown = *iter;	
   tempTown.write(outFile);
}
outFile.close();
cout &lt;&lt; &quot; Die Staedte wurden gespeichert!\n\n&quot;;
break;
}
</code></pre>
<p>Funktion um die Objekte in die Datei zu schreiben:</p>
<pre><code class="language-cpp">ostream &amp; Town::write(ostream &amp; os)
{
os &lt;&lt; name &lt;&lt; '\0'; // write string
// write 5 int starting at address of name
os.write( reinterpret_cast&lt; char* &gt;(&amp;size), 5 * sizeof( int ) );
return os;
}
</code></pre>
<p>Analog dazu zurück pushen in die Liste:</p>
<pre><code class="language-cpp">{
ifstream inFile( &quot;towns.dta&quot;, ios_base::binary |  ios_base::in ); //  read
if(!inFile){
	cerr &lt;&lt; &quot;Fehler Datei konnte nicht geoeffnet werden.&quot; &lt;&lt; endl;
}
else{
   while (!(inFile.eof()) )
         {
         Town tempTown(_name);					
	cout &lt;&lt; &quot; Laden....&quot; &lt;&lt; endl;
	tempTown.read(inFile);
	allTowns.push_back(tempTown);
	}
inFile.close();
}
</code></pre>
<p>und die Funktion zum Lesen:</p>
<pre><code class="language-cpp">istream &amp; Town::read(istream &amp; is)
{
Town tempTown;
getline( is, name, '\0' ); // read string 
// read 5 int starting at address of name 
is.read( reinterpret_cast&lt; char* &gt;(&amp;size), 5* sizeof( int ) ); 
return is;
}
</code></pre>
<p>Ergebnis des ganzen ist, dass ich zwar alle Objekte in die Datei reinschreiben<br />
kann, aber eins mehr als drin stehen ausgelesen wird.<br />
Kann mir jemand helfen?<br />
Wo ist mein Fehler?</p>
<p>Gruß Alex</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1303728</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1303728</guid><dc:creator><![CDATA[ak998481]]></dc:creator><pubDate>Tue, 12 Jun 2007 07:58:45 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte in Datei schreiben und wieder lesen bringt zusätzlichen leeren Eintrag on Tue, 12 Jun 2007 13:02:23 GMT]]></title><description><![CDATA[<p>eof() schlägt erst Alarm, wenn du versuchst, jenseits des Dateiendes zu lesen. Das bedeutet, nach dem Einlesen des letzten Eintrags ist der Stream noch in Ordnung, im nächsten Schleifendurchlauf scheitert der read()-Aufruf und du hast einen gesperrten Stream und ein ungültiges Objekt - da mußt du abbrechen, bevor es weiterverarbeitet wird:</p>
<pre><code class="language-cpp">while (inFile)
         {
         Town tempTown(_name);                    
    cout &lt;&lt; &quot; Laden....&quot; &lt;&lt; endl;
    tempTown.read(inFile);
    if(!inFile) break;
    allTowns.push_back(tempTown);
}
</code></pre>
<p>oder noch besser:</p>
<pre><code class="language-cpp">Town tempTown;
while(tempTown.read(inFile))
{
  cout&lt;&lt;&quot;Laden...&quot;&lt;&lt;endl;
  allTowns.push_back(tempTown);
}
</code></pre>
<p>PS: Und übrigens solltest du nicht nur das eofbit abfragen, sondern alle Fehlerbits - sonst landest du in einer Endlosschleife, wenn ein Lesefehler auftritt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1303986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1303986</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 12 Jun 2007 13:02:23 GMT</pubDate></item></channel></rss>