<?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[getline(): Eingabe vor Ausgabe der Eingabeaufforderung?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich wollte einen String inklusive Leerzeichen (sprich eine ganze Zeile) in ein char-Array einlesen und habe auch schon ein bisschen herumgesucht hier im Forum.<br />
Bin dann auf die getline Methode gestoßen, welche ja prinzipiell schonmal funktioniert.</p>
<p>Weitere Probleme waren, dass frühere Eingaben mit cin noch Reste im Eingabepuffer liegen gelassen haben, welche ich per ignore() entfernt hab.</p>
<p>Soweit funktioniert das ganze im Prinzip auch... Das Problem ist, dass die Ausgabe der Eingabeaufforderung erst NACH der Eingabe ausgeführt wird, obwohl sie im Programm zuerst kommt:</p>
<pre><code class="language-cpp">const int STRING_SIZE = 30;

long isbn; int price, pages, count;
char *authors, *title, *publisher;

authors = new char[STRING_SIZE];
title = new char[STRING_SIZE];
publisher = new char[STRING_SIZE];

cout &lt;&lt; &quot;ISBN? &quot;; cin &gt;&gt; isbn;
cout &lt;&lt; &quot;Price? &quot;; cin &gt;&gt; price;
cout &lt;&lt; &quot;Pages? &quot;; cin &gt;&gt; pages;

while (cin.peek() == '\n') cin.ignore();
cout &lt;&lt; &quot;Authors? &quot;; cin.getline(authors, STRING_SIZE, '\n'); 

while (cin.peek() == '\n') cin.ignore();
cout &lt;&lt; &quot;Title? &quot;; cin.getline(title, STRING_SIZE, '\n');

cout &lt;&lt; &quot;Count? &quot;; cin &gt;&gt; count;

while (cin.peek() == '\n') cin.ignore();
cout &lt;&lt; &quot;Publisher? &quot;; cin.getline(publisher, STRING_SIZE, \n');

// zusammenfassende Ausgabe
...
</code></pre>
<p>Die Ausgabe beim Programmablauf sieht nun aber so aus:</p>
<pre><code>ISBN? 123
Price? 1
Pages? 2
EIngabe vor Ausgabe
Authors? nochmals...
Title? Count? 3
und hier auch
Publisher?
Books:
Book:
isbn: 123      price: 1.000000 pages: 2        authors: EIngabe vor Aus
gabe    title: nochmals...      count: 3        publisher: und hier auch
</code></pre>
<p>Wieso erfolgt die cout-Ausgabe erst nach der Eingabe?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/202746/getline-eingabe-vor-ausgabe-der-eingabeaufforderung</link><generator>RSS for Node</generator><lastBuildDate>Tue, 06 Oct 2026 23:48:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/202746.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 15 Jan 2008 06:50:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to getline(): Eingabe vor Ausgabe der Eingabeaufforderung? on Tue, 15 Jan 2008 06:51:15 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich wollte einen String inklusive Leerzeichen (sprich eine ganze Zeile) in ein char-Array einlesen und habe auch schon ein bisschen herumgesucht hier im Forum.<br />
Bin dann auf die getline Methode gestoßen, welche ja prinzipiell schonmal funktioniert.</p>
<p>Weitere Probleme waren, dass frühere Eingaben mit cin noch Reste im Eingabepuffer liegen gelassen haben, welche ich per ignore() entfernt hab.</p>
<p>Soweit funktioniert das ganze im Prinzip auch... Das Problem ist, dass die Ausgabe der Eingabeaufforderung erst NACH der Eingabe ausgeführt wird, obwohl sie im Programm zuerst kommt:</p>
<pre><code class="language-cpp">const int STRING_SIZE = 30;

long isbn; int price, pages, count;
char *authors, *title, *publisher;

authors = new char[STRING_SIZE];
title = new char[STRING_SIZE];
publisher = new char[STRING_SIZE];

cout &lt;&lt; &quot;ISBN? &quot;; cin &gt;&gt; isbn;
cout &lt;&lt; &quot;Price? &quot;; cin &gt;&gt; price;
cout &lt;&lt; &quot;Pages? &quot;; cin &gt;&gt; pages;

while (cin.peek() == '\n') cin.ignore();
cout &lt;&lt; &quot;Authors? &quot;; cin.getline(authors, STRING_SIZE, '\n'); 

while (cin.peek() == '\n') cin.ignore();
cout &lt;&lt; &quot;Title? &quot;; cin.getline(title, STRING_SIZE, '\n');

cout &lt;&lt; &quot;Count? &quot;; cin &gt;&gt; count;

while (cin.peek() == '\n') cin.ignore();
cout &lt;&lt; &quot;Publisher? &quot;; cin.getline(publisher, STRING_SIZE, \n');

// zusammenfassende Ausgabe
...
</code></pre>
<p>Die Ausgabe beim Programmablauf sieht nun aber so aus:</p>
<pre><code>ISBN? 123
Price? 1
Pages? 2
EIngabe vor Ausgabe
Authors? nochmals...
Title? Count? 3
und hier auch
Publisher?
Books:
Book:
isbn: 123      price: 1.000000 pages: 2        authors: EIngabe vor Aus
gabe    title: nochmals...      count: 3        publisher: und hier auch
</code></pre>
<p>Wieso erfolgt die cout-Ausgabe erst nach der Eingabe?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1436742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1436742</guid><dc:creator><![CDATA[moormaster]]></dc:creator><pubDate>Tue, 15 Jan 2008 06:51:15 GMT</pubDate></item><item><title><![CDATA[Reply to getline(): Eingabe vor Ausgabe der Eingabeaufforderung? on Tue, 15 Jan 2008 08:14:21 GMT]]></title><description><![CDATA[<p>Weil die Konsolenausgabe auf den meisten Systemen gepuffert ist. Schieb nach der Eingabeaufforderung noch ein std::flush durch cout, dann sollte es gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1436744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1436744</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 15 Jan 2008 08:14:21 GMT</pubDate></item><item><title><![CDATA[Reply to getline(): Eingabe vor Ausgabe der Eingabeaufforderung? on Tue, 15 Jan 2008 09:43:41 GMT]]></title><description><![CDATA[<p>Ich hab eine Eingabe nun testweise verändert</p>
<pre><code class="language-cpp">cout &lt;&lt; &quot;Authors? &quot;;
flush(cout);
cin.getline(authors, STRING_SIZE, '\n');
</code></pre>
<p>Hab neu compiliert und trotzdem keine Veränderung... immernoch erfolgt die Ausgabe erst dann, wenn die Eingabe abgeschlossen wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1436837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1436837</guid><dc:creator><![CDATA[moormaster]]></dc:creator><pubDate>Tue, 15 Jan 2008 09:43:41 GMT</pubDate></item><item><title><![CDATA[Reply to getline(): Eingabe vor Ausgabe der Eingabeaufforderung? on Tue, 15 Jan 2008 13:44:12 GMT]]></title><description><![CDATA[<p>Das liegt daran das peek() blockiert und wartet bis eine Eingabe erfolgt. Ebenso wartet ignore() auf eine Eingabe.</p>
<p>Also wartet peek() auf input. Du schreibst etwas, peek sieht das das erste Zeichen kein Newline ist und überspringt das ignore und gibt die Eingabe gleich direkt an dein getline weiter. Daher kommt die Abfrage &quot;vorher&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1437049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1437049</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Tue, 15 Jan 2008 13:44:12 GMT</pubDate></item><item><title><![CDATA[Reply to getline(): Eingabe vor Ausgabe der Eingabeaufforderung? on Tue, 15 Jan 2008 15:21:02 GMT]]></title><description><![CDATA[<p>Ist zumindest mal ein erster nachvollziehbarer Ansatz, der das Verhalten erklärt... aber wieso wartet peek bis ich zum ersten Mal RETURN drücke? Sobald ich anfange, irgendwas zu tippen, müssten sich doch schon Zeichen im Puffer befinden, die != '\n' sind und dem entsprechend sollten dann sowohl peek() als auch die while Schleife verlassen werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1437131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1437131</guid><dc:creator><![CDATA[moormaster]]></dc:creator><pubDate>Tue, 15 Jan 2008 15:21:02 GMT</pubDate></item><item><title><![CDATA[Reply to getline(): Eingabe vor Ausgabe der Eingabeaufforderung? on Tue, 15 Jan 2008 15:31:28 GMT]]></title><description><![CDATA[<p>nach den cin&gt;&gt;... Aufrufen ja, aber getline() löscht das Enter-Zeichen am Zeilenende. Außerdem arbeitet die Tastatur selbst auch gepuffert, d.h. deine Eingaben werden erst ans Programm (und peek()) übergeben, wenn du sie mit ENTER abgeschlossen hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1437137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1437137</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 15 Jan 2008 15:31:28 GMT</pubDate></item><item><title><![CDATA[Reply to getline(): Eingabe vor Ausgabe der Eingabeaufforderung? on Tue, 15 Jan 2008 17:03:20 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>nach den cin&gt;&gt;... Aufrufen ja, aber getline() löscht das Enter-Zeichen am Zeilenende.</p>
</blockquote>
<p>Ok d.h. ich brauch nach den cin-Eingaben den Puffer nicht mehr nach Zeilenumbrüchen zu durchsuchen... scheint auch zu klappen.</p>
<p>Also habe ich meine cin.ignore-Aufrufe nur noch hinter die getline-Aufrufe gesetzt.</p>
<p>Kann es sein, dass getline alles im Eingabepuffer lässt?<br />
2 direkt aufeinanderfolgende getline Aufrufe machen mir keine Probleme aber eine direkt auf getline folgende Eingabe mit cin &gt;&gt; xy wird sofort übersprungen... ich hab mir mal Testweise ausgeben lassen, was peek() so für ein Zeichen sieht kurz vor der cin Eingabe... dort war das Anfangszeichen der letzten Eingabe für getline gespeichert.</p>
<p>Meine Vermutung ist nun, dass sich die ganze Zeile noch immer im Eingabepuffer befindet... wie bekomm ich die da raus, ohne auf einem blockierenden peek()-Aufruf zu Enden?</p>
<p>edit:<br />
Hab noch ein bisschen herumgegoogelt und mich nun entschieden, nach jedem cin, was direkt vor einem getline-Aufruf kommt, den kompletten Eingabepuffer zurückzusetzen.</p>
<pre><code class="language-cpp">cout &lt;&lt; &quot;Book &quot; &lt;&lt; i &lt;&lt; &quot;: \n&quot;;
		cout &lt;&lt; &quot;ISBN? &quot;; cin &gt;&gt; isbn;
		cout &lt;&lt; &quot;Price? &quot;; cin &gt;&gt; price;
		cout &lt;&lt; &quot;Pages? &quot;; cin &gt;&gt; pages;

		cin.seekg(0,std::ios::end); cin.clear();
		cout &lt;&lt; &quot;Authors? &quot;; cin.getline(authors, STRING_SIZE, '\n'); 
		cout &lt;&lt; &quot;Title? &quot;; cin.getline(title, STRING_SIZE, '\n');

		cout &lt;&lt; &quot;Count? &quot;; cin &gt;&gt; count;

		cin.seekg(0,std::ios::end); cin.clear();
		cout &lt;&lt; &quot;Publisher? &quot;; cin.getline(publisher, STRING_SIZE, \n');
</code></pre>
<p>Das funktioniert genau nach meinen Vorstellungen... Wer möchte, kann ISBN, Preis und Pages &quot;in einem Rutsch&quot; mit Leerzeichen getrennt eingeben aber vor dem getline Aufruf wird alles weitere aus dem Puffer geschmissen ^^</p>
<p>Thx für die Hilfe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1437170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1437170</guid><dc:creator><![CDATA[moormaster]]></dc:creator><pubDate>Tue, 15 Jan 2008 17:03:20 GMT</pubDate></item></channel></rss>