NAS

C++ getline-Funktion in .h Datei?

MeandXP

Ensign
Registriert
Juli 2009
Beiträge
171
Hallo zusammen,

Habe in meinem Programm eben eine eigene Funktion in einer header-Datei verpackt, die aus der main-Funktion aufgerufen wird. Allerdings wartet das Programm bei
Code:
getline(cin, input);
garnicht auf eine Eingabe, sondern mach direkt mit der nächsten Anweisung weiter! als die Funktion noch in der main-Datei war hat es funktioniert!

Nehmt das brett vor meinem Kopf weg oder helft mir sonst, :D

mfG, MeandXP.
 
Hab schon länger nicht mehr programmiert, aber ist es nicht so, dass du die Funktion (z.B. getline) in der Header-Datei definierst und die Implementierung in der Zugehörigen C bzw. C++-Datei vornimmst (und main-Datei + Header + CPP entsprechend verlinkst)?
Was auch immer gern eine Fehlerquelle ist: Wurden die namespace's richtig definiert? Zu guter letzt könnte es auch am vollen Puffer liegen: Dazu einfach folgende Zeilen Code einfügen vor dem Funktionsaufruf:

std::cin.clear();
std::cin.ignore(std::cin.rdbuf()->in_avail());

Ich hoffe, ich konnte dir helfen.
 
Zuletzt bearbeitet:
also "std::" kann ich mir sparen, -> "using namespace std;'". Habe deinen Code hinzugefügt, funktioniert leider trotzdem nicht....
Die header Datei ist richtig verlinkt, deren Funktion wird ja auch problemlos aufgerufen, nur halt dass die getline-Anweisung nicht funzt!
 
Zuletzt bearbeitet:
Hast du vielleicht noch ein Enter im Eingabestrom? Ich glaub das ging mit cin.flush() oder so weg.
 
Existiert leider nicht, ähnlicher code von tvo hat ja leider auch nicht gefunzt...
Ergänzung ()

Yihaa!
cin.ignore(); ohne Parameter hat den gewünschten Erfolg gebracht!
Danke für die Hilfe!

mfg, MeandXP.
 
MeandXP schrieb:
also "std::" kann ich mir sparen, -> "using namespace std;'".
... genau was ich vor ein paar Tagen schon mal hier geschrieben habe: "using namespace std" holt dir alles Mögliche in dein Programm rein, von dem du potenziell keine Ahnung hast.

Vermutlich versuchst du mit deiner Konstruktion da also die Funktion http://www.cplusplus.com/reference/string/getline/ zu überladen bzw. könntest da noch Probleme bekommen.
 
Sukrim schrieb:
... genau was ich vor ein paar Tagen schon mal hier geschrieben habe: "using namespace std" holt dir alles Mögliche in dein Programm rein, von dem du potenziell keine Ahnung hast.

Ganz genau!

Der ganze Sinn und Zweck von Namespaces ist es, Namenskollisionen zu vermeiden. using namespace ... macht das alles zunichte; da hätte man Namespaces in C++ auch gar nicht erst einführen müssen. Man kann doch nicht echt zu faul sein, hier und da mal ein std::-Präfix hinzuschreiben, oder?
 
antred schrieb:
Man kann doch nicht echt zu faul sein, hier und da mal ein std::-Präfix hinzuschreiben, oder?

...oder nur die Elemente die man braucht, ala:

Code:
using std::cout;
using std::endl;

Ergibt die genau gleiche Funktionalität (man kann cout statt std::cout verwenden) aber kommt nicht mit Kind und Kegel in dein Programm reingerauscht.
 
MeandXP schrieb:
also "std::" kann ich mir sparen, -> "using namespace std;'".
In .cpp's scheiden sich die Lager, ob std:: oder nicht - aber in Headern ist das ein absolutes No-Go! Anderenfalls kannst du die Namensauflösung von anderen Headern verändern und eine ansich korrekte Headerdatei kompiliert auf einmal nicht mehr - oder noch schlimmer, funktionert, aber anders als erwartet. Da hat man dann jede Menge Spaß beim Debuggen...

MeandXP schrieb:
cin.ignore(); ohne Parameter hat den gewünschten Erfolg gebracht!
Das ist nur eine symptomatische Krücke, die das Problem verschleiert.

Du wirst höchstwahrscheinlich formatierten mit nicht formatiertem Input gemischt haben.
getline ist unformatiertet Input. D.h. wenn du vorher cin >> irgendwas; gemacht hast, fällt getline deswegen auf die Nase. Poste mal etwas mehr Code, dann kann man mal schauen, wie man's richtig macht.
 
Habe jetzt im header "using namespace std;" entfernt und überall wo's nötig war "std::" hinzugefügt (natürlich auch cin.ignore entfernt), und es funktioniert auch.
Verstehe nur nicht warum? :rolleyes:

mfg MeandXP.
 
Ohne Code ich leider auch nicht. :) Wenn du Code reinstellst, kann man mehr dazu sagen. Ansonsten schau zumindest mal, ob du vor dem getline irgendwo cin >> benutzt.

Gruß
 
Ja, in der Hauptfunktion bevor die Funktion des Headers aufgerufen wird!
 
Dann erklärt es das Verhalten. Formatiertem Input ist es egal, ob ein \n als nächstes kommt. In jedem operator>> werden alle Whitespaces (dazu zählt auch \n) überlesen, bevor es an das Lesen eines Wertes geht.
Wenn du also 5<ENTER> eingibst, steht "5\n" im Stream. operator>> (für int) liest die 5, erkennt \n als ungültiges für eine Zahl und hört an diesem Punkt auf.
getline wiederum ist unformatierter Input, dem ist das \n nicht egal (denn dort hört es auf Zeichen aus dem Stream zu extrahieren).

Am besten machst du sowas hier anstatt einem ignore (ungetestet und nicht kompiliert):
Code:
void f( std::istream& in, std::string& s)
{
  if( in.peek() == std::istream::traits_type::to_int_type( in.widen('\n'))) {
    in.get();
  }
  std::getline( in, s);
}

Vorteil: Du wirfst nicht einfach irgendwelchen Content weg, im Gegensatz zu ignore und machst genau das, was du erwartest, wenn du vorher formatierten Input benutzt hast.

Dir geht so aber immer der Fall durch die Lappen, dass eine berechtigte leere Zeile im Stream steht, wenn du vorher keinen formatierten Input gemacht hast.



Nur so nebenbei: IOStreams benutzt man nicht in Headern, weil das Zeug ziemlich fett ist und in andere Header verschleppt wird, die diesen inkludieren. In Headern macht man ab besten nur ein #include <iosfwd>, wenn Forward-Deklarationen ausreichen (was sie in einem Header eigentlich immer sollten).
 
Danke erstmal für die Erklärung! :)

Am besten machst du sowas hier anstatt einem ignore
Den hatte ich ja schon ersetzt! ;)

Habe iostream ebenfalls ersetzt, danke für den Tipp!

Programm läuft jetzt soweit rund (auch wenn es eigentlich nicht viel kann, war mehr son Projekt aus Langeweile :D)

btw: hat jemand von euch Erfahrungen mit Grafischen Oberflächen? WxWidgets, Qt o.ä.?

mfg, MeandXP.
 
Zurück
Oben