<?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[Daten in struct einlesen, Endekennung]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich möchte aus einer Datei Daten in eine Struktur einlesen und auf dem Bildschirm ausgeben. Es gibt in meinem Minimalbesipiel einen winzigen Fehler (Endekennung wird mit eingelesen), der mir das Leben bei der Weiterverarbeitung der Daten schwer macht.<br />
Hier mein Minimalbeispiel:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;fstream&gt;
using namespace std;

struct test
{
   int alter;
   char name[50];
} person[10];

int main( void )
{
   int n=0;
   ifstream eingabe_datei;
   eingabe_datei.open(&quot;person.dat&quot;, ios::binary|ios::in);

   while (!eingabe_datei.eof()) 
   {
      eingabe_datei &gt;&gt; person[n].alter &gt;&gt; person[n].name;
      cout &lt;&lt; person[n].alter &lt;&lt; &quot; &quot; &lt;&lt; person[n].name &lt;&lt; endl;
      n++;		
   }
   eingabe_datei.close();
}
</code></pre>
<p>Die einzulesende Datei person.dat sieht so aus:</p>
<p>**<br />
30 Paul<br />
32 Stefan<br />
**</p>
<p>Nach Ablauf des obigen Programms bekomme ich aber als Bildschirmausgabe</p>
<p>**<br />
30 Paul<br />
32 Stefan<br />
0<br />
**<br />
Nun zum Fehler: Die Null am Ende stört, da ich die Daten weiterverarbeiten möchte. Ich denke sie kommt von der Endekennung des zuletzt eingelesenen<br />
char name[50].<br />
Hat jemand eine Idee wie ich das Einlesen der Struktur korrekt machen kann ?</p>
<p>Besten Dank für die Hilfe.</p>
<p>Jo</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/292066/daten-in-struct-einlesen-endekennung</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 06:39:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/292066.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 02 Sep 2011 07:03:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Daten in struct einlesen, Endekennung on Fri, 02 Sep 2011 07:03:12 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich möchte aus einer Datei Daten in eine Struktur einlesen und auf dem Bildschirm ausgeben. Es gibt in meinem Minimalbesipiel einen winzigen Fehler (Endekennung wird mit eingelesen), der mir das Leben bei der Weiterverarbeitung der Daten schwer macht.<br />
Hier mein Minimalbeispiel:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;fstream&gt;
using namespace std;

struct test
{
   int alter;
   char name[50];
} person[10];

int main( void )
{
   int n=0;
   ifstream eingabe_datei;
   eingabe_datei.open(&quot;person.dat&quot;, ios::binary|ios::in);

   while (!eingabe_datei.eof()) 
   {
      eingabe_datei &gt;&gt; person[n].alter &gt;&gt; person[n].name;
      cout &lt;&lt; person[n].alter &lt;&lt; &quot; &quot; &lt;&lt; person[n].name &lt;&lt; endl;
      n++;		
   }
   eingabe_datei.close();
}
</code></pre>
<p>Die einzulesende Datei person.dat sieht so aus:</p>
<p>**<br />
30 Paul<br />
32 Stefan<br />
**</p>
<p>Nach Ablauf des obigen Programms bekomme ich aber als Bildschirmausgabe</p>
<p>**<br />
30 Paul<br />
32 Stefan<br />
0<br />
**<br />
Nun zum Fehler: Die Null am Ende stört, da ich die Daten weiterverarbeiten möchte. Ich denke sie kommt von der Endekennung des zuletzt eingelesenen<br />
char name[50].<br />
Hat jemand eine Idee wie ich das Einlesen der Struktur korrekt machen kann ?</p>
<p>Besten Dank für die Hilfe.</p>
<p>Jo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113706</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113706</guid><dc:creator><![CDATA[jo911]]></dc:creator><pubDate>Fri, 02 Sep 2011 07:03:12 GMT</pubDate></item><item><title><![CDATA[Reply to Daten in struct einlesen, Endekennung on Fri, 02 Sep 2011 08:39:07 GMT]]></title><description><![CDATA[<p>Hallo liebe Community,</p>
<p>habe das Problem nun selbst gelöst:</p>
<p>dieser Weg für das Einlesen (Zeile 18) funktioniert einwandfrei und die zusätzliche Null wird nicht ausgegeben:</p>
<pre><code>while(eingabe_datei &gt;&gt; person[n].alter &gt;&gt; person[n].name )
	{
		cout &lt;&lt; person[n].alter &lt;&lt; person[n].name &lt;&lt; endl;
		n++;
	}
</code></pre>
<p>Warum mein stilistisch besserer Ansatz mit</p>
<pre><code>while (!eingabe_datei.eof())
</code></pre>
<p>nicht funktionierte, weiss ich immer noch nicht und würde mich freuen, wenn jemand da eine Idee hätte.<br />
Danke und Grüße, Jo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113736</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113736</guid><dc:creator><![CDATA[jo911]]></dc:creator><pubDate>Fri, 02 Sep 2011 08:39:07 GMT</pubDate></item><item><title><![CDATA[Reply to Daten in struct einlesen, Endekennung on Fri, 02 Sep 2011 08:48:15 GMT]]></title><description><![CDATA[<p>Du öffnest im binary mode. Wenn du Text einliest ist der normale Modus angebracht. Ich gehe mal davon aus dass es daran liegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113740</guid><dc:creator><![CDATA[RedPuma]]></dc:creator><pubDate>Fri, 02 Sep 2011 08:48:15 GMT</pubDate></item><item><title><![CDATA[Reply to Daten in struct einlesen, Endekennung on Fri, 02 Sep 2011 08:52:02 GMT]]></title><description><![CDATA[<p>Hallo RedPuma,</p>
<p>danke für den Tipp, das war auch mein erster Gedanke, aber daran liegt es nicht...wenn man das Binary Flag weglässt ist das Programmverhalten in diesem Fall identisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113748</guid><dc:creator><![CDATA[jo 911]]></dc:creator><pubDate>Fri, 02 Sep 2011 08:52:02 GMT</pubDate></item><item><title><![CDATA[Reply to Daten in struct einlesen, Endekennung on Fri, 02 Sep 2011 09:23:32 GMT]]></title><description><![CDATA[<p>jo911 schrieb:</p>
<blockquote>
<p>Warum mein stilistisch besserer Ansatz mit</p>
<pre><code>while (!eingabe_datei.eof())
</code></pre>
<p>nicht funktionierte, weiss ich immer noch nicht und würde mich freuen, wenn jemand da eine Idee hätte.<br />
Danke und Grüße, Jo</p>
</blockquote>
<p>Das ist doch ganz einfach: <strong>E</strong>nd <strong>o</strong>f <strong>f</strong>ile gibt genau dann <code>true</code> zurück, wenn der Stream am Ende der Datei ist.</p>
<p>EDIT: Ist in deiner Datei wirklich ein Leerzeichen nach dem letzten Namen oder spinnt das Forum?<br />
Bei mir funktioniert <code>eof</code> in Visual C++ mit einer korrekten Datei wie erwartet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113760</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Fri, 02 Sep 2011 09:23:32 GMT</pubDate></item><item><title><![CDATA[Reply to Daten in struct einlesen, Endekennung on Fri, 02 Sep 2011 12:28:50 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>auch ich verwende VC++ (2005). Die Eingabe-Datei ist korrekt, kein Leerzeichen am Ende.<br />
Muss ein anderes Problem sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113872</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113872</guid><dc:creator><![CDATA[jo911]]></dc:creator><pubDate>Fri, 02 Sep 2011 12:28:50 GMT</pubDate></item><item><title><![CDATA[Reply to Daten in struct einlesen, Endekennung on Fri, 02 Sep 2011 12:39:52 GMT]]></title><description><![CDATA[<p>Dein &quot;stilistisch besserer Ansatz&quot; ist ein beliebter Anfängerfehler. Das EOF-Bit des Streams wird erst gesetzt, nachdem eine Leseoperation auf das Dateiende gestoßen ist. Nach der letzten erfolgreichen Leseoperation ist das noch nicht der Fall, also wird die Schleife danach noch einmal betreten. Die Leseoperation in dieser Schleife schlägt dann fehl, das EOF-Bit wird gesetzt und person[n] nicht verändert, daher kommt dann die letzte Ausgabe.</p>
<p>Es ist in der Tat üblich, in solchen Fällen</p>
<pre><code class="language-cpp">while(datei &gt;&gt; daten) {
  ...
}
</code></pre>
<p>zu schreiben. Das prüft dann nicht nur auf das EOF-Bit, sondern auch auf badbit und failbit, so dass man auf die Art nicht in einer Endlosschleife landen kann. Ist wirklich nur die Prüfung auf eof gemeint, so geht</p>
<pre><code class="language-cpp">while((datei &gt;&gt; daten).eof()) {
  ...
}
</code></pre>
<p>...aber das ist nur selten sinnvoll.</p>
<p>Übrigens solltest du in der Schleifenbedingung auch abprüfen, dass du nicht über das Arrayende hinaus schreibst oder besser gleich eine std::deque oder einen std::vector benutzen. Warum du das Array als globale Variable anlegst, ist mir auch nicht klar; so was ist ziemlich schlechter Stil.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113883</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Fri, 02 Sep 2011 12:39:52 GMT</pubDate></item></channel></rss>