Autor Beitrag
Spot
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 08.06.07 14:18 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 11.06.07 07:46 
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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:
ausblenden 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
Spot Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 21.06.07 12:37 
user profile iconJüTho hat folgendes geschrieben:

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 21.06.07 16:06 
user profile iconsheepy hat folgendes geschrieben:
mhn wie genau müsste es denn dann heißen?

ausblenden 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
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 21.06.07 17:02 
besten Dank :-)
werde es später mal Ausprobieren :-)