<?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[Automatisches Schließen mit ofstream?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich komme einfach nicht mehr weiter. Ich habe mir eine Klasse geschrieben, welche mit I/O-Aufgaben vereinfachen soll.<br />
Insbesondere hat diese Klasse einen Zeiger auf ein ofstream Objekt. Im Konstruktor, welchen ich einen Dateinamen übergebe, wird dieses stream Objekt initialisiert und geöffnet. Innerhalb des Konstruktors ist alles gut (ich kann sogar Testausgaben fahren). Sobald ich aber da herauskomme, wird der stream geschlossen. o_O Das verwirrt mich doch sehr</p>
<p>Zur Verdeutlichung:</p>
<p>Konstruktor:</p>
<pre><code>IOWriter::IOWriter(char* const fName)
{
  stream = new std::ofstream(fName, std::ios::out | std::ios::binary);
  opened = true;

  // Test sachen
  if (stream == NULL)
    std::cout &lt;&lt; &quot;Error &quot; &lt;&lt; std::endl;
  else 
    if (!(stream-&gt;is_open()))
       std::cout &lt;&lt; &quot;Error, not open &quot; &lt;&lt; std::endl;
    else 
      std::cout &lt;&lt; &quot;Stream opened &quot; &lt;&lt; std::endl;

  *stream &lt;&lt; 1 &lt;&lt; 2; // dies wird ohne probleme geschrieben
}
</code></pre>
<p>Mein Aufrufprogramm:</p>
<pre><code>IOWriter iow(&quot;C:\\test.bin&quot;&quot;);
  iow.isOpen();
</code></pre>
<p>Wobei</p>
<pre><code>IOWriter::isOpen()
{
  if (stream-&gt;is_open())
    std::cout &lt;&lt; &quot;is open&quot; &lt;&lt; std::endl;
  else
    std::cout &lt;&lt; &quot;not open&quot; &lt;&lt; std::endl;
}
</code></pre>
<p>mir immer not open liefert.<br />
Somit kann ich natürlich nicht mehr einfach weitergehend schreiben. Weiss jemand Rat? Ist das beabsichtigt? Übersehe ich irgendetwas?</p>
<p>Vielen Dank im Voraus für jegliche hilfreiche Hinweise.</p>
<p>Mat</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/168817/automatisches-schließen-mit-ofstream</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 16:19:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/168817.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 28 Dec 2006 11:09:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Automatisches Schließen mit ofstream? on Thu, 28 Dec 2006 11:12:18 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich komme einfach nicht mehr weiter. Ich habe mir eine Klasse geschrieben, welche mit I/O-Aufgaben vereinfachen soll.<br />
Insbesondere hat diese Klasse einen Zeiger auf ein ofstream Objekt. Im Konstruktor, welchen ich einen Dateinamen übergebe, wird dieses stream Objekt initialisiert und geöffnet. Innerhalb des Konstruktors ist alles gut (ich kann sogar Testausgaben fahren). Sobald ich aber da herauskomme, wird der stream geschlossen. o_O Das verwirrt mich doch sehr</p>
<p>Zur Verdeutlichung:</p>
<p>Konstruktor:</p>
<pre><code>IOWriter::IOWriter(char* const fName)
{
  stream = new std::ofstream(fName, std::ios::out | std::ios::binary);
  opened = true;

  // Test sachen
  if (stream == NULL)
    std::cout &lt;&lt; &quot;Error &quot; &lt;&lt; std::endl;
  else 
    if (!(stream-&gt;is_open()))
       std::cout &lt;&lt; &quot;Error, not open &quot; &lt;&lt; std::endl;
    else 
      std::cout &lt;&lt; &quot;Stream opened &quot; &lt;&lt; std::endl;

  *stream &lt;&lt; 1 &lt;&lt; 2; // dies wird ohne probleme geschrieben
}
</code></pre>
<p>Mein Aufrufprogramm:</p>
<pre><code>IOWriter iow(&quot;C:\\test.bin&quot;&quot;);
  iow.isOpen();
</code></pre>
<p>Wobei</p>
<pre><code>IOWriter::isOpen()
{
  if (stream-&gt;is_open())
    std::cout &lt;&lt; &quot;is open&quot; &lt;&lt; std::endl;
  else
    std::cout &lt;&lt; &quot;not open&quot; &lt;&lt; std::endl;
}
</code></pre>
<p>mir immer not open liefert.<br />
Somit kann ich natürlich nicht mehr einfach weitergehend schreiben. Weiss jemand Rat? Ist das beabsichtigt? Übersehe ich irgendetwas?</p>
<p>Vielen Dank im Voraus für jegliche hilfreiche Hinweise.</p>
<p>Mat</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1198906</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1198906</guid><dc:creator><![CDATA[Matrim]]></dc:creator><pubDate>Thu, 28 Dec 2006 11:12:18 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches Schließen mit ofstream? on Thu, 28 Dec 2006 11:53:56 GMT]]></title><description><![CDATA[<p>Kleiner Hinweis: Der Vergleich &quot;stream == NULL&quot; ist unnnötig, da der Fall &quot;stream == NULL&quot; nie auftreten kann. Wenn 'new' nicht funktioniert, wird ansonsten ein Fehler geworfen, es sei denn, du verwendest explizit den parameter 'std::nothrow' beim Aufruf von 'new'.</p>
<p>Der Rest sollte eigentlich funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1198922</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1198922</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Thu, 28 Dec 2006 11:53:56 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches Schließen mit ofstream? on Thu, 28 Dec 2006 14:06:16 GMT]]></title><description><![CDATA[<p>Ja,</p>
<p>sollte eigentlich =(.</p>
<p>Ich werde einfach noch mal per Hand von Neuen entwerfen, vielleicht finde ich irgendwo einen Haken. Danke soweit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1199023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1199023</guid><dc:creator><![CDATA[Matrim]]></dc:creator><pubDate>Thu, 28 Dec 2006 14:06:16 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches Schließen mit ofstream? on Tue, 02 Jan 2007 07:36:53 GMT]]></title><description><![CDATA[<p>Kleine Randfrage: Warum legst du den Stream überhaupt auf dem Heap ab? So groß sind die Streams nicht, da kannst du sie auch direkt in deine Klasse einfügen.</p>
<p>Ansonsten schließt sich ein Stream eigentlich nur, wenn du es ihm sagst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1200926</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1200926</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 02 Jan 2007 07:36:53 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches Schließen mit ofstream? on Tue, 02 Jan 2007 08:53:37 GMT]]></title><description><![CDATA[<p>Es ging mir darum, dass ich schon vorher in dem Stream gelesen/geschrieben habe und bzw. von anderer Stelle aus.</p>
<p>Im Moment habe ich es hinbekommen, dass er sich nicht schliesst. Allerdings habe ich immer noch ein Problem beim [edit] Lesen [/edit]:</p>
<pre><code>*stream &gt;&gt; buf;
</code></pre>
<p>Setzt den Dateizeiger nicht weiter, falls ich diesen Code mehrfach hintereinander ausführe, lese ich ein und dasselbe Byte eben auch mehrfach. Erst:</p>
<pre><code>*stream &gt;&gt; buf;
stream-&gt;seekg(1);
</code></pre>
<p>verschafft diesem Abhilfe. Ist das so richtig?</p>
<p>Danke für die Hilfe soweit,<br />
Mat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1200945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1200945</guid><dc:creator><![CDATA[Matrim]]></dc:creator><pubDate>Tue, 02 Jan 2007 08:53:37 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches Schließen mit ofstream? on Tue, 02 Jan 2007 08:50:13 GMT]]></title><description><![CDATA[<p>Mit &gt;&gt; schreibst du überhaupt nicht, sondern liest Daten aus dem Stream ein. Und eigentlich sollte das auch den Lesezeiger weiterschieben. Probleme könntest du höchstens bekommen, wenn du den selben Stream sowohl zum Lesen als auch zum Schreiben verwendest (bei den C-Funktionen mußt du das File zwischendurch neu positionieren, und vermutlich arbeiten die C++ Stream-Methoden ähnlich).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1200951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1200951</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 02 Jan 2007 08:50:13 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches Schließen mit ofstream? on Tue, 02 Jan 2007 08:56:49 GMT]]></title><description><![CDATA[<p>Ja, war ein Schreibfehler, meinte natürlich lesen.<br />
Und ja &gt;&gt; sollte eigentlich den Zeiger weiterstellen. Lustigerweise passiert es aber bei mir nicht. Innerhalb meiner Klasse erzeuge ich mit</p>
<pre><code>stream = new std::ifstream();
  stream-&gt;open(fileName, std::ios::in |std::ios::binary);
</code></pre>
<p>den Stream (in meinem Testfall wird exklusiv nur auf diesen zugegriffen).</p>
<p>Beim entsprechenden Aufruf von readByte (s.o.) wird nun der Lesezeiger leider nicht weitergerückt. Ich dachte vielleicht, dass schon mal jemand so ein Problem hatte. Vielleicht ist ja auch an meinem System was kaputt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":-("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1200954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1200954</guid><dc:creator><![CDATA[Matrim]]></dc:creator><pubDate>Tue, 02 Jan 2007 08:56:49 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches Schließen mit ofstream? on Tue, 02 Jan 2007 09:10:24 GMT]]></title><description><![CDATA[<p>Zeig doch mal etwas mehr Code. Aus den vorhandenen Fragmenten kann man immer noch nicht sehr viel erkennen. (mein Tip ist ja, daß du auf einen Lesefehler (oder EOF) gestoßen bist und deshalb nicht weiterlesen kannst)</p>
<p>PS: Und nebenbei solltest du mir mal erklären, was das new dort zu suchen hat?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1200960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1200960</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 02 Jan 2007 09:10:24 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches Schließen mit ofstream? on Tue, 02 Jan 2007 09:31:44 GMT]]></title><description><![CDATA[<p>Also, dann mach ich mal der Reihe nach:</p>
<p>Meine Klasse sieht im Moment wie folgt aus:</p>
<pre><code>#ifndef BITREADER_H
#define BITREADER_H

#include &lt;fstream&gt;
#include &lt;limits&gt;

class BitReader
{
public:
  BitReader();
  BitReader(const char *fileName);
  BitReader(std::ifstream *stream);

  unsigned char BitReader::readBit();
  unsigned int BitReader::readInt(unsigned short numBits);

  virtual ~BitReader(void);

private:
  std::ifstream *stream;
  char buf;
  unsigned char hbc;
  short pos;
  bool opened;
  void BitReader::readBuffer();
};
#endif // BITREADER_H
</code></pre>
<p>Der relevante Implementationsteil:</p>
<pre><code>BitReader::BitReader(const char *fileName)
{
  stream = new std::ifstream();
  stream-&gt;open(fileName, std::ios::in |std::ios::binary);

  buf = 0x00;
  pos = 0;
  opened = true;
  this-&gt;readBuffer();
}
</code></pre>
<p>Das new ist dazu da, um ein Objekt ifstream im Speicher anzulegen?</p>
<p>Weiter:</p>
<pre><code>void BitReader::readBuffer()
{
  stream-&gt;seekg(1); // &lt;-- glitch
  stream-&gt;read(&amp;buf, sizeof(buf));

  // *stream &gt;&gt; buf;
  pos = 0;
}
</code></pre>
<p>(edit)<br />
Ach halt, ich war nicht ganz deutlich:<br />
stream-&gt;seekg(1) setzt den immer von der gleichen Position eines weiter, so dass ich mit obiger Variante nicht immer ein Byte weiterlese, sondern immer das 2. Das was man nun machen könnte, einen Zähler einbauen und um diesen dann weiterzuzählen. Aber das sollte ja eigentlich nicht nötig sein, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1200969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1200969</guid><dc:creator><![CDATA[Matrim]]></dc:creator><pubDate>Tue, 02 Jan 2007 09:31:44 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches Schließen mit ofstream? on Tue, 02 Jan 2007 09:32:48 GMT]]></title><description><![CDATA[<p>Abgesehen davon, daß in der Klassendeklaration die &quot;BitReader::&quot; Angaben überflüssig ist, sieht das doch recht gut aus (eventuell solltest du das seekg() weglassen, damit schiebst du den Lesezeiger immer wieder zurück auf die selbe Position).</p>
<blockquote>
<p>Das new ist dazu da, um ein Objekt ifstream im Speicher anzulegen?</p>
</blockquote>
<p>Dann bleibt immer noch die Frage: Warum packst du deinen Stream auf den Heap? Als (direkter) Member der BitReader-Klasse wäre der viel besser aufgehoben.</p>
<p>(PS: Ich weiß vermutlich besser als du, was new macht. Aber ich will von dir wissen, warum du es verwendest ;))</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1200973</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1200973</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 02 Jan 2007 09:32:48 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches Schließen mit ofstream? on Tue, 02 Jan 2007 09:49:12 GMT]]></title><description><![CDATA[<p>Ja, aber wie gesagt, ich wollte der Klasse auch einen Zeiger auf das stream Objekt übergeben. Dann ist wohl auch eine Übergabe per Referenz besser, oder?</p>
<p>Mit dem seek hast du recht, wollte es eigentlich relativ immer um eines verschieben. Lasse ich das seekg weg, liest er halt immer wieder das 1. Byte ein.</p>
<p>(Und ja, du weisst natürlich besser, was ein new zu bedeuten hat. Aber du hast ja gefragt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
<p>(edit)</p>
<p>Nun weiss ich, warum ich es mit Zeigern gelöst hatte...<br />
Da stream als privat deklariert ist, kann ich keine Referenz darauf übergeben (?).</p>
<p>error C2249: 'std::basic_ios&lt;_Elem,_Traits&gt;::operator =' : no accessible path to private member declared in virtual base 'std::basic_ios&lt;_Elem,_Traits&gt;'</p>
<p>bzw:</p>
<p>D:\Programme\Microsoft Visual Studio 8\VC\include\fstream(548) : error C2248: 'std::basic_streambuf&lt;_Elem,_Traits&gt;::operator =' : cannot access private member declared in class 'std::basic_streambuf&lt;_Elem,_Traits&gt;'<br />
with<br />
[<br />
_Elem=char,<br />
_Traits=std::char_traits&lt;char&gt;<br />
]<br />
D:\Programme\Microsoft Visual Studio 8\VC\include\streambuf(23) : see declaration of 'std::basic_streambuf&lt;_Elem,_Traits&gt;::operator ='<br />
with<br />
[<br />
_Elem=char,<br />
_Traits=std::char_traits&lt;char&gt;<br />
]<br />
This diagnostic occurred in the compiler generated function 'std::basic_filebuf&lt;_Elem,_Traits&gt; &amp;std::basic_filebuf&lt;_Elem,_Traits&gt;::operator =(const std::basic_filebuf&lt;_Elem,_Traits&gt; &amp;)'<br />
with<br />
[<br />
_Elem=char,<br />
_Traits=std::char_traits&lt;char&gt;<br />
]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1200984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1200984</guid><dc:creator><![CDATA[Matrim]]></dc:creator><pubDate>Tue, 02 Jan 2007 09:49:12 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches Schließen mit ofstream? on Tue, 02 Jan 2007 09:49:01 GMT]]></title><description><![CDATA[<p>Da ist es am besten, den Stream direkt in dein Objekt reinzupacken:</p>
<pre><code class="language-cpp">class BitReader
{
public:
  ...
private:
  std::ifstream stream;//Achtung: hier kein *
  ...
};

BitReader::BitReader(const char* fname)
{
  stream.open(fname,std::ios::in | std::ios::binary);
  ...
}

void BitReader::readBuffer()
{
  //Debug-Ausgabe:
  clog&lt;&lt;stream.tellg()&lt;&lt;endl;

  stream.get(buf);
  pos=0;
}
</code></pre>
<p>Edit: Und afaik gibt es einen guten Grund, einen Stream nicht kopieren zu müssen. Das bedeutet allerdings für dich, daß dein BitReader auch nicht kopierbar sein wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1200987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1200987</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 02 Jan 2007 09:49:01 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches Schließen mit ofstream? on Tue, 02 Jan 2007 10:01:34 GMT]]></title><description><![CDATA[<p>Habe die Änderungen eingepflegt und nun funktioniert es.</p>
<p>(Sollte es aber auch nicht im anderen Falle funktionieren?)</p>
<p>Vielen Dank für deine Hilfe.</p>
<p>ps Gibt es einen relevanten Unterschied, was man benutzen sollte:</p>
<pre><code>stream &gt;&gt; buf; // oder
  stream.read(&amp;buf, 1); // oder
  stream.get(buf);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1200992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1200992</guid><dc:creator><![CDATA[Matrim]]></dc:creator><pubDate>Tue, 02 Jan 2007 10:01:34 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches Schließen mit ofstream? on Tue, 02 Jan 2007 10:25:02 GMT]]></title><description><![CDATA[<p>Ja, es gibt marginale Unterschiede in der Bedeutung:</p>
<ul>
<li>op&gt;&gt; liest strukturiert (das heißt, er interpretiert die eingabedaten je nach Zielvariable - und er sortiert Whitespaces aus)</li>
<li>get() liest zeilenorientiert (für ein einzelnes Zeichen macht das keinen Unterschied - aber bei größeren Blöcken bedeutet es, daß er am ersten \n anhält)</li>
<li>read() liest blockorientiert</li>
</ul>
<p>(und um ein einzelnes Zeichen einzulesen, ist get() imho am besten geeignet)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1201006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1201006</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 02 Jan 2007 10:25:02 GMT</pubDate></item></channel></rss>