<?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[[gelöst] Wie kann ich ein FILE als Parameter einer Funktion übergeben?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte gern im Hauptprogramm eine Datei öffnen und dann in einer Funktion etwas in die Datei schreiben. (Die Funktion will ich später öfter aufrufen; deswegen möchte ich eben nicht den Dateinamen übergeben und jedes Mal in der Funktion die Datei öffnen und wieder schließen.)</p>
<p>Ich stelle mir das mehr oder weniger so vor:</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;

void speichern(FILE datei) {
	fputc('A', &amp;datei);
}

int main() {
	FILE *datei = new FILE;
	datei = fopen (&quot;test.txt&quot;,&quot;w&quot;);
	speichern(*datei);
	fclose(datei);
}
</code></pre>
<p>Dieser Code wird auch kompiliert, aber wenn ich das Programm starte, passiert ein <code>Segmentation fault</code> . Ich vermute mal, weil <code>fputc</code> nicht in die <code>datei</code> schreibt, sondern versucht an die Adresse des Zeigers auf <code>datei</code> zu schreiben.</p>
<p>Kann mir jemand sagen, was ich korrigieren muss?</p>
<p>Vielen Dank im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/274568/gelöst-wie-kann-ich-ein-file-als-parameter-einer-funktion-übergeben</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 08:45:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274568.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 28 Sep 2010 14:19:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst] Wie kann ich ein FILE als Parameter einer Funktion übergeben? on Thu, 30 Sep 2010 14:17:29 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte gern im Hauptprogramm eine Datei öffnen und dann in einer Funktion etwas in die Datei schreiben. (Die Funktion will ich später öfter aufrufen; deswegen möchte ich eben nicht den Dateinamen übergeben und jedes Mal in der Funktion die Datei öffnen und wieder schließen.)</p>
<p>Ich stelle mir das mehr oder weniger so vor:</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;

void speichern(FILE datei) {
	fputc('A', &amp;datei);
}

int main() {
	FILE *datei = new FILE;
	datei = fopen (&quot;test.txt&quot;,&quot;w&quot;);
	speichern(*datei);
	fclose(datei);
}
</code></pre>
<p>Dieser Code wird auch kompiliert, aber wenn ich das Programm starte, passiert ein <code>Segmentation fault</code> . Ich vermute mal, weil <code>fputc</code> nicht in die <code>datei</code> schreibt, sondern versucht an die Adresse des Zeigers auf <code>datei</code> zu schreiben.</p>
<p>Kann mir jemand sagen, was ich korrigieren muss?</p>
<p>Vielen Dank im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958562</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958562</guid><dc:creator><![CDATA[tda]]></dc:creator><pubDate>Thu, 30 Sep 2010 14:17:29 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Wie kann ich ein FILE als Parameter einer Funktion übergeben? on Tue, 28 Sep 2010 14:22:03 GMT]]></title><description><![CDATA[<p>Wieso übergibst du nicht einfach den Zeiger den du ja schon in der main Funktion hast?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958564</guid><dc:creator><![CDATA[Zeigerübergabe]]></dc:creator><pubDate>Tue, 28 Sep 2010 14:22:03 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Wie kann ich ein FILE als Parameter einer Funktion übergeben? on Tue, 28 Sep 2010 14:23:59 GMT]]></title><description><![CDATA[<p>tda schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>ich möchte gern im Hauptprogramm eine Datei öffnen und dann in einer Funktion etwas in die Datei schreiben. (Die Funktion will ich später öfter aufrufen; deswegen möchte ich eben nicht den Dateinamen übergeben und jedes Mal in der Funktion die Datei öffnen und wieder schließen.)</p>
<p>Ich stelle mir das mehr oder weniger so vor:</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;

void speichern(FILE datei) {
	fputc('A', &amp;datei);
}

int main() {
	FILE *datei = new FILE;
	datei = fopen (&quot;test.txt&quot;,&quot;w&quot;);
	speichern(*datei);
	fclose(datei);
}
</code></pre>
<p>Dieser Code wird auch kompiliert, aber wenn ich das Programm starte, passiert ein <code>Segmentation fault</code> . Ich vermute mal, weil <code>fputc</code> nicht in die <code>datei</code> schreibt, sondern versucht an die Adresse des Zeigers auf <code>datei</code> zu schreiben.</p>
<p>Kann mir jemand sagen, was ich korrigieren muss?</p>
<p>Vielen Dank im Voraus!</p>
</blockquote>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;

void speichern(FILE* datei) {
	fputc('A', datei);
}

int main() {
	FILE *datei = new FILE;
	datei = fopen (&quot;test.txt&quot;,&quot;w&quot;);
	speichern(datei);
	fclose(datei);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1958568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958568</guid><dc:creator><![CDATA[FileZeiger]]></dc:creator><pubDate>Tue, 28 Sep 2010 14:23:59 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Wie kann ich ein FILE als Parameter einer Funktion übergeben? on Tue, 28 Sep 2010 14:32:55 GMT]]></title><description><![CDATA[<p>@Zeigerübergabe: An sowas hatte ich auch gedacht, wusste dann aber nicht so recht, wie ich in der Funktion damit umgehen muss.</p>
<p>@FileZeiger: Ja, das ist genau, was ich wollte. (Wann etwas Zeiger oder Referenz oder was auch immer ist, ist bei mir noch größtenteils geschicktes Raten und Rumprobieren. <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>Vielen Dank für die schnelle Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958572</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958572</guid><dc:creator><![CDATA[tda]]></dc:creator><pubDate>Tue, 28 Sep 2010 14:32:55 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Wie kann ich ein FILE als Parameter einer Funktion übergeben? on Tue, 28 Sep 2010 14:35:09 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">FILE *datei = new FILE; 
datei = fopen (&quot;test.txt&quot;,&quot;w&quot;);
</code></pre>
<p>Hier hast du ein schönes Memory Leak. Schreib lieber</p>
<pre><code class="language-cpp">FILE* datei = fopen(&quot;test.txt&quot;, &quot;w&quot;);
</code></pre>
<p>Wenn du tatsächlich C++ programmierst (was wegen <code>new</code> anzunehmen ist), kannst du dir sonst auch mal die IO-Streams ( <code>std::fstream</code> ) anschauen. Die schliessen sich zum Beispiel auch selbst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958573</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 28 Sep 2010 14:35:09 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Wie kann ich ein FILE als Parameter einer Funktion übergeben? on Tue, 28 Sep 2010 15:45:57 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Schreib lieber</p>
<pre><code class="language-cpp">FILE* datei = fopen(&quot;test.txt&quot;, &quot;w&quot;);
</code></pre>
</blockquote>
<p>Das habe ich inzwischen gemacht. Das mit dem <code>new</code> war nur beim Rumprobieren entstanden...</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>kannst du dir sonst auch mal die IO-Streams ( <code>std::fstream</code> ) anschauen. Die schliessen sich zum Beispiel auch selbst.</p>
</blockquote>
<p>Haben die sonst noch irgendwelche Vorteile?</p>
<p>Ich war auch schon auf die gestoßen, ürsprünglich aber zunächst nur auf <code>ostream::write</code> und <code>istream::read</code> , was mir unnötig kompliziert schien. Da ich meine Daten binär und daher durchaus byte-weise schreiben und lesen kann, schien mir <code>fputc</code> angemessener. Aber <code>ostream::put</code> und <code>istream::get</code> dürften ja etwa das gleiche tun wie <code>fputc</code> und <code>fgetc</code> , oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958615</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958615</guid><dc:creator><![CDATA[tda]]></dc:creator><pubDate>Tue, 28 Sep 2010 15:45:57 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Wie kann ich ein FILE als Parameter einer Funktion übergeben? on Tue, 28 Sep 2010 15:59:00 GMT]]></title><description><![CDATA[<p>Vorteil von <em>std::fstream</em> ist, dass einem mehr Sicherheit durch Exceptions gewährleistet wird. Für <em>byteweises</em> (, binäres) einlesen gibt es <em>std::stringstream</em>(<em>&gt;&gt;</em>).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958620</guid><dc:creator><![CDATA[Kóyaánasqatsi]]></dc:creator><pubDate>Tue, 28 Sep 2010 15:59:00 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Wie kann ich ein FILE als Parameter einer Funktion übergeben? on Tue, 28 Sep 2010 16:13:03 GMT]]></title><description><![CDATA[<p>Exceptionsicherheit: Ja. Stringstreams für binäres Einlesen: Nein.<br />
<code>stringstream</code> bietet (bis auf das fehlende <code>open()</code> und <code>close()</code> ) genau die gleichen Operationen wie <code>fstream</code> , denn beide sind von <code>iostream</code> abgeleitet. Siehe <a href="http://www.cplusplus.com/reference/iostream/" rel="nofollow">http://www.cplusplus.com/reference/iostream/</a>. Ihre wahren Stärken könnnen die iostreams zwar nur beim formatierter Ein-/Ausgabe mit den &lt;&lt; und &gt;&gt; Operatoren ausspielen, dennoch sind sie den Sachen aus <code>&lt;cstdio&gt;</code> ( <code>&lt;stdio.h&gt;</code> ist veraltet!) vorzuziehen. Übrigens: Wenn du byteweise (==&gt; binär) schreibst solltest du statt &quot;w&quot; &quot;wb&quot;, bzw. bei fstream <code>ios::binary</code> benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958622</guid><dc:creator><![CDATA[Oberon_0]]></dc:creator><pubDate>Tue, 28 Sep 2010 16:13:03 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Wie kann ich ein FILE als Parameter einer Funktion übergeben? on Tue, 28 Sep 2010 17:35:15 GMT]]></title><description><![CDATA[<p>Danke für die Antworten!</p>
<p>Oberon_0 schrieb:</p>
<blockquote>
<p>Übrigens: Wenn du byteweise (==&gt; binär) schreibst solltest du statt &quot;w&quot; &quot;wb&quot;, bzw. bei fstream <code>ios::binary</code> benutzen.</p>
</blockquote>
<p>Das ist mir auch schonmal über den Weg gelaufen. Was macht das eigentlich für einen Unterschied?</p>
<p>Oberon_0 schrieb:</p>
<blockquote>
<p>Ihre wahren Stärken könnnen die iostreams zwar nur beim formatierter Ein-/Ausgabe mit den &lt;&lt; und &gt;&gt; Operatoren ausspielen, dennoch sind sie den Sachen aus <code>&lt;cstdio&gt;</code> ( <code>&lt;stdio.h&gt;</code> ist veraltet!) vorzuziehen.</p>
</blockquote>
<p>OK. Ich habe inzwischen mein Projekt komplett auf <code>fstream</code> umgestellt. Falls das noch jemand anderes interessiert, hier nochmal die Kurzfassung (mit einer zusätzlichen Zwischen-Funktion):</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
using namespace std;

void speichern(ofstream &amp;datei) {
	datei.put('B');
}

void mehrere_speichern(ofstream &amp;datei) {
	speichern(datei);
	speichern(datei);
}

int main() {
	ofstream datei(&quot;test.txt&quot;, ios::out | ios::binary);
	speichern(datei);
	mehrere_speichern(datei);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1958651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958651</guid><dc:creator><![CDATA[tda]]></dc:creator><pubDate>Tue, 28 Sep 2010 17:35:15 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Wie kann ich ein FILE als Parameter einer Funktion übergeben? on Tue, 28 Sep 2010 18:14:35 GMT]]></title><description><![CDATA[<p>Die Parameter w und wb sind ja zunächst nur Abkürzüngen, welche angeben, mit welchen &quot;Anforderungen&quot; eine Datei geöffnet werden soll.</p>
<p>Dabei steht das w für Schreibzugriff (write) und das b für binären Zugriff (binary).</p>
<p>In Kombination heißt wb dann natürlich: Binär schreiben.</p>
<p>Binär liest und schreibt man immer dann, wenn man eine Datei exakt kopieren will. Andernfalls würden Terminierungszeichen und andere Steuerzeichen Probleme machen und die Datei unbrauchbar machen.</p>
<p>Oder man schreibt binär, wenn man eigene Strukturen speichern möchte. Auch hier wären Steuerzeichen hinderlich und es muss entsprechedn binär geschrieben werden<br />
Aber das Thema wird umso komplizierter, umso mehr man an Plattformunabhängigkeit interessiert ist.</p>
<p>Will man reinen Text speichern, so ist ein binärer Zugriff in der Regel nicht notwendig und bereitet nur Probleme. Einfach mal experimentieren <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1958668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958668</guid><dc:creator><![CDATA[zzzzzzzzz]]></dc:creator><pubDate>Tue, 28 Sep 2010 18:14:35 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Wie kann ich ein FILE als Parameter einer Funktion übergeben? on Thu, 30 Sep 2010 14:15:34 GMT]]></title><description><![CDATA[<p>Für meinen Fall brauche ich auf jeden Fall binäre Dateien. Meine Frage war nur, was es für einen Unterschied macht, ob ich eine Datei mit &quot; <code>w</code> &quot; oder &quot; <code>wb</code> &quot; (bzw. mit oder ohne <code>ios::binary</code> ) öffne, aber inzwischen habe ich eine Antwort gefunden: inhaltlich offenbar keinen, aber benutzen sollte ich &quot; <code>wb</code> &quot; bzw. <code>ios::binary</code> dennoch.</p>
<p>&lt;a href= schrieb:</p>
<blockquote>
<p><a href="http://cplusplus.com" rel="nofollow">cplusplus.com</a>&quot;&gt;In many environments, such as most UNIX-based systems, it makes no difference to open a file as a text file or a binary file; Both are treated exactly the same way, but differentiation is recommended for a better portability.</p>
</blockquote>
<p>Vielen Dank für all die Hilfe! <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1959599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959599</guid><dc:creator><![CDATA[tda]]></dc:creator><pubDate>Thu, 30 Sep 2010 14:15:34 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Wie kann ich ein FILE als Parameter einer Funktion übergeben? on Thu, 30 Sep 2010 17:44:47 GMT]]></title><description><![CDATA[<p>noch als kleiner nachtrag: unter windows gibts sehr wohl nen unterschied - hab hier schon mehrfach gehört, dass jmd nen \r\n beim &quot;normalen&quot; auslesen bekommen hat, obwohl eigtl nur ein \n in der datei stand - beim binären lesen hatte das dann auch geklappt ^^<br />
also wenn du binär willst, nimm binär - verlass dich nicht drauf, dass es keinen unterschied macht.</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959705</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 30 Sep 2010 17:44:47 GMT</pubDate></item></channel></rss>