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.
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.
int i=3; Console.WriteLine("Moje cislo "+i+ "neni zrovna stastne."); |
Nebo lze využít zápis ve tvaru
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.
Tabulka 5.1. Formátovací znaky pro čísla
Formátovací znak | Význam |
---|---|
C, c | měna |
D, d | desítkový zápis |
E, e | exponenciální zápis |
F, f | zápis s pevnou desetinnou čárkou |
G, g | obecný zápis |
N, n | číslo |
X, x | hexadecimá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.
decimal d = 12860m; Console.WriteLine("{0:c3}", d); |
Můžeme si ale také definovat vlastní formátovací masku.
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í znak | Formátovací vzor | Výsledek |
---|---|---|
d | dd.MM.rrrr | 10.9.2004 |
D | dd. MMMM.rrr | 10. září 2004 |
f | dd. MMMM.rrrr HH:mm | 10. září 2004 15:34 |
F | dd. MMMM.rrrr HH:mm:ss | 10. září 2004 15:34:20 |
g | dd.MM.rrrr HH:mm | 10.9.2004 15:34 |
G | dd.MM.rrrr HH:mm:ss | 10.9.2004 15:34:20 |
m, M | dd MMMM | 10 září |
r, R | ddd, dd MMM rrrr HH':'mm':'ss 'GMT' | Fri, 10 Sep 2004 15:34:20 GMT (RFC 1123) |
s | rrrr-MM-ddTHH:mm:ss | 2004-09-10T15:34:20 (ISO 8601) |
t | HH:mm | 15:34 |
T | HH:mm:ss | 15:34:20 |
u | rrrr-MM-dd HH:mm:ssZ | 2004-09-10 15:34:20Z |
U | dd. MMMM rrrr HH:mm:ss | 9. září 2004 15:34:20 |
y, Y | MMMM rrrr | září 2004 |
Tabulka 5.3. Uživatelské formátování data a času
Vzor | Význam |
---|---|
dd | den měsíce jako číslo, pokud je menší než 10, pak s úvodní 0 (10) |
ddd | den měsíce jako zkratka (pá) |
dddd | název dne v měsíci (pátek) |
MM | mě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) |
MMMM | název měsíce (září) |
yy | poslední dvě číslice roku (04) |
yyyy | všechny čtyři číslice roku (2004) |
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ý.
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.
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.
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:
double d; try { d = System.Convert.ToDouble(Console.Readline()); Console.WriteLine("Nactene cislo: "+d); } catch (FormatException e) { Console.WriteLine(e.Message); } |