<?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[chars aus Binary File einlesen - EOF wird nicht gesetzt [gelößt und erklärt]]]></title><description><![CDATA[<p>Hallo,<br />
ich muss eine Datei einlesen (selbst erstellt in anderem Programmteil), die<br />
einfach nur char Werte enthält. Öffne ich die Datei bspw. im Editor werden die<br />
Chars korrekt angezeigt. Schaue ich mir im Debugmodus den Inhalt des ifstream buffers an,<br />
enthält er die gewünschten Werte. Von dieser Seite müsste eigentlich alles in Ordnung sein.<br />
Leider stürzt das Programm aber beim Einlesen dieser Datei ab, weil es die Schleife zum Beenden des Einlesevorgangs nicht verlässt.</p>
<p>Ich habe lange gesucht und Bücher Internet und das Forum befragt, aber sehe den Fehler einfach nicht.<br />
Es wäre eine super Sache, wenn irgendjemand mir weiterhelfen könnte. Danke</p>
<p>Mein Code sieht wie folgt aus</p>
<pre><code class="language-cpp">namespace boost::filesystem = fs;

list&lt;char&gt; ReadFile ( const fs::path filePath ){
   fs::basic_ifstream&lt;char&gt; fileStream( filePath, ios::in | ios::binary );
   // Throw exceptions in case badbit or failbit is set
   fileStream.exceptions( ios_base::badbit | ios_base::failbit );
   list&lt;char&gt; returnList;

   while (!fileStream.eof())
   {
      char c;
      // the program is aborted here when it tries get() after all chars of the file have been read
      // instead it should throw an exception or even better - end the loop
      if (fileStream.get( c ).fail() == false)
          returnList.push_back( c );
   }
return returnList;
}
</code></pre>
<p>und hier der Aufruf der Methode</p>
<pre><code class="language-cpp">try{
list&lt; char &gt; charList = ReadFile( filePath );
}
catch( const ios_base::failure&amp; e)
{
/// irgendwas
}
catch( const exception&amp; e)
{
/// irgendwas
}
</code></pre>
<p>Ich habe mehrere Probleme:</p>
<ul>
<li>EOF wird nicht gesetzt. Die Testdatei enthält 6 char Einträge, und ich kann im Debugmodus die Schleife<br />
auch genau 6 mal betreten, beim 7ten Leseversuch stürzt das Programm ab</li>
<li>es werden keine Exceptions geworfen</li>
<li>auch wenn ich ios_base::eof zu den gewünschten Exceptions hinzufüge wird keine Exception geworfen.</li>
</ul>
<p>Hat irgendjemand vielleicht eine Idee woran das liegen könnte ?</p>
<p>Danke schonmal...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/272108/chars-aus-binary-file-einlesen-eof-wird-nicht-gesetzt-gelößt-und-erklärt</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 01:16:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/272108.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 10 Aug 2010 16:13:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to chars aus Binary File einlesen - EOF wird nicht gesetzt [gelößt und erklärt] on Wed, 11 Aug 2010 10:12:36 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich muss eine Datei einlesen (selbst erstellt in anderem Programmteil), die<br />
einfach nur char Werte enthält. Öffne ich die Datei bspw. im Editor werden die<br />
Chars korrekt angezeigt. Schaue ich mir im Debugmodus den Inhalt des ifstream buffers an,<br />
enthält er die gewünschten Werte. Von dieser Seite müsste eigentlich alles in Ordnung sein.<br />
Leider stürzt das Programm aber beim Einlesen dieser Datei ab, weil es die Schleife zum Beenden des Einlesevorgangs nicht verlässt.</p>
<p>Ich habe lange gesucht und Bücher Internet und das Forum befragt, aber sehe den Fehler einfach nicht.<br />
Es wäre eine super Sache, wenn irgendjemand mir weiterhelfen könnte. Danke</p>
<p>Mein Code sieht wie folgt aus</p>
<pre><code class="language-cpp">namespace boost::filesystem = fs;

list&lt;char&gt; ReadFile ( const fs::path filePath ){
   fs::basic_ifstream&lt;char&gt; fileStream( filePath, ios::in | ios::binary );
   // Throw exceptions in case badbit or failbit is set
   fileStream.exceptions( ios_base::badbit | ios_base::failbit );
   list&lt;char&gt; returnList;

   while (!fileStream.eof())
   {
      char c;
      // the program is aborted here when it tries get() after all chars of the file have been read
      // instead it should throw an exception or even better - end the loop
      if (fileStream.get( c ).fail() == false)
          returnList.push_back( c );
   }
return returnList;
}
</code></pre>
<p>und hier der Aufruf der Methode</p>
<pre><code class="language-cpp">try{
list&lt; char &gt; charList = ReadFile( filePath );
}
catch( const ios_base::failure&amp; e)
{
/// irgendwas
}
catch( const exception&amp; e)
{
/// irgendwas
}
</code></pre>
<p>Ich habe mehrere Probleme:</p>
<ul>
<li>EOF wird nicht gesetzt. Die Testdatei enthält 6 char Einträge, und ich kann im Debugmodus die Schleife<br />
auch genau 6 mal betreten, beim 7ten Leseversuch stürzt das Programm ab</li>
<li>es werden keine Exceptions geworfen</li>
<li>auch wenn ich ios_base::eof zu den gewünschten Exceptions hinzufüge wird keine Exception geworfen.</li>
</ul>
<p>Hat irgendjemand vielleicht eine Idee woran das liegen könnte ?</p>
<p>Danke schonmal...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938412</guid><dc:creator><![CDATA[zitroneneis]]></dc:creator><pubDate>Wed, 11 Aug 2010 10:12:36 GMT</pubDate></item><item><title><![CDATA[Reply to chars aus Binary File einlesen - EOF wird nicht gesetzt [gelößt und erklärt] on Tue, 10 Aug 2010 17:10:19 GMT]]></title><description><![CDATA[<p>ich korrigieren mich:</p>
<p>Setzte ich die Schleife direkt in einen Try Catch Block<br />
wird eine exception geworden<br />
( ich habe auch versucht boost::filesystem::filesystem_error exceptions zu catchen)</p>
<p>mit dem Code</p>
<pre><code class="language-cpp">catch( const ios_base::failure&amp; e){
        std::cout &lt;&lt; &quot;type: &quot; &lt;&lt; typeid(e).name() &lt;&lt; std::endl;
        std::cout &lt;&lt; &quot;message: &quot; &lt;&lt; e.what() &lt;&lt; std::endl;
}
</code></pre>
<p>gibt sie folgendes von sich preis:</p>
<blockquote>
<p>type: NSt8ios_base7failureE<br />
message: basic_ios::clear</p>
</blockquote>
<p>Das hilft mir aber leider nicht dabei weiter, zu verstehen was an meinem Code<br />
falsch ist...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938418</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938418</guid><dc:creator><![CDATA[zitroneneis]]></dc:creator><pubDate>Tue, 10 Aug 2010 17:10:19 GMT</pubDate></item><item><title><![CDATA[Reply to chars aus Binary File einlesen - EOF wird nicht gesetzt [gelößt und erklärt] on Wed, 11 Aug 2010 10:12:11 GMT]]></title><description><![CDATA[<p><strong>Nach einiger Testerei hier die Erklärung für das Verhalten</strong>:</p>
<p>der Befehl</p>
<pre><code class="language-cpp">// Werfe eine Exception sobald eines der Flags gesetzt wird
fileStream.exceptions( ios_base::badbit | ios_base::failbit  );
try{
        while (!fileStream.eof())
        {
            char c;
            // get( c ) setzt das Failbit wenn kein Zeichen mehr gelesen werden kann und returned EOF
            // sobald das Failbit gesetzt ist, wird die Exception geworfen und die Schleife verlassen
            if ( (fileStream.get( c ).fail() ) == false)
                content.push_back( c );
        }
    }
    catch( const ios_base::failure&amp; e){
        std::cout &lt;&lt; &quot;type: &quot; &lt;&lt; typeid(e).name() &lt;&lt; std::endl;
        std::cout &lt;&lt; &quot;message: &quot; &lt;&lt; e.what() &lt;&lt; std::endl;
    }
</code></pre>
<p>Sofern mit Exceptions gearbeitet wird macht das die While Schleife überflüssig</p>
<p>Lässt man die Exceptions ausgeschaltet ist der Folgende Code korrekt</p>
<pre><code class="language-cpp">while (!fileStream.eof())
   {
      char c;
      // Versuche das nächste Zeichen als char einzulesen. Tritt hierbei kein Fehler auf füge es zur Liste hinzu.
      // Kann kein weiteres Zeichen gelesen werden wird das Failbit und EOF gesetzt
      // beim nächsten Durchlauf der While Schleife wird die Eingangs-Bedinung nicht 
      // mehr erfüllt und der Einlesevorgang beendet
      if ( (fileStream.get( c ).fail() ) == false)
                content.push_back( c );        
        }
    }
</code></pre>
<p><strong>Fazit:</strong></p>
<ul>
<li>Wenn man mit Exceptions arbeitet ist eine While Schleife zur Abfrage des EOF Bits überflüssig,<br />
weil die Exception geworfen wird sobald das Bit gesetzt wird.</li>
<li>Es wird bei jedesmal eine Exception geworfen, sobald das Ende einer Datei erreicht ist, wenn man</li>
</ul>
<pre><code class="language-cpp">.exceptions( ios_base::failbit );
</code></pre>
<p>setzt.<br />
( Failbit gesetzt bedeutet: nächste Operation geht schief )</p>
<ul>
<li>Es empfiehlt sich, nur eine Exception zu werfen, wenn das badbit gesetzt ist,</li>
</ul>
<pre><code class="language-cpp">.exceptions( ios_base::badbit );
</code></pre>
<p>weil auf diese Weise nur im wirklichen Fehlerfall Exceptions geworfen werden, und ansonsten ´<br />
die oben gezeigte Schleife sich um das Einlesen bis zum Dateieinde kümmert.<br />
( Badbit gesetzt bedeutet: Stream ist nicht mehr verwendbar )</p>
<ul>
<li>Wenn man ohne Exceptions arbeitet kann man das Failbit benutzen um zu überprüfen, ob ein Zeichen<br />
korrekt eingelesen wurde, und eine While Schleife die EOF abfragt, um das Dateiende zu finden</li>
</ul>
<p>Vielleichts hilfts ja irgendjemand mal weiter <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>Gruß<br />
zitroneneis</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938610</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938610</guid><dc:creator><![CDATA[zitroneneis]]></dc:creator><pubDate>Wed, 11 Aug 2010 10:12:11 GMT</pubDate></item></channel></rss>