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[13];
datensatz_neu[00] = eingabe_vname;
datensatz_neu[01] = eingabe_name;
datensatz_neu[02] = 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

user profile iconJü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

user profile iconsheepy hat folgendes geschrieben:
mhn wie genau müsste es denn dann heißen?


C#-Quelltext
1:
while (Console.ReadKey().KeyChar =='j');                    

user profile iconsheepy 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 :-)