Probleme mit cin

P

Peter Stoffer

Neues Mitglied
Thread Starter
Dabei seit
18.02.2004
Beiträge
15
Reaktionspunkte
0
Hallo zusammen

ich habe ein kleines Problem mit der Standardeingabe cin in C++. Bei verschiedenen Programmbeispielen muss man untersuchen, ob cin etwas liefert, d.h. die Ausdrücke (cin >> variable) oder (cin.get(variable)) werden auf 0 hin untersucht.
Ich habe nun das Problem, dass bei mir cin gar nie nichts liefern will: Wenn ich in der Konsole nichts eingebe und Enter drücke, passiert nichts, das Programm wartet so lange, bis ich etwas eingegeben habe.
Wo liegt da genau der Fehler?
Vielen Dank für eure Hilfe.
 
Es wäre einfacher dir zu helfen wenn du den quellcode mit posten wuerdest, alles andere waere sonst nur ein schuss ins blaue
 
Also, nur so ganz schnell aus dem Kopf:
Code:
#include <iostream.h>

int main()
{

	char *eingabe;

	cin >> eingabe;

	if (!eingabe)
		cout << "Nichts eingegeben!" << endl;
	else
		cout << "Eingabe: " << eingabe << endl;
}
Das Programm wartet nun, bis wirklich etwas eingegeben wurde, d.h. der Codeabschnitt
cout << "Nichts eingegeben!" << endl;
kann gar nicht ausgeführt werden.

Gruss Peter
 
Herauszufinden, ob du nicht-blockierend lesen kannst, ist leider nicht betriebssystemunabhängig möglich. Unter Unixoiden (Linux, OS X, FreeBSD, Solaris usw.) funktioniert meistens folgender Code:
Code:
int InputReady(void)
{
    fd_set rfd;
    struct timeval timeout;
    timeout.tv_sec = timeout.tv_usec = 0;
    FD_ZERO(&rfd);
    FD_SET(0, &rfd);

    return select(1, &rfd, NULL, NULL, &timeout) > 0;
}
Die Funktion gibt true zurück, wenn du nicht blockierend vom Filedescriptor 0 (das ist die Standardeingabe) lesen kannst. Du musst vermutlich noch einige Dinge #includen, schau mal in der man page von select(2).
 
Hmm, heisst das, je nach OS kann man gar nicht einlesen, wenn nichts eingegeben wurde?
 
Man kann NIE einlesen wenn nichts eingegeben wurde. :D

Da Du aber OS X hast funktioniert das was current gepostet hat. Pass nur auf die Pufferung auf. Wenn Du einmal auf den Unix-fd direkt zugreifst anstatt auf das Streamobjekt der C++-Umgebung solltest Du das auch immer tun, d.h. mit read() lesen. Ist dann etwas aufwändiger als der Krempel mit dem blöden "die Eingabe fliesst nach rechts in die Variable eingabe"...
 
Das Standardverhalten ist, dass der read(2) blockiert, bis eine Zeile abgeschlossen ist. Irgendwie lässt sich das auch per ioctl(2) ändern, Details solltest du (wenn es dich wirklich interessiert) in der man page von termios(4) finden...
 
Gut, danke für die Hilfe. Da ich immer noch damit beschäftigt bin, mich in C++ einzuarbeiten, werde ich das Problem vorübergehend auch ignorieren können...
 
Hi,

versuche statt >> mal get oder getline. Die reagieren auch, wenn nur auf die Returntaste gehauen wird. Ach ja, in einen ins Nirvana zeigenden char* einzulesen ist eine schlechte Idee...

Hier ein Beispiel:
Code:
#include <string>
#include <iostream>

using namespace std;

int main()
{
        string eingabe;

        getline(cin,eingabe);

        if (!eingabe.length())
                cout << "Nichts eingegeben!" << endl;
        else
                cout << "Eingabe: " << eingabe << endl;
}

Gruß,
Marcel
 
Zurück
Oben Unten