<?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[istream::getline() in Verbindung mit istream::operator&amp;lt;&amp;lt;]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich bastele immer noch an bestimmten Dateilese- (und -schreib-) routinen herum.</p>
<p>Ich schreibe bestimmte Angaben in eine Datei und lese diese sukzessive aus.<br />
Bisher verwende ich dabei als Datentypen nur Zahlentypen (int, unsigned short) und Einzel-Chars, getrennt durch Semikola. Das funktioniert recht gut:</p>
<pre><code class="language-cpp">const char trz = ';';

int meineklasse::ausgelesen(istream&amp; lies) {

	int wert1;
	char z;
	lies &gt;&gt; wert1 &gt;&gt; z;
	if (z != trz || !lies.good()) { return 1;}
	double wert2;
	lies &gt;&gt; wert2 &gt;&gt; z;
	if (z != trz || !lies.good()) { return 1;}
        // ...
        return 0;
}
</code></pre>
<p>Hierbei habe ich festgestellt, dass Zeilenumbrüche keine Rolle spielen, also nicht als Char ausgelesen werden.</p>
<p>Nun möchte ich zusätzlich aber auch einen std::string auslesen.<br />
Die gelesene Datei soll nach meinen Vorstellungen folgendermaßen aussehen:</p>
<blockquote>
<p>wert1;wert2; ....<br />
derAuszuselendeString<br />
weitere Zeilen</p>
</blockquote>
<p>Mein erster Gedanke war, anstelle der &quot;//...&quot; im Codefragment fortzusetzten mit:</p>
<pre><code class="language-cpp">std::string zeile;
lies.getline(zeile, ZEILENLAENGE);
//... verarbeite zeile
</code></pre>
<p>Das funktioniert nicht:<br />
Da ich mit den &lt;&lt;-Operatoren bereits eine vollständige Zeile ausgelesen habe, ergibt dies stets einen Speicherzugriffsfehler (es sei denn, ich definiere ZEILENLAENGE als 0).<br />
Irgendwie scheint die Kombination von &lt;&lt; und getline so nicht möglich zu sein.</p>
<p>Daher meine Fragen:</p>
<ul>
<li>Wie kann ich einen istream auffordern, einen Zeilenumbruch zu &quot;lesen&quot;, d.h.<br />
&quot;lies das nächste Zeichen, einschließlich Steuerzeichen&quot;?</li>
<li>Wie kann ich eine istream auffordern, am Anfang der nächsten Zeile weiterzulesen?</li>
<li>Weiterlesen am Anfang der nächsten Zeile wie eben, aber unter Sicherung des übersprungenen Zeilenendstücks (d.h. gibt es eine Funktion wie istream::getRestOfLine())?</li>
</ul>
<p>Vielleicht gibt es ja auch eine andere Möglichkeit, einen String unbekannter Länge bequem auszulesen. Ich dachte jedoch, dass ein Zeilenumbruch schon ein günstiges Trennzeichen ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/286724/istream-getline-in-verbindung-mit-istream-operator-lt-lt</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 20:32:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/286724.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 15 May 2011 13:26:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to istream::getline() in Verbindung mit istream::operator&amp;lt;&amp;lt; on Sun, 15 May 2011 13:26:52 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich bastele immer noch an bestimmten Dateilese- (und -schreib-) routinen herum.</p>
<p>Ich schreibe bestimmte Angaben in eine Datei und lese diese sukzessive aus.<br />
Bisher verwende ich dabei als Datentypen nur Zahlentypen (int, unsigned short) und Einzel-Chars, getrennt durch Semikola. Das funktioniert recht gut:</p>
<pre><code class="language-cpp">const char trz = ';';

int meineklasse::ausgelesen(istream&amp; lies) {

	int wert1;
	char z;
	lies &gt;&gt; wert1 &gt;&gt; z;
	if (z != trz || !lies.good()) { return 1;}
	double wert2;
	lies &gt;&gt; wert2 &gt;&gt; z;
	if (z != trz || !lies.good()) { return 1;}
        // ...
        return 0;
}
</code></pre>
<p>Hierbei habe ich festgestellt, dass Zeilenumbrüche keine Rolle spielen, also nicht als Char ausgelesen werden.</p>
<p>Nun möchte ich zusätzlich aber auch einen std::string auslesen.<br />
Die gelesene Datei soll nach meinen Vorstellungen folgendermaßen aussehen:</p>
<blockquote>
<p>wert1;wert2; ....<br />
derAuszuselendeString<br />
weitere Zeilen</p>
</blockquote>
<p>Mein erster Gedanke war, anstelle der &quot;//...&quot; im Codefragment fortzusetzten mit:</p>
<pre><code class="language-cpp">std::string zeile;
lies.getline(zeile, ZEILENLAENGE);
//... verarbeite zeile
</code></pre>
<p>Das funktioniert nicht:<br />
Da ich mit den &lt;&lt;-Operatoren bereits eine vollständige Zeile ausgelesen habe, ergibt dies stets einen Speicherzugriffsfehler (es sei denn, ich definiere ZEILENLAENGE als 0).<br />
Irgendwie scheint die Kombination von &lt;&lt; und getline so nicht möglich zu sein.</p>
<p>Daher meine Fragen:</p>
<ul>
<li>Wie kann ich einen istream auffordern, einen Zeilenumbruch zu &quot;lesen&quot;, d.h.<br />
&quot;lies das nächste Zeichen, einschließlich Steuerzeichen&quot;?</li>
<li>Wie kann ich eine istream auffordern, am Anfang der nächsten Zeile weiterzulesen?</li>
<li>Weiterlesen am Anfang der nächsten Zeile wie eben, aber unter Sicherung des übersprungenen Zeilenendstücks (d.h. gibt es eine Funktion wie istream::getRestOfLine())?</li>
</ul>
<p>Vielleicht gibt es ja auch eine andere Möglichkeit, einen String unbekannter Länge bequem auszulesen. Ich dachte jedoch, dass ein Zeilenumbruch schon ein günstiges Trennzeichen ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2063618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2063618</guid><dc:creator><![CDATA[tollelege]]></dc:creator><pubDate>Sun, 15 May 2011 13:26:52 GMT</pubDate></item><item><title><![CDATA[Reply to istream::getline() in Verbindung mit istream::operator&amp;lt;&amp;lt; on Sun, 15 May 2011 13:44:12 GMT]]></title><description><![CDATA[<p>Alle deine Fragen erübrigen sich mehr oder weniger, denn du benutzt deine Strings wie char-Arrays, die sie nicht sind:<br />
<a href="http://www.cplusplus.com/reference/string/" rel="nofollow">http://www.cplusplus.com/reference/string/</a><br />
Insbesondere kommen sie mit einem eigenen getline (siehe Link).</p>
<blockquote>
<p>Wie kann ich einen istream auffordern, einen Zeilenumbruch zu &quot;lesen&quot;, d.h.<br />
&quot;lies das nächste Zeichen, einschließlich Steuerzeichen&quot;?</p>
</blockquote>
<p>Prinzipiell gar nicht, außer du schreibst es dir selbst. Aber du solltest so etwas gar nicht brauchen.</p>
<blockquote>
<p>Wie kann ich eine istream auffordern, am Anfang der nächsten Zeile weiterzulesen?</p>
</blockquote>
<p>Alles bis zum Anfang der nächsten Zeile ignorieren:<br />
<a href="http://www.cplusplus.com/reference/iostream/istream/ignore/" rel="nofollow">http://www.cplusplus.com/reference/iostream/istream/ignore/</a></p>
<blockquote>
<p>Weiterlesen am Anfang der nächsten Zeile wie eben, aber unter Sicherung des übersprungenen Zeilenendstücks (d.h. gibt es eine Funktion wie istream::getRestOfLine())?</p>
</blockquote>
<p><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="😕"
    /> Was möchtest du? Gib mal ein Beipiel. Wenn du bis zum Ende der Zeile lesen möchtest, kannst du doch getline nehmen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2063621</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2063621</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 15 May 2011 13:44:12 GMT</pubDate></item><item><title><![CDATA[Reply to istream::getline() in Verbindung mit istream::operator&amp;lt;&amp;lt; on Sun, 15 May 2011 14:54:09 GMT]]></title><description><![CDATA[<p>Alles klar. istream::ignore springt zum nähchsten Zeilenanfang,<br />
getline muss ich als getline(istream, string) aufrufen, und es liest den Rest der Zeile (ab aktueller Position).<br />
Mein eigentliches Problem war also (wie ich jetzt weiß), dass ich mit den alten C-Stings nicht gut umgehen kann (aber auch nicht mehr muss).</p>
<p>Das ist schon alles was ich brauchte!<br />
Vielen Dank für die Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2063668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2063668</guid><dc:creator><![CDATA[tollelege]]></dc:creator><pubDate>Sun, 15 May 2011 14:54:09 GMT</pubDate></item></channel></rss>