Entwickler-Ecke
C# - Die Sprache - Tastaturpuffer löchen
Spot - Fr 08.06.07 14:18
Titel: Tastaturpuffer löchen
Hallo zusammen,
ich habe folgendes Problem ...
einfache Userabfrage mit dementsprechender Usereingabe und dies in einer Schleife für den Fall das der User mehrere Eingabe tätigen möchte ...
An sich funktioniert dies auch alles wunderschön, nur das wenn die Schleife wiederholt werden soll die erste Eingabe übersprungen wird und gleich zur zweiten geht.
nach meinen bisherigen überlegungen und meinungsaustausch, dürfte es daran liegen das Console.ReadLine(); etwas im Puffer hält ...
so daher meine Frage gibt es in C# die Möglichkeit den Tastaturpuffer oder auch welchen Puffer ReadLine() verwendet zu löschen?
Danke für euere Hilfe!
Gruß Spot
JüTho - Fr 08.06.07 17:18
Hallo,
das mit dem Puffer halte ich nach der Konstruktion der NET-Klassen für äußerst unwahrscheinlich. Ein solches Problem tritt eigentlich eher dann auf, wenn Anfangs- oder Endbedingungen für Schleifen nicht korrekt sind. Aber ohne Code kann man wild drauflos raten; das will ich Dir (und mir) ersparen.
Gruß Jürgen
Spot - Mo 11.06.07 07:46
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| bool wdh;
do { string eingabe_vname = ""; string eingabe_name = ""; string eingabe_geb = ""; char eingabe_wdh = ' ';
Console.Clear();
Console.WriteLine("Neuen Eintrag erstellen");
Console.WriteLine("Bitte tätigen sie ihre Eingabe");
Console.Write("Vorname: "); eingabe_vname = Console.ReadLine();
Console.Write("Name: "); eingabe_name = Console.ReadLine();
Console.Write("Geburtstag (\"tt.mm.jjjj\"): "); eingabe_geb = Console.ReadLine();
Console.WriteLine(" "); Console.WriteLine("Danke für ihre Eingabe!"); Console.WriteLine(" "); string[,] datensatz_neu = new string[1, 3]; datensatz_neu[0, 0] = eingabe_vname; datensatz_neu[0, 1] = eingabe_name; datensatz_neu[0, 2] = eingabe_geb;
for (int i = 0; i < datensatz_neu.GetLength(0); i++) { Console.WriteLine("Datensatz " + (i + 1)); for (int j = 0; j < 3; j++) { Console.Write(datensatz_neu[i, j] + " "); } } Console.WriteLine(); Console.Write("weitere Eingabe? (j/n): "); eingabe_wdh = Convert.ToChar(Console.Read());
if (eingabe_wdh == 'j') wdh = true; else wdh = false; } while (wdh == true); |
mhh ok also dann erstmal zur erleichterten fehlersuche der quellcode ...
die ausgabe über das array dient mir erstmal zum test mehr nicht.
gruß spot
JüTho - Mo 11.06.07 09:22
Hallo,
danke für den Code; so kann man denken (statt raten).
Verstehe ich Dein Problem richtig, dass die ReadLine-Methode nach Write("Vorname") nicht ausgeführt wird? Hast Du das auch mit dem Debugger kontrolliert?
Richtig erklären kann ich das Verhalten nicht. Meine Vermutung ist, dass die Read-Methode am Ende ungünstig ist:
Zitat: |
Console.Read-Methode (Auszug aus der Doku)
Die Read-Methode wird blockiert, solange Sie Eingabezeichen eingeben, und wird beendet, wenn Sie die Enter-TASTE drücken. Beim Drücken der EINGABETASTE wird eine plattformabhängige Zeilenabschlusssequenz an die Eingabe angehängt (unter Windows z. B. eine Sequenz aus Wagenrücklauf und Zeilenvorschub). Nachfolgende Aufrufe der Read-Methode rufen die Eingabe Zeichen für Zeichen ab. Nachdem das letzte Zeichen abgerufen wurde, wird Read wieder blockiert und der Zyklus wiederholt. |
Verwende doch einfach ReadKey(); dann wird gezielt eine Taste gelesen, und Du ersparst Dir außerdem die Konvertierung:
C#-Quelltext
1: 2:
| ConsoleKeyInfo eingabe_wdh = Console.ReadKey(); wdh = eingabe_wdh.KeyChar == 'j'; |
Gruß Jürgen
PS. Zu meiner zweiten Änderung (die auch eine Verkürzung des Codes bedeutet) siehe auch:
[Tipp] Anfängerfehler == true / == false [
http://www.mycsharp.de/wbb2/thread.php?threadid=17536]
Spot - Mo 11.06.07 10:12
so zum problem nochmal kurz was ...
also beim ersten durch lauf funktioniert alles so wie es soll ...
kommt es zu einem weiteren schleifen durchlauf dann wird das erste
readline übersprungen und eine eingabe ist erst ab dem zweiten möglich.
ja ich habs debugged und da is es mir auf gefallen das er das readline einfach
überspringt.
würde ich ein weiteres readline vor das momentan erste schreiben dann funktioniert es
auch wieder richtig aber nur in der wiederholten schleife ...
beim ersten durchlauf müsste ich zwei eingabe tätigen ...
nuja ok dann werd ich mal deinen tipp ausprobieren und deinen hinweis zu den
"anfängerfehlern" auch mal durchforsten.
...
sheepy - Do 21.06.07 12:37
JüTho hat folgendes geschrieben: |
C#-Quelltext 1: 2:
| ConsoleKeyInfo eingabe_wdh = Console.ReadKey(); wdh = eingabe_wdh.KeyChar == 'j'; |
|
Hi ich habe ein ähnliches Problem...git es auch noch eine einfacher methode als mit diesem ReadKey?
Aus C/C++ kenne ich fflush...aber das scheint es ja hier nicht zu geben oder?
Programmcode:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| do { Console.Write("Bitte gebe an, was in die Datei geschrieben werden soll:"); sw.Write(Console.ReadLine()); Console.Write("Wollen Sie noch eine Zeile schreiben? :-D (weiter mit \"j\""); ab = Convert.ToChar(Console.Read()); }while(ab =='j'); |
mfg sheepy
Kha - Do 21.06.07 13:28
Was genau findest du denn an ReadKey zu kompliziert? Ist doch genauso einfach und kurz zu benutzen wie Read/ReadLine.
sheepy - Do 21.06.07 15:36
mhn wie genau müsste es denn dann heißen?
Ich sollte vlt. auch noch erwähnen, dass ich C# unter Linux programmiere...vlt. gibt es dort diesen Befehl nicht...
Kha - Do 21.06.07 16:06
sheepy hat folgendes geschrieben: |
mhn wie genau müsste es denn dann heißen? |
C#-Quelltext
1:
| while (Console.ReadKey().KeyChar =='j'); |
sheepy hat folgendes geschrieben: |
Ich sollte vlt. auch noch erwähnen, dass ich C# unter Linux programmiere...vlt. gibt es dort diesen Befehl nicht... |
Im aktuellen Mono ist er vorhanden.
sheepy - Do 21.06.07 17:02
besten Dank :-)
werde es später mal Ausprobieren :-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!