<?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[Frage zu File IO]]></title><description><![CDATA[<p>Wollte gerade mein projekt serialisieren, und stieß dabei auf ein Problemchen. Vielleicht kann mir jemand erklären was ich in meiner Naivität falsch mache?</p>
<pre><code>#include &lt;vector&gt;
#include &lt;fstream&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;

using namespace std;

int main (int argc, char* argv[])
{	
	string tmpstring;
	vector&lt;string&gt; data;
// ein paar daten generieren
	data.push_back(&quot;bla&quot;);
	data.push_back(&quot;sabbel&quot;);
	data.push_back(&quot;sülz&quot;);

	ofstream outstream(&quot;testfile.txt&quot;);

	int count = 0;
	vector&lt;string&gt;::iterator iter;

// daten abspeichern
	for(iter = data.begin(); iter != data.end(); iter++)
	{
		cout &lt;&lt; count &lt;&lt; &quot;: &quot;&lt;&lt;&quot; writing &quot; &lt;&lt; *iter &lt;&lt; endl;
		outstream &lt;&lt; *iter &lt;&lt; endl;
		count++;
	}

	cout &lt;&lt; endl;

	data.clear();
	outstream.close();

// daten wieder einlesen
	ifstream instream(&quot;testfile.txt&quot;);
	while (! instream.eof())
	{
		instream &gt;&gt; tmpstring;
		data.push_back(tmpstring);
	}

	count = 0;
// anschauen was eingelesen wurde
	for(iter = data.begin(); iter != data.end(); iter++)
	{
		cout &lt;&lt; count &lt;&lt; &quot;: &quot;&lt;&lt;&quot; reading &quot; &lt;&lt; *iter &lt;&lt; endl;
		outstream &lt;&lt; *iter &lt;&lt; endl;
		count++;
	}

	instream.close();

	return (0);
}
</code></pre>
<p>Ausgabe sieht folgendermaßen aus</p>
<p>0: writing bla<br />
1: writing sabbel<br />
2: writing sülz</p>
<p>0: reading bla<br />
1: reading sabbel<br />
2: reading s³lz<br />
3:</p>
<p>Frage 1: was ist mit meinem 'ü' in 'sülz' passiert?</p>
<p>Frage 2: Warum bekomme ich immer eine Zeile mehr beim auslesen als beim reinschreiben?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/179746/frage-zu-file-io</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 12:28:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/179746.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 25 Apr 2007 01:26:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu File IO on Wed, 25 Apr 2007 01:26:27 GMT]]></title><description><![CDATA[<p>Wollte gerade mein projekt serialisieren, und stieß dabei auf ein Problemchen. Vielleicht kann mir jemand erklären was ich in meiner Naivität falsch mache?</p>
<pre><code>#include &lt;vector&gt;
#include &lt;fstream&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;

using namespace std;

int main (int argc, char* argv[])
{	
	string tmpstring;
	vector&lt;string&gt; data;
// ein paar daten generieren
	data.push_back(&quot;bla&quot;);
	data.push_back(&quot;sabbel&quot;);
	data.push_back(&quot;sülz&quot;);

	ofstream outstream(&quot;testfile.txt&quot;);

	int count = 0;
	vector&lt;string&gt;::iterator iter;

// daten abspeichern
	for(iter = data.begin(); iter != data.end(); iter++)
	{
		cout &lt;&lt; count &lt;&lt; &quot;: &quot;&lt;&lt;&quot; writing &quot; &lt;&lt; *iter &lt;&lt; endl;
		outstream &lt;&lt; *iter &lt;&lt; endl;
		count++;
	}

	cout &lt;&lt; endl;

	data.clear();
	outstream.close();

// daten wieder einlesen
	ifstream instream(&quot;testfile.txt&quot;);
	while (! instream.eof())
	{
		instream &gt;&gt; tmpstring;
		data.push_back(tmpstring);
	}

	count = 0;
// anschauen was eingelesen wurde
	for(iter = data.begin(); iter != data.end(); iter++)
	{
		cout &lt;&lt; count &lt;&lt; &quot;: &quot;&lt;&lt;&quot; reading &quot; &lt;&lt; *iter &lt;&lt; endl;
		outstream &lt;&lt; *iter &lt;&lt; endl;
		count++;
	}

	instream.close();

	return (0);
}
</code></pre>
<p>Ausgabe sieht folgendermaßen aus</p>
<p>0: writing bla<br />
1: writing sabbel<br />
2: writing sülz</p>
<p>0: reading bla<br />
1: reading sabbel<br />
2: reading s³lz<br />
3:</p>
<p>Frage 1: was ist mit meinem 'ü' in 'sülz' passiert?</p>
<p>Frage 2: Warum bekomme ich immer eine Zeile mehr beim auslesen als beim reinschreiben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272883</guid><dc:creator><![CDATA[antialias]]></dc:creator><pubDate>Wed, 25 Apr 2007 01:26:27 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu File IO on Wed, 25 Apr 2007 06:13:49 GMT]]></title><description><![CDATA[<p>1. Ich tippe auf verschiedene Codepages (ASCII vs. ANSI - die Umlaute liegen jenseits des standardisierten Bereiches)</p>
<p>2. eof() wird erst ausgelöst, wenn der letzte Leseversuch schiefgegangen ist. Ändere deine Leseschleife mal in:</p>
<pre><code class="language-cpp">ifstream instream(&quot;testfile.txt&quot;);
while (instream&gt;&gt;tmpstring)
{
  data.push_back(tmpstring);
}
</code></pre>
<p>(und den Eingabestream (nur) auf EOF zu testen, kann problematisch werden - bei einem Eingabefehler wird das failbit gesetzt und du landest in einer Endlosschleife)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272905</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272905</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 25 Apr 2007 06:13:49 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu File IO on Wed, 25 Apr 2007 13:55:18 GMT]]></title><description><![CDATA[<p>OK, das mit den codepages muss ich mir nochmal zu gemüte führen (ist zwar im wirklichen programm kein problem, da alles auf englisch...aber man weiss ja nie wo einen sowas mal eider beisst)</p>
<p>das mit dem lesefehler kann ich doch umgehen, wenn ich auf</p>
<p>!instream.good()</p>
<p>teste, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1273259</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1273259</guid><dc:creator><![CDATA[antialias]]></dc:creator><pubDate>Wed, 25 Apr 2007 13:55:18 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu File IO on Thu, 26 Apr 2007 06:52:00 GMT]]></title><description><![CDATA[<p>Fast, allerdings fragt !good() genau das Gegenteil von dem ab, was du brauchst - entweder good() oder !fail(), aber noch kürzer ist es, einfach <code>instream</code> abzufragen <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>Das ursprüngliche Problem wird allerdings nicht dadurch gelöst - der Stream setzt erst einen Fehler-Status, wenn wirklich eine Eingabe schiefgegangen ist, das heißt, im letzten Schleifendurchlauf steht kein gültiger Wert mehr in deiner Hilfsvariable - und den hängst du noch an den vector&lt;&gt; an.</p>
<p>Die ausführliche Lösung wäre es, den Stream-Status zwischen Einlesen und Weiterverarbeitung abzufragen:</p>
<pre><code class="language-cpp">while (! instream.fail())
{
  instream &gt;&gt; tmpstring;
  if(instream.bad()) break;
  data.push_back(tmpstring);
}
</code></pre>
<p>Wenn man jetzt noch dazunimmt, daß op&gt;&gt; den Stream zurückliefert und dieser dank eines eingebauten operator void* auch als Abbruchkriterium der Schleife verwendet werden kann, kommst du auf den Ansatz dort oben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1273675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1273675</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 26 Apr 2007 06:52:00 GMT</pubDate></item></channel></rss>