2016-07-18 43 views
0

Ich versuche, (in C++) einige Eingaben von der Tastatur zu bekommen, die ich für die spätere Verwendung speichern möchte. Dies ist nur eine vereinfachte Version des Codes auf ich arbeite, aber es gibt das gleiche Verhalten:Warum wird getline (...) auf dem Bildschirm gedruckt?

#include <iostream> 

int main(int argc, char * * argv) 
{ 
    std::string line; 

    std::cout << "> "; 
    std::getline(std::cin, line); 

    return 0; 
} 

getline liest richtig die Eingabe von stdin, aber die Eingabe wird in einer neuen Zeile unmittelbar nach gedruckt. Außerdem wird der Leerraum nach dem Zeichen > beim Lesen meiner Eingabe ignoriert, aber danach gedruckt. Etwas wie:

>hi 
> hi 

Warum passiert das? Wie kann ich es vermeiden?

Ich bin auf Windows 10, mit CLion 2016.1 (das passiert auf CLion-Konsole).

+0

Welchen Compiler benutzen Sie? Führen Sie den Code vom Compiler aus? – NathanOliver

+0

Sie müssen die Ausgabe wahrscheinlich leeren, um sicherzustellen, dass sie erscheint, wenn sie angezeigt werden soll. Andernfalls ist der Zeitpunkt des Drucks implementationsdefiniert. –

+0

[Kann nicht] (http://coliru.stacked-crooked.com/a/9c803cd4281ed0c9) [reproduce] (http://ideone.com/7XV0UM) [dies] (http://imgur.com/AvAyaUB) [ Verhalten] (http://imgur.com/2BjuFCc). –

Antwort

2

Clion wird das tun, wenn es in der eingebauten Konsole ausgeführt wird, aber wenn es in der Windows-Konsole ausgeführt wird, sollte es nicht passieren.

Wie kann ich es vermeiden?

Der einfachste Weg, dies zu tun, ist es im Debug-Modus zu starten.

1

Warum passiert das?

Wahrscheinlich wegen der Pufferung des Ausgangs.

Wie kann ich es vermeiden?

von dem, was gedruckt werden soll, bevor getline() Aufruf unter Verwendung std::cout << "> " << std::flush;std::cout << "> "; statt gedruckt werden.

+1

Hier muss die Standardausgabe nicht gelöscht werden. Das Lesen von 'std :: cin' löscht die Standardausgabe, so dass Aufforderungen angezeigt werden, bevor auf eine Eingabe gewartet wird. –

0

Warum nicht std :: cin verwenden? Das seltsame Verhalten ist wahrscheinlich auf Ihre Plattform zurückzuführen.

Sie haben eine std::cout gefolgt von der getline() Funktion. Ein Teil des Verhaltens von getline kann je nach verwendetem Compiler unterschiedlich definiert sein. Einige sind möglicherweise nicht in der Lage, Ihr Verhalten zu reproduzieren.

Im Wesentlichen in der traditionellen C++ - Stil der Tastatur E/A die meisten Menschen einen Anruf an std::endl nach den meisten Eingaben oder Ausgaben. endl hat darin einen automatischen Aufruf an flush(), um den Standardpuffer zu spülen. Die getline()-Funktion ist jedoch ein Holdover aus der C-Sprache. In C ist es üblich, den Befehl flush() wiederholt zu verwenden, um die gewünschte Ausgabe zu erhalten, nach der Sie suchen. Dies ist einer der Gründe, warum es besser ist, so gut wie möglich zu C-Style-Ausgabe oder C++ - Ausgabe beizubehalten.

Warum können Sie nicht die std::cin verwenden? Du könntest das mit einem endl verfolgen und danach sollte alles gut sein.

Alternativ könnten Sie mit dem bloßen Aufruf einer nackten endl oder einer flush() durchkommen, um das Ding wieder in ein definiertes Verhalten Land zu bekommen.

Gibt es einen Grund, warum Sie speziell getline() benötigen?