Guybrush Threepwood Geschrieben 15. Oktober 2003 Geschrieben 15. Oktober 2003 Hi, gibt es eine Möglichkeit festzustellen ob sich in der Standardeingabe ein Zeichen befindet? Also bevor ich es mit getch(), oder so, hole will ich wissen ob etwas da ist. Gruß Guybrush PS: Es sollte ANSI Konform sein. Zitieren
GrEnE Geschrieben 15. Oktober 2003 Geschrieben 15. Oktober 2003 Puh gute Frage - Spontan sage ich nein - wieso auch? Einzigste lösung ohen auszulesen, ist zu gucken ob man die Pointer verschieben kann. Oder den std::cin in einen istringstream leiten und dann prüfen ob was drin ist. mit "str()" bekommt du dann den string. Zitieren
hmaas Geschrieben 15. Oktober 2003 Geschrieben 15. Oktober 2003 Original geschrieben von GrEnE Oder den std::cin in einen istringstream leiten ... Wenn du schon cin nimmst, kannst du auch cin.peek nehmen. Liest das Zeichen ein, lässt es aber in der Standardeingabe stehen Pönk Zitieren
Guybrush Threepwood Geschrieben 15. Oktober 2003 Autor Geschrieben 15. Oktober 2003 Ich will ja nichts einlesen. Die Funktion soll nur kucken ob was da ist und direkt returnen. Im Prinzip so wie kbhit(), aber das läuft nur unter Windows. Zitieren
GrEnE Geschrieben 16. Oktober 2003 Geschrieben 16. Oktober 2003 Hmm, da wird dir wohl nichts übrig bleiben das selbst zu programmieren. bool isWasDrin( std::istream& is ); -> wäre der Funktionskopf. Zitieren
Guybrush Threepwood Geschrieben 16. Oktober 2003 Autor Geschrieben 16. Oktober 2003 Naja, mit dem Zeigerverschieben scheint aber im stdin nicht zu funktionieren, oder hast du das schonmal gemacht? Es gäbe zwar eine Assemblerlösung, aber ich habe bis heute noch nicht verstanden warum ich im Inlineassembler keine Interrupts aufrufen kann. Zitieren
GrEnE Geschrieben 17. Oktober 2003 Geschrieben 17. Oktober 2003 Original geschrieben von Guybrush Threepwood Naja, mit dem Zeigerverschieben scheint aber im stdin nicht zu funktionieren, oder hast du das schonmal gemacht? Nö - aber ich würde es folgendeweise machen: bool isWasDrin(std::istream& is) { is.seekg(1); if( std::cin.good() ) { return true; } else { std::cin.clear(); // um später damit noch zu arbeiten return false; } } Aufruf wäre "isWasDrin(std::cin)"! - Geht auch ohne Funktion Zitieren
Guybrush Threepwood Geschrieben 17. Oktober 2003 Autor Geschrieben 17. Oktober 2003 Wie ich aber bereits oben geschrieben habe, scheint man im Eingabepuffer den Dateizeiger nicht verschieben zu können;) Zitieren
nic_power Geschrieben 17. Oktober 2003 Geschrieben 17. Oktober 2003 Hallo, Das ganze ist leider etwas fummelig. Du könntest das Zeichen mit "getc()" einlesen und wieder mit "ungetc()" in den Strom zurückschreiben (sofern getc() auch tatsächlich was gelesen hat). Das ist zwar keine sehr elegante Lösung, sollte aber auch mit stdin funktionieren. Nic Zitieren
GrEnE Geschrieben 17. Oktober 2003 Geschrieben 17. Oktober 2003 Original geschrieben von Guybrush Threepwood Wie ich aber bereits oben geschrieben habe, scheint man im Eingabepuffer den Dateizeiger nicht verschieben zu können;) Also was ich da geschrieben habe funktioniert auch mit std::cin - habe es ausprobiert! - std::cin ist doch nichts anderes als ein std:.istream! Wenn seekg schief läuft, ist der Stream bad bzw. nicht good - also ist ncihts drin. Original geschrieben von nic_power Das ganze ist leider etwas fummelig. Du könntest das Zeichen mit "getc()" einlesen und wieder mit "ungetc()" in den Strom zurückschreiben (sofern getc() auch tatsächlich was gelesen hat). Das ist zwar keine sehr elegante Lösung, sollte aber auch mit stdin funktionieren. Naja dann kann man auch 'peek()' benutzen - der schreibt das Zeichen raus und behält es im stream - dann braucht man kein ungetc() mehr machen. Zitieren
nic_power Geschrieben 17. Oktober 2003 Geschrieben 17. Oktober 2003 Hallo, Original geschrieben von GrEnE Naja dann kann man auch 'peek()' benutzen - der schreibt das Zeichen raus und behält es im stream - dann braucht man kein ungetc() mehr machen. In ANSI-C (nicht C++)? Die getc()/ungetc() ist eine Lösung, die auch ohne C++ laufen sollte. Nic Zitieren
Guybrush Threepwood Geschrieben 17. Oktober 2003 Autor Geschrieben 17. Oktober 2003 Das Problem ist, das getc() solange wartet bis ein Zeichen im Puffer ist. Am besten beschreibe ich das Problem mal genauer:floet: Also wir haben eine Tastatur mit eingebautem Magnetkartenleser. Wenn man jetzt eine Magnetkarte dadurch zieht, schickt die Tastatur die Daten einfach über die standart Eingabe. Wir brauchen ein Programm das zwei Sachen aus dem String raussplittet und in eine Datei schreibt. Das habe ich unter Windows äußerst umständlich mit einer Schleife gelöst die glaube ich so aussieht (ist auf der Arbeit): char szDaten[300]; int i=0; while(true) { szDaten[i] = getchar(); i++; Sleep(15); if (!kbhit()) break; } szDaten[i] = '\\0'; [/PHP] Das Problem ist das das Programm auch unter Linux laufen soll und dort kbhit() nicht existiert. Wenn ihr meint das ich im stdin auch den dateizeiger verschieben kann, muss ich das am Montag wohl nochmal ausprobieren. Gruß Guybrush Zitieren
GrEnE Geschrieben 18. Oktober 2003 Geschrieben 18. Oktober 2003 Original geschrieben von Guybrush Threepwood Wenn ihr meint das ich im stdin auch den dateizeiger verschieben kann, muss ich das am Montag wohl nochmal ausprobieren. Ja meine ich - denn wie schon geschrieben, ist std::cin ein std::istream und somit kann man mit dem Ding machen was man "normalerweise" auch machen kann - ist keine Unterschied. Deswegen schreibe ich immer Funktionen,die einen std::istream& bekommen, um nicht immer zu denken, "hmm kann ich dass jetzt überhaupt mit der Standarteingabe? und wenn du die Funktionen aufruufst, steckst du einfach eine std::cin rein - und voila, sollte alles gehen! Zitieren
Guybrush Threepwood Geschrieben 28. Oktober 2003 Autor Geschrieben 28. Oktober 2003 Ok deine Funktion scheint doch zu funktionieren. Allerdings nicht wenn ich das mit getchar() mische. Gibt es irgendeine Möglich mit cin nur ein Zeichen zu lesen ohne auf ein Return zu warten? Zitieren
GrEnE Geschrieben 30. Oktober 2003 Geschrieben 30. Oktober 2003 Original geschrieben von Guybrush Threepwood Ok deine Funktion scheint doch zu funktionieren. Allerdings nicht wenn ich das mit getchar() mische. Gibt es irgendeine Möglich mit cin nur ein Zeichen zu lesen ohne auf ein Return zu warten? Meinst du mit ein Zeichen genau ein char oder noch andere Typen. Da fällt mir dann nur folgendes ein: char ch; std::cin >> ch; [/PHP] Liest genau ein char ein! - aber macht get() das nicht auch?! Sonst: [PHP] std::string str; std::cin.readsome( str, 1) Aber da weiß ich nicht, ob es funktioniert. Zitieren
GrEnE Geschrieben 31. Oktober 2003 Geschrieben 31. Oktober 2003 Original geschrieben von Guybrush Threepwood Ok deine Funktion scheint doch zu funktionieren. Allerdings nicht wenn ich das mit getchar() mische. Gibt es irgendeine Möglich mit cin nur ein Zeichen zu lesen ohne auf ein Return zu warten? Habe nochmal über Nacht über deine Anfrage überlegt und dabei festgestellt, dass meine Antwort "Schwachsinn" ist, denn bei meinen obrigen Antworten, musst du ja auch "return" drücken/drauf/warten. Aber um die Antwort jetzt beantworten: Habe noch was gefunden - aber so wie es aussieht, ist das Platform abhängig. Die Funktion heißt: getch() und ist scheint wohl noch von C zu kommen. Gruß GrEnE Zitieren
nic_power Geschrieben 31. Oktober 2003 Geschrieben 31. Oktober 2003 Hallo, Original geschrieben von GrEnE Aber um die Antwort jetzt beantworten: Habe noch was gefunden - aber so wie es aussieht, ist das Platform abhängig. Die Funktion heißt: getch() und ist scheint wohl noch von C zu kommen. Hast Du mal das allererste Posting in diesem Thread gelesen? getch() ist eine Funktions aus der Curses-Bibliothek. Nic Zitieren
GrEnE Geschrieben 31. Oktober 2003 Geschrieben 31. Oktober 2003 Original geschrieben von nic_power Hast Du mal das allererste Posting in diesem Thread gelesen? getch() ist eine Funktions aus der Curses-Bibliothek. Ja und? - Er kann ja jetzt getch() aufrufn - denn mit IsWasDrin(..) - kann er ja prüfen, ob was drin ist! - Im ersten Posting steht ja nicht, das er getch() nicht nutzen will, oder habe ich mich da verlesen - er konnte nur nicht getch() aufrufen, weil er nicht wusste, ob was drin ist, aber dass hatte wir ja im Laufe geklärt (7. und 14. Posting!) Zitieren
nic_power Geschrieben 31. Oktober 2003 Geschrieben 31. Oktober 2003 Hallo, Original geschrieben von GrEnE Ja und? - Er kann ja jetzt getch() aufrufn - denn mit IsWasDrin(..) - kann er ja prüfen, ob was drin ist! - Nein geht nicht. Nochmal: getch() ist eine Funktion aus der curses/ncurses Bibliothek. Diese implementiert ein komplett eigenständiges Handling der Terminal Ein- und Ausgaben. Du kannst diese Funktion nicht (!) mit Streams oder den normalen Standard C-Eingabemechanismen zusammen verwenden. Es gibt auch noch ein Dos getch() aus conio.h, dieses ist jedoch MS spezifisch und in keinster Weise portabel (die curses/ncurses ist hingegen portabel, da die Bibliotheken für praktisch alle Plattformen verfügbar sind - von einen möglichen Nameclash mal abgesehen). Nic Zitieren
Guybrush Threepwood Geschrieben 31. Oktober 2003 Autor Geschrieben 31. Oktober 2003 Ich habe jetzt eine Lösung gefunden. Es sind zwar leider zwei verschiedene Lösungen für Windows und Linux, aber es läuft. Außerdem haben wir uns doch entschieden das vorher feststeht wieviele Zeichen eingelesen werden. Unter Windows habe ich jetzt eine ganz normale for Schleife mit getch() (aus conio.h). Unter Linux habe ich auch eine for Schleife, aber mit einer eigenen Funktion, die ich per google gefunden habe, die das selbe macht wie getch() (die ich aber unter Windows nicht kompilieren konnte). Danke für eure Bemühungen! Gruß Guybrush Zitieren
nic_power Geschrieben 31. Oktober 2003 Geschrieben 31. Oktober 2003 Hallo, Original geschrieben von Guybrush Threepwood die das selbe macht wie getch() (die ich aber unter Windows nicht kompilieren konnte). Lass mich raten: Irgendwas, was über termios das Terminal in den noncanonical Mode versetzt, um die Zeichen einzeln lesen zu können (wäre zumindest nahe liegend)? Das läßt sich unter Windows sicherlich nicht so ohne weiteres kompilieren, da es bereits bei den verschiedenen Linux/Unix-Versionen teilweise sehr subtile Unterschiede beim termios-Handling gibt. Poste doch mal den Code. Nic Zitieren
Guybrush Threepwood Geschrieben 31. Oktober 2003 Autor Geschrieben 31. Oktober 2003 Original geschrieben von nic_power Hallo, Lass mich raten: Irgendwas, was über termios das Terminal in den noncanonical Mode versetzt, um die Zeichen einzeln lesen zu können (wäre zumindest nahe liegend)? Ich hab da nicht so ganz durchgeblickt, aber ich meine termios oder so da gelesen zu haben. Werd den Code nächste Woche mal posten. Zitieren
Guybrush Threepwood Geschrieben 20. November 2003 Autor Geschrieben 20. November 2003 Original geschrieben von nic_power die curses/ncurses ist hingegen portabel, da die Bibliotheken für praktisch alle Plattformen verfügbar sind - von einen möglichen Nameclash mal abgesehen. Weißt du wo ich die herbekomme? Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.