2.6 Ein- und Ausgabemethoden der Klasse »Console« 

In Konsolenanwendungen sind wir auf textuelle Ein- und Ausgaben beschränkt, die mit den Funktionen Write, WriteLine, Read und ReadLine der Klasse Console ausgeführt werden.
Hinweis |
Die Dezimal- und Tausendertrennzeichen der Ein- und Ausgabe hängen von den Ländereinstellungen ab und sind in der Klasse System.Globalization.NumberFormatInfo gepeichert. |
2.6.1 Ausgabe mit Write und WriteLine 

Der Unterschied der beiden Ausgabefunktionen ist, dass WriteLine einen Zeilenvorschub an die Ausgabe anhängt. Das folgende Codefragment erzeugt zwei identische Ausgabezeilen. Die beiden ersten Schreibbefehle erzeugen eine einzelne Zeile, weil hinter dem ersten Write kein Zeilenvorschub erzeugt wird. Die letzte Zeile simuliert das Verhalten von WriteLine mithilfe von Write. Alternativen zum Zeilenvorschub befinden sich in der Klasse ControlChars (Cr, Lf, CrLf).
' ...\Sprachsyntax\EinUndAusgabe\EinUndAusgabe.vb |
Option Strict On
Namespace Sprachsyntax
Module EinUndAusgabe
...
Sub Write()
Console.Write("A")
Console.WriteLine(" und O")
Console.Write("A und O" & Environment.NewLine)
Console.ReadLine()
End Sub
End Module
End Namespace
Die Parameter der Ausgaberoutinen lassen sich in zwei Gruppen unterteilen:
- Kontrollstring: erstes Argument als Text mit {}-Platzhaltern für Daten
- Daten: alle weiteren Argumente, die in die Platzhalter eingefügt werden
Die Position der Daten in der Ausgabe ist durch die Position der {}-Platzhalter fixiert. Welches Datum in welcher Formatierung ein Platzhalter repräsentiert, wird durch den Inhalt der geschweiften Klammern bestimmt, wobei die beiden letzten Parameter einzeln oder zusammen wegfallen dürfen.
{Argumentnummer , Ausgabebreite : Format} |
Die Zählung für Daten beginnt bei null, also ist {0} das erste Datum und {4} das fünfte. {}-Platzhalter dürfen beliebig oft im Kontrollstring wiederholt werden. Die Breite gibt die Mindest-Gesamtbreite an, inklusive aller zusätzlichen Zeichen wie zum Beispiel Minus oder E. Die Ausgabe
1234567890
123456789012345
–3.178E+15
des folgenden Codefragments zeigt dies;
' ...\Sprachsyntax\EinUndAusgabe\EinUndAusgabe.vb |
Option Strict On
Namespace Sprachsyntax
Module EinUndAusgabe
...
Sub Mindestbreite()
Console.WriteLine("{0,12}", 1234567890)
Console.WriteLine("{0,12}", 123456789012345)
Console.WriteLine("{0,12}", –3.178 * 10 ^ 15)
Console.ReadLine()
End Sub
End Module
End Namespace
Tabelle 2.6 zeigt die erlaubten Formatangaben. Allen Formaten kann eine Zahl angehängt werden. Bei ganzzahligen Formaten gibt sie die Mindeststellenzahl an, während sie sonst die Nachkommastellen spezifiziert. Das Format R ignoriert die Zahl.
Formatangabe | Beschreibung |
C |
lokales Währungsformat |
D |
dezimaler Integer (nur ganze Zahlen) |
E |
wissenschaftliches Format (Exponentialschreibweise) |
F |
Festpunktformat |
G |
das »kompaktere« Format der Formate E und F |
N |
Festpunktformat einschließlich Tausenderseparatoren |
P |
Prozentzahl |
R |
Anzeigegarantie für alle Stellen (nur Single und Double) |
X |
Hexadezimalnotation (nur ganze Zahlen) |
Das folgende Codefragment zeigt die Formate in Aktion. Bemerkenswert ist die Ausgabe des R-Formats. Es zeigt eine andere Zahl, als wir angegeben haben. Dies liegt daran, dass die Zahl sich nicht exakt in einem Single darstellen lässt und daher die nächstliegende darstellbare Zahl genommen wird. Noch erstaunlicher ist der Vergleich der Formate R und F5. Obwohl F5 genügend Stellen haben sollte, um die Zahl exakt so auszugeben, wie sie gespeichert ist, liefert sie Nullen anstatt der im R-Format korrekt gezeigten Ziffern.
' ...\Sprachsyntax\EinUndAusgabe\EinUndAusgabe.vb |
Option Strict On
Namespace Sprachsyntax
Module EinUndAusgabe
...
Sub Standard()
Dim z As Single = 2340.0002
Dim x As Integer = 2340
Console.WriteLine("C {0:C}", z) 'C $2,340.00
Console.WriteLine("D {0:D}", x) 'D 2340
Console.WriteLine("E {0:E}", z) 'E 2.340000E+003
Console.WriteLine("F {0:F}", z) 'F 2340.00
Console.WriteLine("N {0:N}", z) 'N 2,340.00
Console.WriteLine("P {0:P}", z) 'P 234,000.00%
Console.WriteLine("R {0:R}", z) 'R 2340.00024
Console.WriteLine("X {0:X}", x) 'X 924
Console.WriteLine("F5 {0:F5}", z) 'F5 2340.00000
Console.WriteLine("D5 {0:D5}", x) 'D5 02340
Console.ReadLine()
End Sub
End Module
End Namespace
Neben den Standardformaten kann man auch explizit bestimmen, wie Ziffern von Zahlen dargestellt werden. Statt des Kontrollstrings wird ToString aufgerufen. Das folgende Beispiel formatiert die Zahl mit mindestens 2 Stellen vor und 3 Stellen nach dem Komma.
wert.ToString("##.###")
Tabelle 2.7 fasst die wichtigsten Formatangaben dieser Art zusammen.
Formatangabe | Beschreibung |
# |
Nur signifikante Stellen werden ausgegeben. |
0 |
Nichtsignifikante Stellen erhalten eine 0. |
. |
Position des Dezimaltrennzeichens |
, |
1) zwischen # bzw. 0: einfügen von Tausendertrennzeichen 2) vor Dezimaltrennzeichen: je eine Division durch 1000 |
E0 oder e0 |
wissenschaftliche Darstellung mit Zehnerpotenzen |
E+0 oder e+0 |
dito, aber immer mit Vorzeichen im Exponenten |
Am einfachsten ist dies an Beispielen nachzuvollziehen. Am Zeilenende ist jeweils als Kommentar die Ausgabe angegeben. Man sieht, dass die geforderten Stellen vor dem Komma eine Mindestangabe sind. Ist die Zahl größer, werden halt mehr Stellen als gefragt ausgegeben, wie in den beiden ersten Fällen zu sehen ist. Vergleiche von 3 und 4, 5 und 8, 6 und 9 sowie 7 und a zeigen, wie die 0 statt des # eine Ausgabe auch nichtsignifikanter Stellen erzwingt. Die vorletzte Ausgabe zeigt die Verwendung eines Tausendertrennzeichens und die letzte eine Skalierung um den Faktor eine Million (zwei Kommata vor dem Dezimaltrennzeichen).
' ...\Sprachsyntax\EinUndAusgabe\EinUndAusgabe.vb |
Option Strict On
Namespace Sprachsyntax
Module EinUndAusgabe
...
Sub Custom()
Dim z As Double = 2340.704
Console.WriteLine(z.ToString("1 ##")) '1 2341
Console.WriteLine(z.ToString("2 00")) '2 2341
Console.WriteLine(z.ToString("3 ######")) '3 2341
Console.WriteLine(z.ToString("4 000000")) '4 002341
Console.WriteLine(z.ToString("5 #.##")) '5 2340.7
Console.WriteLine(z.ToString("6 #.###")) '6 2340.704
Console.WriteLine(z.ToString("7 #.####")) '7 2340.704
Console.WriteLine(z.ToString("8 0.00")) '8 2340.70
Console.WriteLine(z.ToString("9 0.000")) '9 2340.704
Console.WriteLine(z.ToString("a 0.0000")) 'a 2340.7040
Console.WriteLine(z.ToString("b 0,0.00")) 'b 2,340.70
Console.WriteLine(z.ToString("c 0,,.000"))'c 0.002
Console.ReadLine()
End Sub
End Module
End Namespace
Hinweis |
Wenn sichergestellt werden muss, dass alle Ziffern einer Fließkommazahl angezeigt werden, so muss das R-Format benutzt werden. |
Hinweis |
Doppelte geschweifte Klammern, {{ und }}, in Kombination mit Datenplatzhaltern {…} erscheinen in der Ausgabe als einfache Klammern und steuern nicht die Formatierung. |
2.6.2 Einlesen mit Read und ReadLine 

Die Methode ReadLine liest eine ganze Zeile Text mit abschließendem
oder
von der Tastatur und gibt den gelesenen Text zurück. Der Zeilenvorschub am Ende der Zeile ist nicht Teil des Textes. Liest man also mit
Dim zeile As String = Console.ReadLine()
den Text
"zwei Wörter"
so enthält zeile nur den Teil »zwei Wörter«. Demgegenüber liest Read ein einzelnes Zeichen und gibt den Code des Zeichens als ganze Zahl zurück. Das folgende Codefragment zeigt, wie ein Zeichen eingelesen und ausgegeben wird. Die Funktion ChrW konvertiert den Zeichencode in einen Buchstaben.
Dim ein As Integer = Console.Read()
Console.WriteLine("Code {0} = {1}", ein, ChrW(ein))
Dass Read immer ein Zeichen liest, gilt für alle Zeichen, den Zeilenvorschub inbegriffen. Die folgende Funktion kann verwendet werden, um dies zu verifizieren. Das zweite ReadLine ist am Prozedurende eingefügt, da Read so lange blockiert, bis ein Zeilenvorschub eingegeben wurde. Dieser wird gegebenenfalls vom ersten ReadLine konsumiert, das zweite hält die Konsole offen.
' ...\Sprachsyntax\EinUndAusgabe\EinUndAusgabe.vb |
Option Strict On
Namespace Sprachsyntax
Module EinUndAusgabe
...
Sub Read()
Console.Write("Bitte 1 Zeile mit Zeilenvorschub: ")
Dim zeile As String = Console.ReadLine()
Console.WriteLine("Eingegebene Zeile: {0}", zeile)
Console.Write("Bitte 2 Zeichen oder Zeilenvorschub: ")
Dim ein As Integer
ein = Console.Read()
Console.WriteLine("Code {0} = {1}", ein, ChrW(ein))
ein = Console.Read() 'gebraucht nach Return/Enter
Console.WriteLine("Code {0} = {1}", ein, ChrW(ein))
Console.ReadLine()
Console.ReadLine()
End Sub
End Module
End Namespace
Gibt man erst "zwei Wörter"
und dann einen weiteren Zeilenvorschub ein, ergibt sich die Ausgabe aus Abbildung 2.38. Sie zeigt, dass unter Windows der Zeilenvorschub aus zwei Zeichen mit den Codes 13 und 10 besteht und dass jedes der beiden obigen Read-Kommandos je eines dieser Zeichen liest. Die Position des Cursors in der Abbildung zeigt, dass jeder WriteLine-Befehl für die Codes 10 und 13 jeweils einen Zeilenvorschub in der Ausgabe generiert hat.
Abbildung 2.38 Read liest immer ein Zeichen.
Das Problem bei Read ist, dass es, obwohl es nur ein Zeichen liest, so lange blockiert, bis ein Zeilenvorschub eingegeben wurde. Beim Einlesen von der Tastatur sollte man also entweder bei ReadLine bleiben oder ReadKey zum Einlesen einzelner Zeichen verwenden. Das folgende Codefragment zeigt, dass die Eingabecodierung angegeben werden sollte, um die Umlaute richtig einzulesen.
' ...\Sprachsyntax\EinUndAusgabe\EinUndAusgabe.vb |
Option Strict On
Namespace Sprachsyntax
Module EinUndAusgabe
...
Sub ReadKey()
Console.InputEncoding = Text.Encoding.GetEncoding(1252)
Dim ein As Char
Console.WriteLine("Bitte Zeichen eingeben: ")
ein = Console.ReadKey().KeyChar()
Console.WriteLine("{1} (Code {0})", AscW(ein), ein)
Console.ReadLine()
End Sub
End Module
End Namespace
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.