2. Práce s konzolou

V předchozích případech jsme poměrně bohatě využívali výstup na konzolu. Třída Console obsahuje množství statických metod, které umožňují vytvářet konzolové aplikace. Ve Windows Forms aplikaci jsou ovšem tyto metody ignorovány.

Vstup je získán ze standardního proudového vstupu (System.IO.TextReader) , výstup se posílá na standardní proudový výstup (System.IO.TextWriter) a chybový výstup se posílá na standardní chybový výstupní proud. Tyto proudy lze změnit pomocí metod konzoly SetIn(), SetOut(), SetError(). Existují tu statické vlastnosti zjištující současné proudy: Console.Out, Console.In, Console.Error. Ty obsahují pouze funkci get, tedy nedají se přímo měnit.

Nejdůležitější pro nás ale budou metody přímo pracující s konzolou, tedy čtení a zápis na standardní datový proud.

2.1. Funkce Write, WriteLine

Console.Write(), Console.WriteLine() slouží pro zápis hodnot. Console.WriteLine() kromě toho, že stejně jako Console.Write() vypíše jakýkoliv standardní datový typ, navíc vloží na konec řádku znak nového řádku \n.

Způsob použití funkcí Write a WriteLine může těmato způsoby. Můžeme pracovat s celým argumentem jako s jedním řetězcem. To znamená, že skládáme vše, co se objeví na obrazovce, do jednoho řetězce.

[ukázka kódu]
int i=3; 
Console.WriteLine("Moje cislo "+i+ "neni zrovna stastne.");

Nebo lze využít zápis ve tvaru

[ukázka kódu]
int i=3; 
Console.WriteLine("Moje cislo {0} neni zrovna stastne.", i);

Kde výraz ve složené závorce odpovídá pořadovému číslu parametru, který vložíme za zobrazovaným řetězcem. Tato možnost umožňuje různý způsob formátování parametru.

2.1.1. Formátovací znaky

Tabulka 5.1. Formátovací znaky pro čísla

Formátovací znakVýznam
C, cměna
D, ddesítkový zápis
E, eexponenciální zápis
F, fzápis s pevnou desetinnou čárkou
G, gobecný zápis
N, nčíslo
X, xhexadecimální zápis

Uvedeme si příklad formátování čísla typu decimal na tři desetinná místa. Pokud ve formátovacím řetězci neuvedeme za znakem pro zobrazovaný typ nic, u typu decimal by se standardně zobrazila dvě desetinná místa.

[ukázka kódu]
decimal d = 12860m; 
Console.WriteLine("{0:c3}", d);

Můžeme si ale také definovat vlastní formátovací masku.

[ukázka kódu]
double d = 4543.909; 
Console.WriteLine("{0:00000.##}", d);

V tomto příkladu nuly za dvojtečkou ukazují, kolik se musí zobrazit míst před desetinnou čárkou, znak # za desetinnou čárkou, kolik se jich má zobrazit maximálně (tedy nemusí žádné, pokud by číslo d obsahovalo hodnotu 4543).

Kromě čísel ovšem můžeme při výpisu formátovat i datum.

Pro lepší názornost si ukážeme, jak se vypíše tato hodnota struktury DateTime: 10.9.2004 15:34:20.250 v českém prostředí, tzn. používají se tečky jako oddělovače dnů a měsíců.

Tabulka 5.2. Formátovací znaky pro datum

Formátovací znakFormátovací vzorVýsledek
ddd.MM.rrrr10.9.2004
Ddd. MMMM.rrr10. září 2004
fdd. MMMM.rrrr HH:mm10. září 2004 15:34
Fdd. MMMM.rrrr HH:mm:ss10. září 2004 15:34:20
gdd.MM.rrrr HH:mm10.9.2004 15:34
Gdd.MM.rrrr HH:mm:ss10.9.2004 15:34:20
m, Mdd MMMM10 září
r, Rddd, dd MMM rrrr HH':'mm':'ss 'GMT'Fri, 10 Sep 2004 15:34:20 GMT (RFC 1123)
srrrr-MM-ddTHH:mm:ss2004-09-10T15:34:20 (ISO 8601)
tHH:mm15:34
THH:mm:ss15:34:20
urrrr-MM-dd HH:mm:ssZ2004-09-10 15:34:20Z
Udd. MMMM rrrr HH:mm:ss9. září 2004 15:34:20
y, YMMMM rrrrzáří 2004

Tabulka 5.3. Uživatelské formátování data a času

VzorVýznam
ddden měsíce jako číslo, pokud je menší než 10, pak s úvodní 0 (10)
dddden měsíce jako zkratka (pá)
ddddnázev dne v měsíci (pátek)
MMměsíc jako číslo, pokud je menší než 10, pak s úvodní 0 (09)
MMMčíslo měsíce v římských číslicích (IX)
MMMMnázev měsíce (září)
yyposlední dvě číslice roku (04)
yyyyvšechny čtyři číslice roku (2004)

2.1.2. Speciální znak @

Při výpisu na konzolu lze použít před řetězec, který chceme vytisknout, speciální znak @. Ten překladači říká, aby řetězec bral až do té doby, dokud nenarazí na ukončení řetězce, tedy koncových uvozovek. V takto uvozeném řetězci navíc můžeme uvést znaky běžně nutně uvozované zpětným lomítkem (\), aby byly zobrazeny (například ono samotné lomítko). To umožňuje rozepsat řetězec na více řádků a používat při tom běžně klávesy enter a tyto "problémové" znaky. Řetězec je pro uživatele v programu lépe čitelný.

[ukázka kódu]
using System;
...
Console.WriteLine(@"Tento řetězec se
na obrazovce objeví tak, jak se v programu
zadá.

Navíc může obsahovat i zpětná lomítka, tedy tato: \");
...

Tento znak se ale dá použít i před název proměnné. To způsobí, že překladač bere jakýkoliv text, třeba i klíčové slovo, vyskytující se za tímto znakem, jako identifikátor.

[ukázka kódu]
int @if = -1; // lze v C# pouzit 
int if = -1; // nelze

Takovýmito zápisy ale dochází k nepřehlednosti kódu, proto tento postup není doporučován.

2.2. Funkce Read, ReadLine

Console.Read() vrací jeden znak z konzoly, Console.ReadLine() celý řetězec ukončený znakem konce řádku. Pokud chceme z konzoly načíst číslo určitého typu, je zapotřebí provést konverzi vstupu na daný typ:

[ukázka kódu]
double d;
try {
   d = System.Convert.ToDouble(Console.Readline());
   Console.WriteLine("Nactene cislo: "+d);
} catch (FormatException e) { 
  Console.WriteLine(e.Message); 
}