Lekce 5 - Textový výstup a speciální znaky v C# Konzoli
V předchozí lekci, Textový výstup a složené formátování v C# Konzoli, jsme si ukázali, jak ovládat textový
výstup svých aplikací do okna konzole pomocí metody Write() s
použitím složeného formátování.
V dnešním C# tutoriálu si ukážeme metodu WriteLine()
třídy Console, která nám umožňuje provádět výpis textu do
okna konzole. Zároveň věnujeme prostor představení speciálních
znaků a escapování.
Metoda WriteLine() je prakticky stejná jako metoda
Write(), pouze s jedním podstatným rozdílem. U metody
WriteLine() se na konci standardně vypisují nám už dobře
známé dva znaky: ASCII 13 (Carriage return) pro návrat
na začátek řádku a ASCII 10 (Line feed) pro
odřádkování. To způsobí, že při použití metody
WriteLine()každý nový výpis začne na začátku nového
řádku.
Pokud bychom metodě Write() zadali k vypsání tyto dva znaky,
pak dosáhneme stejného výsledku jako metodou WriteLine().
Můžeme to udělat dvěma způsoby, a to buď zadáním přetypovaných
ASCII hodnot znaků, nebo použitím speciálních
znaků.
Ukažme si syntaxi zápisu, kdy tři různé zápisy příkazového řádku nám dají totožný výsledek:
{CSHARP_CONSOLE}
Console.WriteLine("1. Použití metody WriteLine().");
Console.Write("2. Použití přetypování ASCII znaků."+(char)13+(char)10);
Console.Write("3. Použití speciálních znaků.\r\n");
Console.Write("Ve všech třech případech došlo k výpisu na začátku nového řádku.");
{/CSHARP_CONSOLE}
Výstup:
Konzolová aplikace
1. Použití metody WriteLine().
2. Použití přetypování ASCII znaků.
3. Použití speciálních znaků.
Ve všech třech případech došlo k výpisu na začátku nového řádku.
Zde vidíme, že po každém výpisu došlo k návratu na začátek řádku a k odřádkování.
Speciální znaky
Speciální znaky jsme již nakousli, pojďme si je probrat důkladněji. Co
jsou to speciální znaky? Jsou to znaky, které nám umožňují
ovládat výpis. Používají se ve vypisovaných řetězcích
a vždy je uvádí zpětné lomítko \. Za lomítkem pak píšeme
znak, který má požadovanou speciální funkci.
Zpětné lomítko \ můžeme napsat pomocí
kombinace kláves Pravý Alt+Q
Pojďme si speciální znaky ukázat:
\nVýpis textu na novém řádku.\rNávrat kurzoru na začátek vypisovaného řádku.\tVýpis mezery tabulátoru. Funguje stejně, jako když při psaní na klávesnici stiskneme tabulátor Tab.\"Výpis uvozovek v textu. Pokud bychom před uvozovkami nepoužili zpětné lomítko, systém by uvozovky považoval za začátek, či konec vypisovaného řetězce.\\Výpis samotného zpětného lomítka. Používáme ho např. při zápisu cesty k určitému souboru.
Výpis zpětného lomítka
Jelikož například v zápisu cesty k určitému souboru bývá zpětných lomítek více, existuje možnost označený řetězec vypsat bez interpretace zpětných lomítek do řídících znaků.
To uděláme tak, že před vypisovaným řetězcem uvedeme @.
Tento způsob nazýváme escapování a systém poté celý
řetězec interpretuje doslovně, tedy jako znaky k
výpisu.
Pojďme se podívat na příklad, jak můžeme pomocí \\ a
@ provést výpis cesty k souboru:
{CSHARP_CONSOLE}
Console.WriteLine("Cesta k souboru C:\\Dokumenty\\Ruzne\\Foto1.jpg");
Console.WriteLine(@"Cesta k souboru C:\Dokumenty\Ruzne\Foto1.jpg");
{/CSHARP_CONSOLE}
Výsledek obou zápisů bude totožný:
Konzolová aplikace
Cesta k souboru C:\Dokumenty\Ruzne\Foto1.jpg
Cesta k souboru C:\Dokumenty\Ruzne\Foto1.jpg
Výpis znaků Unicode
Posledním speciálním znakem, který si představíme, bude
\u0000. Tímto speciálním znakem vypisujeme znaky
Unicode, kde místo 0000 píšeme číslo
požadovaného znaku. Pamatujme, že kódové označení požadovaného
znaku zadáváme jako číslo v šestnáctkové soustavě.
Jak číslo požadovaného znaku zjistit? Požadované znaky a jejich
kódové označení můžeme snadno vyhledat v aplikaci Mapa
znaků ve Windows. Mapu znaků vyvoláme z nabídky Start
zadáním klíčových slov Mapa znaků. Objeví se nám tato
tabulka:

Klikneme-li ukazatelem myši na nějaký znak, nejen se zvýrazní, ale dole
se nám ještě objeví jeho Unicode číslo. Na obrázku je
vidět zvýrazněné písmeno W a jeho Unicode číslo v
šestnáctkové soustavě 0057. Pokud bychom chtěli tento znak
vypsat, zadali bychom: \u0057. Stejně tak můžeme W
vypsat jako ASCII znak po přetypování (char)87.
Číslo 57 v šestnáctkové soustavě je
87 v desítkové soustavě.
Použití Unicode kódování má oproti ASCII obrovskou výhodu v
množství použitelných znaků, které je mnohem větší.
Unicode znak můžeme také vypsat pomocí jeho čísla v šestnáctkové
soustavě, které převedeme na znak příkazem
Convert.ToChar(0x0000).
Místo 0000 zadáme Unicode číslo, které pro
určitý znak zjistíme z Mapy znaků.
V příkladu si tyto možnosti ukážeme pro znak W:
Console.WriteLine("Zadání znaku pomocí speciálního znaku \\u0057: \tZnak = \u0057"); Console.WriteLine("Zadání znaku jako šestnáctkové číslo 0x0057: \tZnak = " + Convert.ToChar(0x0057)); Console.WriteLine("Zadání znaku jako číslo ASCII kódu (char)87: \tZnak = " + (char)87);
Výstup:
Konzolová aplikace
Zadání znaku pomocí speciálního znaku \u0057: Znak = W
Zadání znaku jako šestnáctkové číslo 0x0057: Znak = W
Zadání znaku jako číslo ASCII kódu (char)87: Znak = W
Všimněme si použití speciálního znaku tabulátoru
\t, který nám znaky hezky zarovná.
Vykreslení rámečku
Ukažme si, jak vypsat znaky, které lze použít k nakreslení dvojitého
rámečku. Když se podíváme na mapu znaků, tak zjistíme, že tyto znaky se
nacházejí od adresy 0x2550 do 0x256C. Až budeme v
dalších kapitolách probírat možnosti grafiky, budou se nám tyto znaky
hodit.
Nejdříve si zadáme počáteční a koncovou adresu požadovaného výpisu a z těchto hodnot vypočteme počet znaků:
ushort pocatek = 0x2550; ushort konec = 0x256C; int pocetZnaku = konec - pocatek;
Pak připravíme cyklus pro výpis vypočteného počtu znaků:
for (int i = 0; i <= pocetZnaku; i++) { }
Další příkazy píšeme dovnitř cyklu. Znaky budeme vypisovat po osmi na řádku, a pak provedeme vždy odřádkování:
if (i % 8 == 0) Console.WriteLine();
Poté vypíšeme adresu znaku pomocí složeného formátování se
specifikátorem formátu X. Vedle adresy si zobrazíme
příslušný znak tak, že vypočtenou adresu převedeme na
znak:
Console.Write("{0,-4:X} ", pocatek + i); Console.Write("{0,-4}", Convert.ToChar(pocatek + i));
Kompletní kód vypadá takto:
{CSHARP_CONSOLE}
ushort pocatek = 0x2550;
ushort konec = 0x256C;
int pocetZnaku = konec - pocatek;
for (int i = 0; i <= pocetZnaku; i++)
{
if (i % 8 == 0) // Budeme vypisovat znaky po osmi na řádku
Console.WriteLine(); // Odřádkování
Console.Write("{0,-4:X} ", pocatek + i);
Console.Write("{0,-4}", Convert.ToChar(pocatek + i));
}
{/CSHARP_CONSOLE}
Vypíší se nám znaky včetně jejich adres:
Konzolová aplikace
2550 ═ 2551 ║ 2552 ╒ 2553 ╓ 2554 ╔ 2555 ╕ 2556 ╖ 2557 ╗
2558 ╘ 2559 ╙ 255A ╚ 255B ╛ 255C ╜ 255D ╝ 255E ╞ 255F ╟
2560 ╠ 2561 ╡ 2562 ╢ 2563 ╣ 2564 ╤ 2565 ╥ 2566 ╦ 2567 ╧
2568 ╨ 2569 ╩ 256A ╪ 256B ╫ 256C ╬
V případě, že by se na adrese žádný znak nenacházel, vypsal by se otazník.
V další lekci, Grafický výstup v C# Konzoli - Parametry okna Konzole , si ukážeme, jak se dají zjistit a nastavit parametry, které určují grafickou podobu okna konzole.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 8x (146.05 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

