<?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[Probleme mit fstream und write() - Geloest]]></title><description><![CDATA[<p>Hallöchen,</p>
<p>ich habe folgendes Problem: Ich habe ein ini-File, in welchem Daten zur Initialisierung stehen oder (bei der ersten Nutzung meines Programms) eben noch nichts.<br />
Beim Öffnen eines Dialogs lese ich also aus diesem File aus und schreibe, sollten neue Einstellungen gespeichert werden müssen, diese dort hinein. Dafür benutze ich fstream. Das Auslesen funktioniert auch wunderbar, trage ich händisch etwas in meine Datei ein, liest er es ohne Probleme aus, was mir eine Konsolenausgabe bestätigt.<br />
Probleme habe ich nur beim hineinschreiben, was aus irgendeinem Grund nicht funktioniert. Überprüfe ich den return-Wert der Funktion oder fange die Exception ab, erhalte ich die Information, dass das failbit gesetzt ist.<br />
Ich hab allerdings (da auch nicht gerade bewandert auf diesem Gebiet) keine Ahnung, woran das liegen könnte.</p>
<p>Hier mal mein Code:</p>
<pre><code>fstream fp;

fp.open(iniFile, fstream::in|fstream::out);
while(fp.good()){
  fp.exceptions(fstream::failbit);
  if(fp.peek()!=EOF){
    //File not empty, doing some sorting stuff...
  }
  else{
    fp.seekg(ios::beg);
    try{
      fp.write(ProjName, sizeof(ProjName));    /* ProjName ist ein std::string, der übergeben wird */
    }
    catch(fstream::failure f){
      cout &lt;&lt; &quot;Writing in file: failbit set&quot; &lt;&lt; endl;
    }
  }
}
</code></pre>
<p>Das ist es im Großen und Ganzen. Den Sortieralgorithmus für den Fall, dass schon etwas im File steht, habe ich einmal weggelassen, da dieser tadellos funktioniert, außer, dass die einzelnen Zeilen nicht in meine Datei geschrieben werden. Das Problem ist also vorhanden, ob File leer oder nicht.</p>
<p>Was übersehe ich oder mache ich falsch? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/298564/probleme-mit-fstream-und-write-geloest</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 19:41:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/298564.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 23 Jan 2012 09:47:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit fstream und write() - Geloest on Tue, 24 Jan 2012 14:35:00 GMT]]></title><description><![CDATA[<p>Hallöchen,</p>
<p>ich habe folgendes Problem: Ich habe ein ini-File, in welchem Daten zur Initialisierung stehen oder (bei der ersten Nutzung meines Programms) eben noch nichts.<br />
Beim Öffnen eines Dialogs lese ich also aus diesem File aus und schreibe, sollten neue Einstellungen gespeichert werden müssen, diese dort hinein. Dafür benutze ich fstream. Das Auslesen funktioniert auch wunderbar, trage ich händisch etwas in meine Datei ein, liest er es ohne Probleme aus, was mir eine Konsolenausgabe bestätigt.<br />
Probleme habe ich nur beim hineinschreiben, was aus irgendeinem Grund nicht funktioniert. Überprüfe ich den return-Wert der Funktion oder fange die Exception ab, erhalte ich die Information, dass das failbit gesetzt ist.<br />
Ich hab allerdings (da auch nicht gerade bewandert auf diesem Gebiet) keine Ahnung, woran das liegen könnte.</p>
<p>Hier mal mein Code:</p>
<pre><code>fstream fp;

fp.open(iniFile, fstream::in|fstream::out);
while(fp.good()){
  fp.exceptions(fstream::failbit);
  if(fp.peek()!=EOF){
    //File not empty, doing some sorting stuff...
  }
  else{
    fp.seekg(ios::beg);
    try{
      fp.write(ProjName, sizeof(ProjName));    /* ProjName ist ein std::string, der übergeben wird */
    }
    catch(fstream::failure f){
      cout &lt;&lt; &quot;Writing in file: failbit set&quot; &lt;&lt; endl;
    }
  }
}
</code></pre>
<p>Das ist es im Großen und Ganzen. Den Sortieralgorithmus für den Fall, dass schon etwas im File steht, habe ich einmal weggelassen, da dieser tadellos funktioniert, außer, dass die einzelnen Zeilen nicht in meine Datei geschrieben werden. Das Problem ist also vorhanden, ob File leer oder nicht.</p>
<p>Was übersehe ich oder mache ich falsch? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2171336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171336</guid><dc:creator><![CDATA[Soffo]]></dc:creator><pubDate>Tue, 24 Jan 2012 14:35:00 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit fstream und write() - Geloest on Mon, 23 Jan 2012 12:01:07 GMT]]></title><description><![CDATA[<p>Hmm, da sind ein paar Sachen drin, die unter gewissen Umständen schiefgehen können. Wenn man gewisse Annahmen über die Datei und das Programm hat, gehen sie wiederum gut, ohne dass man sinnlose Sonderfälle abdecken muss. Die Frage ist nun, ob du diese Entscheidungen bewusst oder versehentlich getroffen hast.</p>
<p>Kurz: Gib mal ein vollständiges, compilierbares Beispiel, bei dem du bis auf den fehlerverursachenden Code alles überflüssige rausgekürzt hast, gegebenenfalls gib noch den Dateiinhalt. Und dann beschreib genau, welche Handlungen zum Fehler führen.</p>
<p>Du solltest auch mal mit dem Debugger Zeile für Zeile durchgehen und gucken, an welcher Stelle das Programm von dem von dir erwarteten Verhalten abweicht. Dadurch kannst du das Problem dann vermutlich auch alleine lösen.</p>
<p>Und beschreib auch mal, was dein Programm genau machen soll. Was soll es erreichen, nicht das Wie! Deine Lösung sieht schon etwas ungewöhnlich aus, kann je nach Ziel aber auch ein guter Weg sein. Wieder die Frage, ob Versehen oder bewusste Entscheidung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2171400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171400</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 23 Jan 2012 12:01:07 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit fstream und write() - Geloest on Mon, 23 Jan 2012 12:33:16 GMT]]></title><description><![CDATA[<p>1.) Beispiel siehe unten.<br />
2.) Habe ich getan, das Programm läuft auch problemlos durch, nur dass es mir beim fp.write() eben ein &quot;fail&quot; zurückgibt. Wie gesagt, auslesen funktioniert wunderbar, sortieren auch, nur das Schreiben will nicht klappen.<br />
3.) Kurz und knapp: Ich habe eine Textdatei, in der die Namen der letzten 5 Projekte stehen, die mit meinem Programm erstellt wurden. Will man ein Projekt speichern, wird also eine Funktion aufgerufen, die diese Namen aus einer Datei ausliest, überprüft ob es das Projekt schon in der Liste gibt oder ob das File überhaupt schon gefüllt ist. Je nach Fall wird dann sortiert (oder nicht) und in das File geschrieben. Dazu speichere ich die Liste in einem Array zwischen, um auch anständig sortieren zu können.</p>
<p>Da ich zum ersten Mal mit fstream arbeite, ist mir da auch so einiges nicht klar. Zum Beispiel, ob ich nach dem Auslesen (wie mit Filepointern in C) wieder an die erste Stelle in der Datei muss. Vielleicht hakts ja daran, obwohl es beim write() keinen Unterschied zu machen scheint, ob ich vorher den Anfang der Datei suche oder nicht.</p>
<p>Nun ja, das Beispiel:</p>
<pre><code>#define iniFile &quot;inifile.txt&quot;

void setRecentProjects(string ProjName){
 /* Check if file is empty and if project already exists */
 fstream fp;
 bool sort = false;
 int existing = 0;
 int index = 0;
 char compare[5][255];
 char buf[5][255];

 fp.open(iniFile, fstream::in|fstream::out);
 while(fp.good()){
  fp.exceptions(fstream::failbit);
  if(fp.peek()!=EOF){
   fp.getline(compare[index], 255, '\n'); 
   cout &lt;&lt; &quot;compare: &quot; &lt;&lt; compare[index] &lt;&lt; &quot; ProjName: &quot; &lt;&lt; ProjName &lt;&lt; endl;
   if( (strcmp(compare[index], ProjName)==0) &amp;&amp; index&gt;0 ){
    existing = index;
    cout &lt;&lt; &quot; The same, to be sorted &quot; &lt;&lt; existing &lt;&lt; endl;
    strcpy(buf[0], compare[existing]);

    for(int c=0;c&lt;existing;c++){
     strcpy(buf[c+1], compare[c]);
    }
    for(int c=existing; c&lt;index;c++){
     strcpy(buf[c], compare[c]);
    }
    for(int c=0;c&lt;index;c++){
     cout &lt;&lt; endl &lt;&lt; buf[c] &lt;&lt; endl;
     try{
      fp.seekg(ios::beg);
      fp.write(buf[c],sizeof(buf[c]));		//does not write: fail
      fp.write(&quot;\n&quot;, sizeof(char));
     }
     catch(fstream::failure f){
      cout &lt;&lt; &quot;failure writing in file&quot; &lt;&lt; endl;
     }
    }
   }
   else if( (strcmp(compare[index], ProjName)==0) &amp;&amp; index==0 ){
    cout &lt;&lt; &quot; The same, first place&quot; &lt;&lt; endl;
   }
   index++;
  }
  else{		//file is empty
   //filepointer to beginning
   fp.seekg(ios::beg);
   cout &lt;&lt; &quot;File is empty&quot; &lt;&lt; endl;
   cout &lt;&lt; ProjName &lt;&lt; endl;
   try{
    fp.write(ProjName, sizeof(&amp;ProjName));
    fp.write(&quot;\n&quot;, sizeof(char));
   }
   catch(fstream::failure f){
    cout &lt;&lt; &quot;failure writing in file&quot; &lt;&lt; endl;
   }
  }
 }
 fp.close();
}

int main(){
 setRecentProjects(&quot;test1&quot;);

 return 0;
}
</code></pre>
<p>Schön ist der Code leider nicht, nachdem ich auch sicher fünfhundertmal darin rumgepfuscht habe, um zu sehen, ob es irgendwie anders funktioniert. Ich hoffe, man kann wenigstens erahnen, was dort passieren soll. Optimiert wird, wenns läuft...</p>
<p>Edit: Ich befürchte fast, dass besagte Entscheidungen von mir eher versehentlich getroffen wurden <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2171416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171416</guid><dc:creator><![CDATA[Soffo]]></dc:creator><pubDate>Mon, 23 Jan 2012 12:33:16 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit fstream und write() - Geloest on Mon, 23 Jan 2012 13:37:04 GMT]]></title><description><![CDATA[<p>Dein Code sieht eher nach C aus, und deine Posts lassen auch darauf schließen, dass du aus diesem Bereich kommst.</p>
<p>Warum fuchtelst du mit C-Strings rum und nutzt nicht std::string? Damit hättest du schon mal eine Fehlerquelle mehr ausgeschlossen und brauchst auch kein strcmp mehr verwenden. Für Arrays kannst du dann noch std::vector nehmen, womit sich auch einfach eine Sortierfunktion realisieren lässt, was eine weitere Fehlerquelle beseitigt.</p>
<p>Anscheinend handelt es sich um keine Binärdatei, also brauchst du write gar nicht benutzen sondern kannst mit dem Operator &gt;&gt; in die Datei schreiben. Übrigens brauchst du die Datei gar nicht mit close manuell zu schließen. Das erleigt der Destruktor automatisch.</p>
<p>Wenn ich durch deinen Code durchsteigen würde, dann hätte ich dir kurz ein Beispiel gemacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2171438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171438</guid><dc:creator><![CDATA[kljkljkl]]></dc:creator><pubDate>Mon, 23 Jan 2012 13:37:04 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit fstream und write() - Geloest on Mon, 23 Jan 2012 13:56:04 GMT]]></title><description><![CDATA[<p>Eventuell hab ichs doch verstanden.</p>
<p>Meinst du es so?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;fstream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;

typedef std::vector&lt;std::string&gt; StrVec;

const std::string INI_FILE = &quot;inifile.txt&quot;;

bool setRecentProjects(std::string ProjName)
{
	StrVec vec;

	std::ifstream ifst(INI_FILE);

	if (ifst.good())
	{
		std::string line;

		while (std::getline(ifst, line))
		{
			vec.push_back(line);
		}

		ifst.close();
	}

	for (StrVec::iterator it = vec.begin(); it != vec.end();)
	{
		if (*it == ProjName)
		{
			it = vec.erase(it);
		}
		else
		{
			++it;
		}
	}

	vec.push_back(ProjName);

	std::ofstream ofst(INI_FILE, std::ios::trunc);

	if (!ofst.good())
		return false;

	std::sort(vec.begin(), vec.end());

	for (StrVec::iterator it = vec.begin(); it != vec.end(); ++it)
	{
		ofst &lt;&lt; *it &lt;&lt; &quot;\n&quot;;
	}

	return true;
}

int main()
{
	if (!setRecentProjects(&quot;test&quot;))
		std::cerr &lt;&lt; &quot;Error\n&quot;;

	if (!setRecentProjects(&quot;test&quot;))
		std::cerr &lt;&lt; &quot;Error\n&quot;;

	if (!setRecentProjects(&quot;test2&quot;))
		std::cerr &lt;&lt; &quot;Error\n&quot;;

	if (!setRecentProjects(&quot;z&quot;))
		std::cerr &lt;&lt; &quot;Error\n&quot;;

	if (!setRecentProjects(&quot;a&quot;))
		std::cerr &lt;&lt; &quot;Error\n&quot;;

	if (!setRecentProjects(&quot;a&quot;))
		std::cerr &lt;&lt; &quot;Error\n&quot;;

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2171444</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171444</guid><dc:creator><![CDATA[kljkljkl]]></dc:creator><pubDate>Mon, 23 Jan 2012 13:56:04 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit fstream und write() - Geloest on Mon, 23 Jan 2012 13:59:25 GMT]]></title><description><![CDATA[<p>Da hast du Recht.<br />
Weshalb ich hier so komisch mit Strings herumwurschtel, liegt zum Teil daran, dass mein Programm eine GUI hat und hierfür mit wxWidgets-Klassen (und eben u.a. eigenen String-Klassen) arbeitet. Diesen Teil habe ich weggelassen, da das Beispiel compilierbar sein sollte und ich nicht von jedem erwarten kann, dass er sich erstmal wxWidgets zieht <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>Abgesehen davon: Wie gesagt, die Sortierfunktion funktioniert ja soweit, das Problem ist immernoch das write(). Debuggen und Konsolenausgaben liefern mir zumindest keinen Hinweis darauf, dass es an dem Inhalt des Arrays scheitern würde.<br />
Aber ändern kann ich das ja trotzdem <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>Edit: Durch dein Beispiel muss ich jetzt erstmal durchsteigen, aber danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2171445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171445</guid><dc:creator><![CDATA[Soffo]]></dc:creator><pubDate>Mon, 23 Jan 2012 13:59:25 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit fstream und write() - Geloest on Mon, 23 Jan 2012 14:02:57 GMT]]></title><description><![CDATA[<p>Eigentlich ist das Programm recht simpel. Es wird die Datei geöffnet und der Inhalt zeilenweise ausgelesen und in einem std::vector gepackt. Wenn die Datei nicht existiert oder leer ist, dann sind logischerweise auch keine Einträge im std::vector.</p>
<p>Dieser wird durchlaufen und überprüft, ob ProjName bereits vorhanden ist. Wenn das der Fall ist, dann wird es aus dem std::vector gelöscht.</p>
<p>Anschließend wird ProjName dem std::vector hinzugefügt, da dieser nun definitiv noch nicht im std::vector vorhanden ist (entweder wurde er beim Durchlaufen gelöscht oder er war nie enthalten).</p>
<p>Der Inhalt des std::vector wird dann mit der Funktion std::sort sotiert und anschließend zeilenweise in die Datei zurückgeschrieben. Der Parameter std::trunc gibt dabei an, dass die Datei auf 0 Bytes zurückgesetzt werden soll und somit leer ist. Das bewirkt, dass die Datei überschrieben wird.</p>
<p>That's it!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2171449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171449</guid><dc:creator><![CDATA[kljkljkl]]></dc:creator><pubDate>Mon, 23 Jan 2012 14:02:57 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit fstream und write() - Geloest on Mon, 23 Jan 2012 14:35:09 GMT]]></title><description><![CDATA[<p>kljkljkl schrieb:</p>
<blockquote>
<p>Der Inhalt des std::vector wird dann mit der Funktion std::sort sotiert und anschließend zeilenweise in die Datei zurückgeschrieben. Der Parameter std::trunc gibt dabei an, dass die Datei auf 0 Bytes zurückgesetzt werden soll und somit leer ist. Das bewirkt, dass die Datei überschrieben wird.</p>
</blockquote>
<p>Das ist beim Rundum-Sorglos-Paket <strong>o</strong>fstream schon implizit mit drin. Ich bin mir gerade aber nicht so sicher, ob das gut geht, da die Datei ja noch vom Lesen offen ist. Setz doch sicherheitshalber noch einen Scope um das Einlesen. (P.S.: Sehe gerade, dass du die Datei explizit schließt. Somit ist das natürlich in Ordnung so)</p>
<p>Und das if(ifst.good()) kann man sich auch sparen, da dies ja schon von der while-Schleife erledigt wird.</p>
<p>Ich bin übrigens kein Fan von der Idee, die Datei zu überschreiben. Ich würde eine temporäre Datei schreiben und dann die Namen vertauschen. Dann ist im Falle eines ungünstigen Stromausfalls nicht alles weg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2171468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171468</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 23 Jan 2012 14:35:09 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit fstream und write() - Geloest on Tue, 24 Jan 2012 14:34:05 GMT]]></title><description><![CDATA[<p>Also zunächst einmal: Danke. So funktionierts auch mit dem Schreiben. Ich hab noch den Sortieralgorithmus angepasst, damit das zuletzt gespeicherte immer oben im File steht.</p>
<p>Jetzt gehts, Problem solved <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/2171897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171897</guid><dc:creator><![CDATA[Soffo]]></dc:creator><pubDate>Tue, 24 Jan 2012 14:34:05 GMT</pubDate></item></channel></rss>