problemchen bei getline
-
hi,
ich hab n kleines programm geschrieben, mit der man eine datei einliest und bearbeitet. zum einlesen des funktionsmodus und des dateinames hab ich folgenden code geschrieben:#include <iostream> #include <fstream> #include <string> using namespace std; int main() { string filename; int i; do{ cout << "1. a\n2. b\n3. c\n"; cin >> i; if (cin.fail() ) // Fehler aufgetreten { cin.clear(); cin.seekg(0, ios::end ); i=4; } } while (i!=1 && i!=2 && i!=3) ; switch (i) { case 1: cout<<"Modus a\n"; break; case 2: cout<<"Modus b\n"; break; case 3: cout<<"Modus c\n"; } cout << "Dateiname: "; getline (cin, filename); cout << "Lese Datei "<<filename.c_str()<<"\n"; ifstream testfile (filename.c_str()); if(testfile) { //wasauchimmer } else cout << "Es ist ein Fehler beim öffnen aufgetreten!!\n"; testfile.close(); cin.sync(); cin.clear(); cin.get(); return 0; }
den modus liest er problemlos ein, nur wartet er beim getline gar nicht auf ne eingabe, sondern geht gleich weiter, ohne nen dateinamen
... welchen fehler
hab ich gemacht? ich benutz dev-cpp...danke für eure hilfe
grüsse steve
-
Füge das einfach mal vor deinem getline ein:
cin.ignore(2, '\n');
Dann sollte es gehen....
Btw:
Deine Fehlerabfrage würde ich etwas anders gestalten, zumal sie auch nicht korrekt ist:do{ cout << "1. a\n2. b\n3. c\n"; cin >> i; // Wenn Eingabe ungültig... if(cin.fail() || i>3 || i<1){ cout << "Eingabe ungueltig" << endl; cin.clear(); cin.ignore(numeric_limits<int>::max(), '\n'); } else break; // Sonst weiter... } while (1);
-
hallo,
ok danke... des mit der fehlerabfrage hatte ich mal von irgendwo kopiert
übrigens klappt das in der konsolen-faq angegebenestd::cin.clear (); std::cin.ignore ( std::cin.rdbuf () -> in_avail () ); std::cin.get ();
zur abfrage einer eingabe vor dem schliessen mit meinem dev-cpp auch nicht. unter vc 6 gehts aber ohne probleme
edit:
und was bedeutet eigentlich die 2 beicin.ignore(2, '\n');
thx
grüsse steve
-
ignore(2, '\n') ignoriert die letzten beiden Zeichen im Stream bzw. bis zum ersten '\n'.
std::cin.clear (); std::cin.ignore ( std::cin.rdbuf () -> in_avail () ); std::cin.get ();
Bei mir funktioniert das, auch mit dem Dev-Cpp.
-
CarstenJ schrieb:
Bei mir funktioniert das, auch mit dem Dev-Cpp.
Da wo es nicht funktioniert, hilft in der Regel die Ersetzung der ignore-Zeile durch ein cin.sync();
-
ok danke!
grüsse steve
-
hi,
ich hab mein programm heut mal im vc 6 getestet, und da meckert er beimCarstenJ schrieb:
cin.ignore(numeric_limits<int>::max(), '\n');
is das jetzt n fehler im vc 6? wie krieg ichs denn am besten zum laufen, ich wollt das programm eigentlich möglichst kompatibel zu allen compilern machen
grüsse steve
-
Am besten postest du immer die Fehlermeldung dazu, sonst wirds schwierig mit Helfen. Hast du auch <limits> includiert? numeric_limits ist jedenfalls Standard.
-
hm achso limits brauche ich dafür...
ok, bloß wie gross ist die? ich brauch die eigentlich sonst ja nicht, und vielleicht wäre es praktischer dann ne andere methode zu nehmen, oder gehts anders nicht?grüsse steve
-
Ich glaube nicht, dass Limits deinen Programmrahmen sprengen wird. Es ist sicher und Standard. Wenn keine gravierenden Gründe dagegen sprechen, würde ich das drinlassen.
-
cin.ignore(cin.rdbuf()->in_avail());
wäre ja auch denkbar
-
Wenn ich das an der Stelle ersetze, gibts bei Eingabe eines Buchstabens eine Endlosschleife. Ist also nicht Idiotensicher