Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Anfänger-Eingabeproblem - Puffer leeren

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
11.08.2006, 15:50 Uhr
Yadgar



High!

Ich schlage mich im Moment mit einem Problem(chen?) herum, das üblicherweise ziemlich weit vorne in den Lehrbüchern abgehandelt wird: dem Tastaturpuffer.

Konkret: Ich will Elemente zweier Felder eingeben und diese Felder anschließend auf dem Bildschirm ausgeben. Da es sich um längere Felder handelt, rufe ich bei der Ausgabe alle 20 Zeilen eine Hilfsfunktion more() auf, die auf Druecken der Return-Taste wartet, was ich bislang immer mit getchar() realisiert habe.

Leider nützt mir getchar() nichts, wenn ich vorher cin verwendet habe - das die Eingabe abschließende Return bleibt dabei ja im Puffer und wird erst von more() ausgelesen.

Wie kann ich sicherstellen, dass das Return schon bei der Eingabe der Felddaten aus dem Puffer gelesen wird? cin.getline funktioniert ja nur mit Strings...

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.08.2006, 15:57 Uhr
~Blubber2063
Gast


Naja normalerweise in den dem du Elementweise std::cin >> variable.
Wüsste jetzt nicht wie du das effektiver von der Console lesen willst.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.08.2006, 16:00 Uhr
~Blubber2063
Gast


Ahso, falls es dir nur ums warten geht, mach doch einfach folgendes:


C++:
char bla;
while ((std::cin >> bla) != '\r'){}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.08.2006, 16:12 Uhr
0xdeadbeef
Gott
(Operator)


Am sinnvollsten ist es, die eingabe von vorneherein zeilenweise vorzunehmen. ich hab dafür vor ner weile mal ne template geschrieben, die ich recht nützlich finde: www.dev-geeks.org/index.php?module=scripts&sub=2&action=show&id=50

der hintergrund ist, dass, wenn zeilenweise eingelesen wird, das newline am ende einer zeile sich nachher nicht mehr im Eingabepuffer befindet und dir nicht in die Quere kommt. Sinnigerweise solltest du dann in more() auch

C++:
read_type<std::string>("Taste drücken");


oder so benutzen. Blubbers Idee funktioniert nur unter windows, da das das einzige system ist, dass als newline \r\n benutzt.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 11.08.2006 um 16:13 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.08.2006, 16:18 Uhr
Yadgar



High!


Zitat von ~Blubber2063:
Ahso, falls es dir nur ums warten geht, mach doch einfach folgendes:


C++:
char bla;
while ((std::cin >> bla) != '\r'){}




Funktioniert bei mir nicht, ich bekomme nur kryptischen Feldermeldungs-Salat!

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
11.08.2006, 16:20 Uhr
Yadgar



High!


Zitat von 0xdeadbeef:
Sinnigerweise solltest du dann in more() auch

C++:
read_type<std::string>("Taste drücken");


oder so benutzen. Blubbers Idee funktioniert nur unter windows, da das das einzige system ist, dass als newline \r\n benutzt.


Für mich ist sowas im Moment noch zu hoch... was einigermaßen(!) funktioniert, ist

while(!c) { cin >> c; }

...aber ich hätte es ja lieber, wenn ich einfach nur irgendeine Taste drücken müsste und nicht hinterher noch Return! In BASIC war das alles so einfach...

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
11.08.2006, 16:28 Uhr
~Bluber2063
Gast


Das ist zwar richtig, 0xdeadbeef, aber es ist ja von der Console, von daher wird jede Eingabe mit einem 'r' abgeschlossen soweit ich mich erinner, aber es geht trotzdem nicht weil er das abhackt. Unsauber kannst du schreiben System("pause"), sauber könntest du es trotzdem mit readline probieren.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
11.08.2006, 17:18 Uhr
0xdeadbeef
Gott
(Operator)


Aaaalso, langsam zum Mitschreiben:

UNIX und Derivate, sowie Amiga, BeOS usw. benutzen als newline-Zeichen schon seit Anbeginn der Computerzeit \n (ASCII 10).
Der Apple ][ und macintosh haben bis MacOS 9 \r benutzt, seit MacOS X, das den Darwin-Kernel (der auf BSD 4.4 aufbaut) benutzt, ist auch da \n newline.
CP/M, MS-DOS und Windows benutzen \r\n

Dann gibt es noch einige esoterischere ansätze, die heute aber kaum mehr benutzt werden (speziell ebcdic, und alte VMS-Kisten benutzten, glaube ich, eine Art Datenbankansatz). Um das ganze abzurunden, gibt es in unicode eine ganze reihe newline-charaktere / Zeichenfolgen, um das alles unter einen Hut zu bringen.

Beschränken wir uns auf die ersten drei Fälle, der Rest läuft euch bis auf unicode eh nicht über den weg, und da ist es egal, weil der alles kann. In C und C++ wird das so gelöst, dass es für Eingabeströme zwei Modi gibt - zum einen Text, zum anderen binär. Im Textmodus gelesene oder geschriebene Daten wandeln das plattformspezifische newline-Zeichen on the fly in ASCII 10 um, und so wird es dann intern weiterbehandelt. Am Beispiel:

C++:
printf("Hallo, Welt!\n");


gibt unter UNIX "Hallo, Welt!\n" aus, unter Windows aber "Hallo, Welt!\r\n"

Daher übrigens auch die Möglichkeit,

C++:
FILE *fd = fopen("foo.bar", "rb");


zu benutzen, was foo.bar binär zum Lesen öffnet. Wenn jetzt

C++:
fprintf(fd, "Hallo, Welt!\n");


ausgeführt wird, schreibt das Programm unabhängig von der Plattform "Hallo, Welt!\n" in die Datei, was dazu führt, dass sie unter Windows nicht vernünftig dargestellt werden wird, sondern halt mit Kästchen und ohne Zeilenumbruch. Unter UNIX macht "rb" übrigens keinen Unterschied zu "r" und wird in aller Regel einfach ignoriert.

Was das ursprüngliche Problem angeht,

C++:
char c;
std::cin >> c;


wartet auf die Eingabe eines nicht-newline-Zeichens. Was hier gewollt ist, ist sowas wie

C++:
while(std::cin.getc() != '\n');


Auf eine beliebige Taste zu reagieren, ist plattformabhängig und nicht unbedingt ganz trivial. Für UNIX hab ich hier: www.fun-soft.de/showtopic.php?threadid=5157 mal was dazu geschrieben, unter windows gibts in der conio.h die Funktion getch(), die im Grunde genau das macht. Allerdings muss auch da der stream geleert sein.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
11.08.2006, 17:38 Uhr
~Blubber2063
Gast


Öhmm, ja das war schon so einigermassen klar, obwohl mir das mit dem Wandeln nicht ganz bekannt, war ist aber logisch, aber ich mag mich ja wie gesagt irren, aber beim lesen von der Console steht eigentlich immer \r hinten dran, da eine Eingabe ja mit Enter abgeschlossen wird, so von wegen altem Terminal zeugs und so. Spielt zwar für die Frage hier eh keine Rolle, weil man ja anscheinend den Modus nachträglich nicht umstellen kann. Hier aber noch mal ne Lösung für einfach nur Enter:
char bla[2] = "a";
while (strcmp(bla,"") != 0){
std::cin.getline(bla,2);
std::cout <<bla << std::endl;
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
11.08.2006, 18:39 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Eben das kommt ja auf das System drauf an. <Enter> ist ja auf manchen Systemen \r\n oder \n. Was dahinter steht bestimmt das Betriebssystem
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: