Probleme mit cin

  1. Peter Stoffer

    Peter Stoffer Thread Starter MacUser Mitglied

    Mitglied seit:
    18.02.2004
    Beiträge:
    15
    Zustimmungen:
    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.
     
    Peter Stoffer, 16.02.2005
    #1
  2. TheFallenAngel

    TheFallenAngel MacUser Mitglied

    Mitglied seit:
    27.10.2003
    Beiträge:
    501
    Zustimmungen:
    7
    Es wäre einfacher dir zu helfen wenn du den quellcode mit posten wuerdest, alles andere waere sonst nur ein schuss ins blaue
     
    TheFallenAngel, 16.02.2005
    #2
  3. Peter Stoffer

    Peter Stoffer Thread Starter MacUser Mitglied

    Mitglied seit:
    18.02.2004
    Beiträge:
    15
    Zustimmungen:
    0
    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
     
    Peter Stoffer, 16.02.2005
    #3
  4. current

    current MacUser Mitglied

    Mitglied seit:
    02.10.2004
    Beiträge:
    64
    Zustimmungen:
    1
    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).
     
    current, 16.02.2005
    #4
  5. Peter Stoffer

    Peter Stoffer Thread Starter MacUser Mitglied

    Mitglied seit:
    18.02.2004
    Beiträge:
    15
    Zustimmungen:
    0
    Hmm, heisst das, je nach OS kann man gar nicht einlesen, wenn nichts eingegeben wurde?
     
    Peter Stoffer, 16.02.2005
    #5
  6. dannycool

    dannycool MacUser Mitglied

    Mitglied seit:
    02.02.2005
    Beiträge:
    1.489
    Zustimmungen:
    34
    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"...
     
    dannycool, 16.02.2005
    #6
  7. current

    current MacUser Mitglied

    Mitglied seit:
    02.10.2004
    Beiträge:
    64
    Zustimmungen:
    1
    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...
     
    current, 16.02.2005
    #7
  8. Peter Stoffer

    Peter Stoffer Thread Starter MacUser Mitglied

    Mitglied seit:
    18.02.2004
    Beiträge:
    15
    Zustimmungen:
    0
    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...
     
    Peter Stoffer, 16.02.2005
    #8
  9. Marzelpan

    Marzelpan MacUser Mitglied

    Mitglied seit:
    31.10.2003
    Beiträge:
    58
    Zustimmungen:
    0
    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
     
    Marzelpan, 17.02.2005
    #9
Die Seite wird geladen...
Ähnliche Themen - Probleme cin
  1. Massaguana
    Antworten:
    12
    Aufrufe:
    709
    Massaguana
    02.12.2016
  2. yardo
    Antworten:
    11
    Aufrufe:
    1.042
    yardo
    03.06.2016
  3. Technik Werner
    Antworten:
    1
    Aufrufe:
    737
    Technik Werner
    20.05.2015
  4. mutonia
    Antworten:
    5
    Aufrufe:
    646
    mutonia
    10.05.2015