Zum Inhalt springen

Feststellen ob Zeichen im stdin wartet


Guybrush Threepwood

Empfohlene Beiträge

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 ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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. ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...
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. ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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!) :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 3 Wochen später...

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...