Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 23:23

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



getline() - Ließt beim Ausführen keine Textzeile ein

Discussion on getline() - Ließt beim Ausführen keine Textzeile ein within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 80
Join Date: Oct 2007
Posts: 189
Received Thanks: 21
getline() - Ließt beim Ausführen keine Textzeile ein

Hey, ich bins wieder .__.


Ich habe nun das folgende Probleme und zwar beim ausführen meines Übungsprogramms ruft er die Funktion getline() nicht auf.

Anstatt dass,das Programm auf eine Eingabe wartet, ruft es die zweite Funktion auf in dem Fall die Ausgabe des Textes.

// Bitte beachtet, dass sich hierbei nur um ein Übungsprogramm handelt

PHP Code:
#include <iostream>
#include <iomanip>
#include <string>

using namespace std;

int main()
{
    
string text1("Feldbreite"),
        
linie(40'~'),
        
vorname,
        
nachname,
        
hallo("Hallo, Herr "),
        
begrueßung;
    
int zahl1zahl2zahl3;

    
cout << "Geben sie eine ganze Zahl ein." << endl;
    
cin     >> zahl1;
    
cout << "Sie haben die Zahl: " << zahl1 << " eingegeben." << endl;
    
cout << "Die Zahl in Hexadezimale Darstellung: " << hex << zahl1 << endl;
    
cout << "Die Zahl in Oktale Darstellung: " << oct << zahl1 << endl;
    
cout << "Die Zahl in Dezimale Darstellung: " << dec << zahl1 << endl;
    
cout << "Die Zahl mit Vorzeichen: " << showpos << zahl1 << endl;
    
cout << "Die Hexadezimale Darstellung in gross: " << uppercase << hex << zahl1 << endl;
    
cout << linie << endl;
    
cout << "Uebersichtlicher" << endl;
    
cout << "Hexadezimal\t\tOktale\t\tDezimal\t\t" << endl;
    
cout << "\t" << nouppercase << hex << zahl1 << "\t" << "\t" << oct << zahl1 << "\t" << "\t" << dec << zahl1 << "\t" << endl;
    
// Fragen nach persönlichen Dingen und erneut abrufen
    
    
cout << linie << endl;
    
cout << linie << endl;
    
cout << "Könnten sie ihren Nachnamen eingeben? " << endl//Frage 1
    
getline(cinnachname);
    
cout << "Jetzt noch ihren Vornamen bitte: " << endl//Frage 2
    
getline(cinvorname);
    
begrueßung hallo vorname nachname;
    
cout << begrueßung << endl;
    return 
0;


Das Programm führt er auch ohne jegliche Fehlermeldungen aus.
Aber wenn ich die Funktion getline() über Frage1 & Frage 2 hinsetze, wartet er auf eine Eingabe aber gibt das Objekt "begrueßung" nicht korrekt aus.
aeo is offline  
Old 06/09/2012, 15:39   #2
 
.SkyneT.'s Avatar
 
elite*gold: 273
Join Date: Sep 2010
Posts: 1,831
Received Thanks: 786
Versuch mal nach cin >> zahl1 den Eingabepuffer
mittels fflush(stdin) zu löschen.
.SkyneT. is offline  
Thanks
1 User
Old 06/09/2012, 15:56   #3
 
elite*gold: 80
Join Date: Oct 2007
Posts: 189
Received Thanks: 21
Quote:
Originally Posted by .SkyneT. View Post
Versuch mal nach cin >> zahl1 den Eingabepuffer
mittels fflush(stdin) zu löschen.
Wow...perfekt es hat auf anhieb funktioniert.
Könntest du mir sagen, was da nun das exakte Problem war ?
aeo is offline  
Old 06/09/2012, 18:16   #4
 
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
Das kommt weil du cin mit getline mischen tust.

Lass mich das kurz verdeutlichen:
Code:
	Operation		Eingabestream
	cin >> zahl1       
				1234\n
				\n
	getline(cin, nachname)	\n
				\nSchmitz\n
				Schmitz\n
std::cin ließt nicht bis zum \n, wodurch das im Stream stehen bleibt. std::getline ließt bis zum \n und da das noch am Anfang des Streams steht ließt es nichts.
Nightblizard is offline  
Old 06/09/2012, 22:35   #5
 
elite*gold: 80
Join Date: Oct 2007
Posts: 189
Received Thanks: 21
Mischen tue ich das zwar nicht aber im Buch wurde eben nie was von solchen Eingabepuffern erwähnt.
Ich habe mich zwar immer gefragt, warum man getline macht, wenn die Elementfunktion "cin" gibt, aber das es noch was mit dem Zwischenspeicher zu tun hat...hm..

Also nach jedem cin(falls ein getline() folgt) sollte ich den Puffer löschen oder?
Wenn ich das aus dem Zwischenspeicher gelöscht habe, verändert sich überhaupt etwas am Programm oder hat es irgendwelche Auswirkungen?

Frage1: Ich habe zwar verstanden wo nun das Problem liegt, aber wann ich getline oder cin mache verstehe ich noch immer nicht so ganz.
Wann benutzt man es letztendlich?

Frage2: getline() wartet also auf die Return-Taste schlussendlich auf das \n und cin ließt aber die ganze Eingabe nur nicht die Leerzeichen stimmts?

Ich habe jetzt mal etwas im Internet gesucht, nach den Stichworten, wann getline() oder cin aber ich werde zu keiner Lösung fündig.
Könnte mir jemand da etwas behilflich sein und meine Fragen beantworten?
aeo is offline  
Old 06/10/2012, 00:29   #6
 
.SkyneT.'s Avatar
 
elite*gold: 273
Join Date: Sep 2010
Posts: 1,831
Received Thanks: 786
Quote:
Originally Posted by dunkis View Post
Mischen tue ich das zwar nicht aber im Buch wurde eben nie was von solchen Eingabepuffern erwähnt.
Ich habe mich zwar immer gefragt, warum man getline macht, wenn die Elementfunktion "cin" gibt, aber das es noch was mit dem Zwischenspeicher zu tun hat...hm..

Also nach jedem cin(falls ein getline() folgt) sollte ich den Puffer löschen oder?
Wenn ich das aus dem Zwischenspeicher gelöscht habe, verändert sich überhaupt etwas am Programm oder hat es irgendwelche Auswirkungen?

Frage1: Ich habe zwar verstanden wo nun das Problem liegt, aber wann ich getline oder cin mache verstehe ich noch immer nicht so ganz.
Wann benutzt man es letztendlich?

Frage2: getline() wartet also auf die Return-Taste schlussendlich auf das \n und cin ließt aber die ganze Eingabe nur nicht die Leerzeichen stimmts?

Ich habe jetzt mal etwas im Internet gesucht, nach den Stichworten, wann getline() oder cin aber ich werde zu keiner Lösung fündig.
Könnte mir jemand da etwas behilflich sein und meine Fragen beantworten?
Code:
string str_cin, str_getline;

std::cin >> str_cin;
fflush(stdin);

std::getline (cin, str_getline);

std::cout << str_cin << str_getline;
Dann gib einfach mal ein paar Strings, mit und ohne Leerzeichen ein,
und dann weißt du sicher warum man getline/cin verwendet
.SkyneT. is offline  
Thanks
1 User
Old 06/10/2012, 01:44   #7
 
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
Das flushen des Eingabestreams ruft undefined behavior hervor. Es kann funktionieren, muss aber nicht.

Sauber geht es mit
Code:
char ch;
while ((ch = cin.get()) != '\n' && ch != EOF);
Nightblizard is offline  
Old 06/10/2012, 02:23   #8
 
.SkyneT.'s Avatar
 
elite*gold: 273
Join Date: Sep 2010
Posts: 1,831
Received Thanks: 786
Quote:
Originally Posted by Nightblizard View Post
Das flushen des Eingabestreams ruft undefined behavior hervor.
Gibt es dafür auch ein konkretes Beispiel ?
Bisher konnte ich nie etwas ungewöhnliches bzgl des
flushen des Eingabestreams feststellen.

Quote:
Sauber geht es mit
Code:
char ch;
while ((ch = cin.get()) != '\n' && ch != EOF);
Das will ich damit aber nicht schlechtreden, ist sicher die
sicherere Art
.SkyneT. is offline  
Old 06/10/2012, 08:23   #9
 
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
So spontan kenne ich da keines, da ich unsicheren Code in der Regel vermeide.

Wichtig ist folgendes:
Quote:
If the given stream was open for writing and the last i/o operation was an output operation, any unwritten data in the output buffer is written to the file.
Es kann funktionieren, es kann aber auch ein schwarzes Loch erzeugen und Nibiru aus alternativen Dimension erscheinen lassen und alles Leben vernichten. Undefined behavior, lass' es erst nicht drauf ankommen, vorallem nicht 2012. :P
Nightblizard is offline  
Thanks
2 Users
Old 06/10/2012, 11:17   #10
 
2n0w's Avatar
 
elite*gold: 0
Join Date: Feb 2012
Posts: 115
Received Thanks: 18

Kurz gesagt, es ist nicht Standart, es funktioniert aber mit VC++.
Also unter Linux erscheint Nibiru ^^
2n0w is offline  
Old 06/20/2012, 00:02   #11
 
elite*gold: 80
Join Date: Oct 2007
Posts: 189
Received Thanks: 21
Kann ich nicht einfach den Befehl:
PHP Code:
cin.sync();
// und
cin.clear(); 
benutzen?
aeo is offline  
Old 06/20/2012, 06:49   #12
 
2n0w's Avatar
 
elite*gold: 0
Join Date: Feb 2012
Posts: 115
Received Thanks: 18
Clear ist denk ich nur nach Fehlern sinnvoll, wenn du den State des Streams zurücksetzen willst. Kann aber sein das ich da daneben liege. Edit: Ok, sollte man sicherheitshalber machen ^^
Das cin.sync() ist ungefähr so Standart wie fflush(stdin), soweit ich weiß.
Also wenn du sichergehen willst, benutze Nightblizard's Methode.
2n0w is offline  
Old 06/20/2012, 09:08   #13
 
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
cin.sync ist implementationsabhängig. Sprich, in Visual Studio kann es alle ungelesenen Zeichen vom Inputstream lesen und der Borland Compiler ließt z.B. nur 20 Zeichen.
Sprich, keine richtige Lösung.
cin.clear setzt lediglich den Status des Streams zurück.

Kann funktionieren, muss aber nicht. Schau nach wie dein Compiler das umsetzt.

Eine weitere Alternative zu meinem Beispiel wäre:
std::cin.ignore(std::numeric_limits<std::streamsiz e>::max(), '\n');

Das liesst entweder std::numeric_limits<std::streamsize>::max() (9.223.372.036.854.775.807 in VS11 Beta) Zeichen vom Stream oder bis zum newline. Der Vorteil davon ist, dass du angeben kannst wie viele Zeichen übersprungen werden sollen. Der Nachteil ist, falls - rein theoretisch - mehr Zeichen im Stream sind, als streamsize Zahlen darstellen kann, dann wird das auch nicht den gewünschten Effekt haben.
Nightblizard is offline  
Old 06/20/2012, 12:41   #14


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
In dem Fall würde aber ein gehöriger Fehler im Standard vorliegen, denn eigentlich sollte sichergestellt werden, dass die Größe des Streams auch durch streamsize dargestellt werden kann.
MrSm!th is offline  
Old 06/20/2012, 16:27   #15
 
2n0w's Avatar
 
elite*gold: 0
Join Date: Feb 2012
Posts: 115
Received Thanks: 18
Hier hätte ich nen Link dazu, mir ist das jetzt aber selber noch nicht ganz klar, jedenfalls hat streamsize garantiert mindestens 2 Byte hab ich gelesen, wobei das ja doch keine Rolle spielt(?).
Edit: Weil es dann doch den ganzen Stream verwendet, mein ich ^^
2n0w is offline  
Reply


Similar Threads Similar Threads
Kann keine Pserver exe-Dateien ausführen!
04/21/2012 - Metin2 Private Server - 2 Replies
Moin Com, Ich kann seit ca. 4 Tagen keine .exe-Dateien von Metin2-Pservern mehr ausführen. Wenn ich Doppelklick auf eine mache passsiert nichts. Über den Patcher geht auch nichts. Allerdings kann ich nur die Server nicht starten, die ich in dem Zeitraum von 01.04-04.04 gepatcht oder runtergeladen hab. Ein alter Pserver, den ichnoch drauf habe funktioniert ebenso der .de Offi. hat jemand eine Ahnung, was ich da machen kann? :S LG
[FEHLER]Beim Ausführen von Make.sh
12/11/2011 - Metin2 Private Server - 3 Replies
Hallo Leute, Ich brauche eure Hilfe, undzwar habe ich einen Fehler wenn ich den Code: ausführe. Es erscheint:
Fehler beim Ausführen des Installers
04/16/2011 - Metin2 Private Server - 0 Replies
Hey Community, ich habe ein Problem mit meinem neuen Installer, und ich kann leider keinen Fehler finden(was wahrscheinlich daran liegt, dass ich recht müde bin). Nun wollte ich euch fragen, wieso der Error 2P22# sh install.sh install.sh: 80: Syntax error: "elif" unexpected (expecting "then") 2P22# kommt. Ich hab mir das Script angeschaut, und keine Fehler gefunden. Hier ist der Sourcecode:
Keine Berechtigung beim Ausführen als Admin? / Rechte übertragen [TuT]
02/14/2011 - S4 League Hacks, Bots, Cheats & Exploits - 3 Replies
Da manche nicht die Berechtigung verfügen um einen Hack als Admin auszuführen, hier mal ein simples Tutorial um sie die Rechte zu verschaffen 1. Start -> Ausführen -> CMD 2. Ein schwarzes Fenster öffnet sich. 3. eingeben: net localgroup administrators /add (deinen Nutzernamen) 4. ggf. PC neustarten und fertig Hier auch noch ein Video dazu:
Problem beim make.sh ausführen!
12/30/2009 - Metin2 Private Server - 10 Replies
Es gibt da so einen Thread wo erklärt wird wie man make.sh ausführt (braucht man um etwas in deutsche übersetzte wirksam zu machen) Ich hab's genauso gemacht wie da und das sieht jetzt so aus: Directupload.net - D7iurojyi.jpg



All times are GMT +1. The time now is 23:23.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.