Java týden Body zdarma
Využij podzimních slev a získej od nás až 40 % bodů zdarma! Více zde
Pouze tento týden sleva až 80 % na Java e-learning!

Lekce 3 - Práce s textovými soubory v C#

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Úvod do práce se soubory, jsme si ukázali, jak fungují přístupová práva v systémech Windows. Nejjednodušší cestou, jak uložit data aplikace na pevný disk, je využít textové soubory. Se soubory s příponou .txt jste se jistě všichni již setkali. Text je v nich uložen jednoduše na jednotlivých řádcích. K oddělení řádků se využívá speciálních znaků, které jsou bohužel specifické pro každý operační systém. Toto však za nás naštěstí vyřeší C#.

Pozn.: V různých materiálech se můžete setkat s použitím různých tříd a různých způsobů k zápisu do souborů. .NET framework se v čase vyvíjel a pro některé funkčnosti poskytuje kvůli kompatibilitě i starší nebo komplikovanější konstrukce. Budu se zde snažit ukazovat způsoby, které jsou nejjednodušší a nejnovější.

Zápis textu do nového souboru

Nejprve si pojďme vytvořit nový textový soubor a něco do něj zapsat. Vytvořte si nový projekt (konzolovou aplikaci) s názvem TextoveSoubory. K zapisování do textových souborů nám .NET poskytuje třídu StreamWriter.

Ve zdrojovém kódu si nejprve do using přidejme System.IO. Nyní vytvořme blok using a založme v něm novou instanci StreamWriter. Jak již víme z předchozích lekcí, using se nám automaticky postará o zavření souboru po dokončení zápisu/čtení. Do konstruktoru napíšeme cestu k našemu souboru.

using (StreamWriter sw = new StreamWriter(@"soubor.txt"))
{
}

Náš StreamWriter je nyní nasměrovaný na správný soubor. Nový řádek zapíšeme pomocí metody WriteLine(). Po dokončení zápisu musíme zavolat metodu Flush(), která se stará o vyprázdnění bufferu. S tím se zde nebudeme zatěžovat, postačí nám vědět, že námi zapsané řádky mohou zůstat chvíli ve vyrovnávací paměti a my pomocí Flush() vynutíme jejich zápis.

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Kód se nám tedy rozrostl a může vypadat např. takto:

using (StreamWriter sw = new StreamWriter(@"soubor.txt"))
{
    sw.WriteLine("První řádek");
    sw.WriteLine("Tento text je na druhém řádku");
    sw.WriteLine("A do třetice.");
    sw.Flush();
}

Po spuštění se vytvoří soubor.txt ve složce s naším projektem, přesněji v bin/debug/. Jak se správně v C# vypořádat s cestou k souboru a právy jsme si již ukazovali a zde to pro jednoduchost zanedbáme. Vidíme, že soubor existuje a opravdu obsahuje náš text:

Zápis textových souborů v C# .NET

Připsání textu do existujícího souboru

Pokud soubor neexistuje, kód výše ho vytvoří. Pokud existuje, bude přepsán. Toto chování můžeme změnit pomocí 2. parametru konstruktoru objektu StreamWriter. Pokud ho nastavíme na true, provede se tzv. append (připsání). Takto do existujícího souboru připíšeme nový řádek:

using (StreamWriter sw = new StreamWriter(@"soubor.txt", true))
{
    sw.WriteLine("Připsaný řádek");
    sw.Flush();
}

Dalším parametrem může být nastavení kódování, ale výchozí UTF-8 by nám mělo ve většině případů vyhovovat.

Čtení existujícího souboru

Zbývá nám již jen umět soubor načíst. Není to o nic složitější, než zápis a opět k tomu máme v .NET frameworku připravenou třídu, konkrétně StreamReader. Použití je obdobné, namísto metody WriteLine() použijeme ReadLine(), která vrací řádek textu ze souboru a zároveň se přesune na řádek následující. Budeme ji tedy volat ve while cyklu. Podmínka pro ošetření vyjetí ze souboru je možná krkolomnější, kontrolujeme, zda proběhlo přiřazení nové řádky do proměnné.

Kód k výpisu obsahu souboru do konzole by vypadal takto:

using (StreamReader sr = new StreamReader(@"soubor.txt"))
{
    string s;
    while ((s = sr.ReadLine()) != null)
    {
        Console.WriteLine(s);
    }
}

Kód celého našeho programu vypadá nyní asi takto:

// zápis do souboru
using (StreamWriter sw = new StreamWriter(@"soubor.txt"))
{
    sw.WriteLine("První řádek");
    sw.WriteLine("Tento text je na druhém řádku");
    sw.WriteLine("A do třetice.");
    sw.Flush();
}
Console.WriteLine("Do souboru bylo zapsáno.");

// připsání textu do existujícího souboru
using (StreamWriter sw = new StreamWriter(@"soubor.txt", true))
{
    sw.WriteLine("Připsaný řádek");
    sw.Flush();
}
Console.WriteLine("Do souboru bylo připsáno.");

// výpis obsahu souboru
Console.WriteLine("Vypisuji soubor:");

using (StreamReader sr = new StreamReader(@"soubor.txt"))
{
    string s;
    while ((s = sr.ReadLine()) != null)
    {
        Console.WriteLine(s);
    }
}
Console.ReadKey();

A výsledek:

Zápis a čtení textových souborů v C# .NET

Třída File

.NET framework v sobě obsahuje statickou třídu File s předpřipravenými metodami, které práci se StreamReaderem/StreamWriterem sice plně nenahradí, ale ve velkém množství případů si s nimi vystačíme. Poslední příklad vypisující všechny řádky ze souboru by se dal zapsat takto (nezapomeňte na using System.IO):

string[] radky = File.ReadAllLines(@"soubor.txt");
foreach (string radka in radky)
{
    Console.WriteLine(radka);
}

Metoda ReadAllLines() nám vrátí všechny řádky textového souboru v poli stringů. Pokud se nejedná o nějaký velký soubor, je tato metoda mnohem jednodušší na použití. Na třídě File naleznete i další podobné metody jako WriteAllLines(poleStringu, cestaKSouboru) nebo AppendAllLines(poleStringu, cestaKSouboru). První zmíněná zapíše do souboru řádky z pole stringů, druhá připíše k existujícímu souboru řádky z pole stringů. Třída obsahuje také ekvivalenty metod, které nepracují s řádkami, ale souvislým textem. Jsou to WriteAllText(text), ReadAllText() a AppendAllText(text).

V článku jsme opomenuli odchytávání výjimek a kontrolu práv. Do souborů také budeme chtít většinou ukládat spíše objekty, než řádky textu. To vše si ukážeme v příští lekci, Uložení objektů do CSV v C#.


 

Stáhnout

Staženo 1104x (24.76 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
19 hlasů
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor sítě se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Předchozí článek
Úvod do práce se soubory
Všechny články v sekci
Práce se soubory v C#
Miniatura
Následující článek
Uložení objektů do CSV v C#
Aktivity (5)

 

 

Komentáře

Avatar
relycanx
Člen
Avatar
relycanx:29.3.2013 9:52

Chtěl bych se zeptat, jestli mohu pro ukládání a načítání použít i tento způsob. Jestli není třeba v něčem horší.

//ukládání (za pomocí přidané knihovny System.IO)

TextWriter tw = new StreamWriter("tex­tik.txt",true);

tw.WriteLine("ahoj, už jsem uložený tady v souboru");

tw.Close();

//načítání

TextReader tr = new StreamReader("tex­tik.txt");

Console.Write­Line(tr.ReadLi­ne());

tr.Close();

 
Odpovědět 29.3.2013 9:52
Avatar
Luboš Běhounek Satik
Autoredaktor
Avatar
Odpovídá na relycanx
Luboš Běhounek Satik:29.3.2013 9:58

Ano, můžeš použít i toto.

Odpovědět 29.3.2013 9:58
https://www.facebook.com/peasantsandcastles/
Avatar
relycanx
Člen
Avatar
relycanx:29.3.2013 10:31

dík :) přijde mi to o něco jednodušší, tak jsem v tom hledal háček :D

 
Odpovědět 29.3.2013 10:31
Avatar
Luboš Běhounek Satik
Autoredaktor
Avatar
Luboš Běhounek Satik:29.3.2013 10:38

Jenom by jsi textwriter měl hodit do using.

Odpovědět 29.3.2013 10:38
https://www.facebook.com/peasantsandcastles/
Avatar
relycanx
Člen
Avatar
relycanx:31.3.2013 12:59

Poraďte prosím

static void Main(string[] args)
{
StreamWriter sw = new StreamWriter("da­tabaze.txt");
StreamReader sr = new StreamReader("da­tabaze.txt");

//uložení
sw.WriteLine("bla");
sw.Flush();

//načtení
string i;
while ((i = sr.ReadLine()) != null)
{
Console.Write­Line(i);
}

}
Po spuštění chyba na řádku "StreamReader sr = new StreamReader("da­tabaze.txt");" - "IOException was unhandled - Proces nemůže přistupovat k souboru C:\..., protože je soubor využíván jiným procesem" a přitom ten soubor nemám otevřený a zkoušel jsem i načíst a uložit z jiného souboru a stejně to nejde :\ Jako uloží se všechno bez problému, ale načíst je problém.

 
Odpovědět 31.3.2013 12:59
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na relycanx
Petr Nymsa:31.3.2013 13:20

Neuzavřel jsi ten soubor. Tedy využívá ho stále StreamWriter, velmi doporučuju dávat čtení ze souborů do bloku using tedy

using(StreamWriter sw=new StreamWriter("database.txt"))
{
sw.WriteLine("AAAAA");
}

using se za tebe postará o uzavření souboru Snad to bude fungovat :)

Odpovědět 31.3.2013 13:20
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
relycanx
Člen
Avatar
Odpovídá na Petr Nymsa
relycanx:31.3.2013 13:24

jo takhleee, tak k tomu tam je to "using" :D už to chápu, dík moc :)

 
Odpovědět 31.3.2013 13:24
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na relycanx
Petr Nymsa:31.3.2013 13:27

Pozor ! Nepleť si to s usingem na načtení knihoven / namespaces, tedy ty první řádky programu

Odpovědět 31.3.2013 13:27
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na relycanx
Michal Žůrek - misaz:31.3.2013 13:59

using (dost neohrabaně) má 2 významy.
1.) nahoře ti pomůže, abys nemusel pořád zapisovat System.IO.Pat­h.GetFileName­WithoutExtensi­on(""), ale třeba pouze Path.GetFileNa­meWithoutExten­sion("")
2.) using v kódu, je dostupný pro vše co implementuje rozhraní IDisposable, tedy aby se předešlo memory leakům a po provedení potřebné operace všechna data byla vypuštěna z paměti.

 
Odpovědět 31.3.2013 13:59
Avatar
amoneth
Neregistrovaný
Avatar
amoneth:10.5.2013 13:30

mám problém s tím že když přidám záznam tak se nepřída hned pod to
např mám dvě 5 a přidam 6
5
5
56
5
takhle to vypadá, ale chci to mi normalně pdo sebou.

static void pripis()
{
try
{
Encoding kodovani = Encoding.Default;
string volba = "ano";
while (volba=="ano")
{
Console.Write­Line("kolik toho bude");
int a = int.Parse(Con­sole.ReadLine());

using (StreamWriter sw = new StreamWriter(@"c:\sem­\dat.txt", true))
{

for (int i = 0; i <= a - 1; i++)
{
Console.Write­Line("Dej co chceš pridat");
string pripisi = Console.ReadLine();

sw.WriteLine(pri­pisi);
}
sw.Flush();
Console.Write­Line("Přejete si zadat další zaznam?? [ano/ne]"); //dalsi while
Console.WriteLine("------------------");
volba = Console.ReadLine();
}
}

}
catch (Exception e)
{
Console.Write­Line(e.Message);
}
Console.Write­Line("prispalo se");
}

 
Odpovědět 10.5.2013 13:30
Avatar
Kit
Redaktor
Avatar
Odpovídá na amoneth
Kit:10.5.2013 13:54

Však to máš normálně pod sebou.

Odpovědět 10.5.2013 13:54
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
luxury654
Neregistrovaný
Avatar
luxury654:11.5.2013 14:17

dobry den mam tento kod, jenž prochazi jeden řádek po druhém a hledá schodu, když zadám něco co ma najit najde tak najde, ale když je to na 3. pozici tak mi to před tím napíše 2x nenalezeno, potem nalezeno, a nenalezeno až do konce, zkoušel sem to nějak měnit ale už nevím jak
do
{
radek = sr.ReadLine();
if (radek.Contain­s(text))
{
Console.Write­Line("nalezeno ");
Console.Write­Line(radek);
}
else
{
Console.Write­Line();
}

}

while (radek != null); //Konec souboru

sr.Close();

 
Odpovědět 11.5.2013 14:17
Avatar
luxury654
Neregistrovaný
Avatar
Odpovídá na luxury654
luxury654:11.5.2013 14:22

jo, když dam ten else pryčtak to jde, ale chcu aby mi to napsalo že tam ten zaznam třeba není

 
Odpovědět 11.5.2013 14:22
Avatar
Stefi
Neregistrovaný
Avatar
Stefi:21.5.2013 22:36

Dobry den potreboval byhc poradit, chtel bych svazat 2 textove soubory k sobe. Jedna se o login a heslo, pri registraci se mi zapisou obe veci do prislusnych textaku a maji maji stejne cislo radku a zajimalo by me jesti by toho slo nejak vyuzit nebo to budu muset udelat uplne jinak.
Dekuji za odpoved

 
Odpovědět 21.5.2013 22:36
Avatar
Luboš Běhounek Satik
Autoredaktor
Avatar
Odpovídá na Stefi
Luboš Běhounek Satik:21.5.2013 22:53

pokud v tech souborech neni nic jineho nez jedno heslo a jeden login, tak treba

File.AppendAllText("login.txt", File.ReadAllText("heslo.txt"));

A nebylo by lepsi je ukladat rovnou do jednoho souboru pri registraci?

Odpovědět 21.5.2013 22:53
https://www.facebook.com/peasantsandcastles/
Avatar
Kit
Redaktor
Avatar
Odpovídá na Luboš Běhounek Satik
Kit:22.5.2013 9:13

Raději do databáze.

Odpovědět  +1 22.5.2013 9:13
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Stefi
Neregistrovaný
Avatar
Odpovídá na Luboš Běhounek Satik
Stefi:22.5.2013 17:05

Asi bylo.
Dekuji za odpoved.

 
Odpovědět 22.5.2013 17:05
Avatar

Neregistrovaný
Avatar
:27.8.2013 12:34

Bohužel nelze stáhnout zdroják, rád bych se na to podíval, protože jsem lamkam a nejde mi to rozjed, podle návodu,
visual hlásí chybu u řádku kde je StreamWriter.
Mohl by mi to prosím vás někdo poslat na majl?

Dík

 
Odpovědět 27.8.2013 12:34
Avatar
KlimiCZ
Člen
Avatar
Odpovídá na
KlimiCZ:27.8.2013 13:59

1, mail tady neříkáš jaký máš
2, máš přidaný v usingu

using System.IO;
Odpovědět 27.8.2013 13:59
Nesnaž se zakrýt něco, co jsi provedl úmyslně. Svět je tak malý, že dotyčný se to stejně dozví.
Avatar
Odpovídá na
Michal Žůrek - misaz:27.8.2013 14:04

neregistrovaní uživatelé nemohou stahovat zdrojové kódy.

 
Odpovědět 27.8.2013 14:04
Avatar
Sergejl
Člen
Avatar
Sergejl:28.8.2013 0:48

Už jsem zjistil že pokud nejsem reg. nemůžu stahovat, ale popravdě, dopátral jsem se toho jen díky titulce v záhlaví stránky.

Jinak, chyba byla v Using System.IO !!!

Ale měl bych dotaz, jak zapisovat data né na konec ale na na začátek souboru?
Nevěděl by jste někdo, zkoušel jsem hledat v manuálech, ale nikde nic.
Jsem byl zvyklí psát přímo do fce (A,A+,W) atp. znaky pro nastavení zápisu na konec, smazání obasuhu....

Předem děkuji.

 
Odpovědět 28.8.2013 0:48
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Sergejl
David Čápka:28.8.2013 9:30

Zapisovat na začátek souboru nelze, jedině celý ten soubor zapsat znovu. U stahování je chyba v přesměrování, opravím to.

Odpovědět 28.8.2013 9:30
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:28.8.2013 9:34

Snad v C# existuje nějaká metoda seek() nebo něco na ten způsob, ne? Ovšem vkládat tímto způsobem samozřejmě nejde, pouze přepisovat. A je to úplně jiný programátorský level.

Odpovědět 28.8.2013 9:34
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Ondřej Štorc:22.10.2013 16:49

Nejde nějak určit řádek který má být přečten?

Odpovědět 22.10.2013 16:49
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
petrph
Člen
Avatar
Odpovídá na Ondřej Štorc
petrph:14.11.2013 15:31

Určit který řádek má být načten lze poměrně snadno - prostě si je odpočítáš:

string s;
int ChciRadkuCislo = 10;
for (int i = 1; i < ChciRadkuCislo; i++)
sr.ReadLine();
s = sr.ReadLine();

//tohle je ta co potřebuješ
Popřípadě pokud je potřebuješ načítat víckrát, tak si rovnou hodíš celý soubor do pole podle řádek:

string[] ss = File.ReadAllLines(@"soubor.txt");
Console.WriteLine(ss[10]);
 
Odpovědět  +4 14.11.2013 15:31
Avatar
toMajstr
Neregistrovaný
Avatar
toMajstr:11.1.2014 10:34

jak mám udělat, když chci aby to ten textovej soubor přečetlo nebo aspoň někam uložilo?

 
Odpovědět 11.1.2014 10:34
Avatar
toMajstr
Neregistrovaný
Avatar
Odpovídá na toMajstr
toMajstr:11.1.2014 10:36

sry, to sem nepatří :)

 
Odpovědět 11.1.2014 10:36
Avatar
kamo20101
Člen
Avatar
kamo20101:14.5.2014 21:48

C# zanas vyriesi specialne znaky pre ine operacne systemi...chcel by som sa spytat pre ake os sa daju pisat programi v c#?

 
Odpovědět 14.5.2014 21:48
Avatar
kamo20101
Člen
Avatar
kamo20101:16.5.2014 12:02

chcel by som prehladat subor riadok po riadku a niektore riadky vymazat ale StreamWriter nevie citat riadky :) je nejaky sposob ako otvorit subor aj na zapis aj na citanie? pripadne ako by som vyriesil moju ulohu.
Dakujemm za odpoved

 
Odpovědět 16.5.2014 12:02
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na kamo20101
Petr Nymsa:16.5.2014 12:07

Načteš si všechny řádky do kolekce (např. List) prohledáš, vymažeš co potřebuješ a zpátky soubor uložíš - přepíšeš :)

Odpovědět  +1 16.5.2014 12:07
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
borec.peta
Člen
Avatar
borec.peta:30.7.2014 14:48

Ahoj, neví někdo jak smazat poslední písmeno-něco jako Backspace, ale přes konzoli?

Odpovědět 30.7.2014 14:48
嘿伙计在看什么
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
pracansky
Člen
Avatar
Odpovídá na kamo20101
pracansky:12.4.2015 17:31

krátká odpověď je: "\r", "\n", "\r\n" nebo Environment.NewLine

dlouhá ale lepší:
http://cs.wikipedia.org/…%99%C3%A1dek

 
Odpovědět 12.4.2015 17:31
Avatar
Kotyza Lukáš:22.4.2016 22:23

jak mám převést hodnotu decimal do hodnoty string?
(jak jsem psal v následujícím článku potřebuji uložit hodnotu z numericupdownu(de­cimal) a ukládám to do textového souboru(string) je to nejjednoduší metoda ale nikde jsem nenašel jak převést decimal do string)

Editováno 22.4.2016 22:25
 
Odpovědět 22.4.2016 22:23
Avatar
Tomáš Brůna
Redaktor
Avatar
Odpovídá na Kotyza Lukáš
Tomáš Brůna:23.4.2016 8:24

Zkus neco takoveho:

Hodnota.toString();

Nebo

String.toString(promenna);

Snad to bude fungovat

Odpovědět  +1 23.4.2016 8:24
Vi veri universum vivus vici
Avatar
Kotyza Lukáš:26.4.2016 17:18
MainForm()
{
        using (StreamWriter sw = new StreamWriter(@"uloziste.txt"))
                                {
                                        decimal x = vnt001.Value;       /*vnt001 je numericupdown*/
                                        x.ToString();
                                        sw.WriteLine(x);
                                }

...
...
co jsem tak pochopil tak jsi to myslel takle,
ale zase mě to píše že odkaz na instanci není nastaven

Editováno 26.4.2016 17:18
 
Odpovědět 26.4.2016 17:18
Avatar
Tomáš Brůna
Redaktor
Avatar
Odpovídá na Kotyza Lukáš
Tomáš Brůna:26.4.2016 17:45

myslel jsem to takto:

decimal x = vnt001.Value;
sw.WriteLine(x.ToString());
Odpovědět 26.4.2016 17:45
Vi veri universum vivus vici
Avatar
Kotyza Lukáš:26.4.2016 18:18

aha tak to jo ale stejně mně to háže chybu na řádek decimal x = vnt001.value;

public MainForm()
                {

                        using (StreamWriter sw = new StreamWriter(@"uloziste.txt"))
                        {

                                decimal x = vnt001.Value;
                                sw.WriteLine(x.ToString());
                        }
                        using (StreamReader sr = new StreamReader(@"uloziste.txt"))
                        {
                                string s;
                                while ((s = sr.ReadLine()) != null)
                                {
                                        MessageBox.Show(s);
                                                /*zatím to mám poslané do massage boxu ale to teď neřeším*/
                                }
                        }
                }

toto je celá část mého kódu krom pár tlačítek

 
Odpovědět 26.4.2016 18:18
Avatar
Tomáš Brůna
Redaktor
Avatar
Odpovídá na Kotyza Lukáš
Tomáš Brůna:26.4.2016 18:38

co to je za chybu?
Ps: používej prosím tlačítko odpovědět ;)

Odpovědět 26.4.2016 18:38
Vi veri universum vivus vici
Avatar
Odpovídá na Tomáš Brůna
Kotyza Lukáš:26.4.2016 18:45

tady je ta chyba

System.NullRe­ferenceExcepti­on: Odkaz na objekt není nastaven na instanci objektu.
v a.MainForm..ctor() v c:\Users\Owner\Des­ktop\sklad vnt tht\a\MainFor­m.cs:řádek 34
v a.Program.Main(Strin­g[] args) v c:\Users\Owner\Des­ktop\sklad vnt tht\a\Program­.cs:řádek 27

Editováno 26.4.2016 18:46
 
Odpovědět 26.4.2016 18:45
Avatar
Tomáš Brůna
Redaktor
Avatar
Odpovídá na Kotyza Lukáš
Tomáš Brůna:26.4.2016 19:41

můžeš prosím ještě poslat kód desingeru?

Odpovědět 26.4.2016 19:41
Vi veri universum vivus vici
Avatar
Odpovídá na Tomáš Brůna
Kotyza Lukáš:26.4.2016 20:08

kód designeru

/*
 * Created by SharpDevelop.
 * User: kotyza lukas
 * Date: 13.4.2016
 * Time: 19:11
 *
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
namespace a
{
        partial class MainForm
        {
                /// <summary>
                /// Designer variable used to keep track of non-visual components.
                /// </summary>
                private System.ComponentModel.IContainer components = null;

                /// <summary>
                /// Disposes resources used by the form.
                /// </summary>
                /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
                protected override void Dispose(bool disposing)
                {
                        if (disposing) {
                                if (components != null) {
                                        components.Dispose();
                                }
                        }
                        base.Dispose(disposing);
                }

                /// <summary>
                /// This method is required for Windows Forms designer support.
                /// Do not change the method contents inside the source code editor. The Forms designer might
                /// not be able to load this method if it was changed manually.
                /// </summary>
                private void InitializeComponent()
                {
                        this.label1 = new System.Windows.Forms.Label();
                        this.label2 = new System.Windows.Forms.Label();
                        this.label3 = new System.Windows.Forms.Label();
                        this.label4 = new System.Windows.Forms.Label();
                        this.vnt001 = new System.Windows.Forms.NumericUpDown();
                        this.vnt002 = new System.Windows.Forms.NumericUpDown();
                        this.vnt003 = new System.Windows.Forms.NumericUpDown();
                        this.vnt004 = new System.Windows.Forms.NumericUpDown();
                        this.btnvyrob1 = new System.Windows.Forms.Button();
                        this.numnasobic = new System.Windows.Forms.NumericUpDown();
                        this.panel1 = new System.Windows.Forms.Panel();
                        this.btnkontrola = new System.Windows.Forms.Button();
                        this.panel2 = new System.Windows.Forms.Panel();
                        this.panel3 = new System.Windows.Forms.Panel();
                        this.panel4 = new System.Windows.Forms.Panel();
                        this.odpovedlbl = new System.Windows.Forms.Label();
                        ((System.ComponentModel.ISupportInitialize)(this.vnt001)).BeginInit();
                        ((System.ComponentModel.ISupportInitialize)(this.vnt002)).BeginInit();
                        ((System.ComponentModel.ISupportInitialize)(this.vnt003)).BeginInit();
                        ((System.ComponentModel.ISupportInitialize)(this.vnt004)).BeginInit();
                        ((System.ComponentModel.ISupportInitialize)(this.numnasobic)).BeginInit();
                        this.SuspendLayout();
                        //
                        // label1
                        //
                        this.label1.Location = new System.Drawing.Point(12, 59);
                        this.label1.Name = "label1";
                        this.label1.Size = new System.Drawing.Size(189, 20);
                        this.label1.TabIndex = 1;
                        this.label1.Text = "VNT003";
                        //
                        // label2
                        //
                        this.label2.Location = new System.Drawing.Point(12, 33);
                        this.label2.Name = "label2";
                        this.label2.Size = new System.Drawing.Size(189, 20);
                        this.label2.TabIndex = 2;
                        this.label2.Text = "VNT002";
                        //
                        // label3
                        //
                        this.label3.Location = new System.Drawing.Point(9, 9);
                        this.label3.Name = "label3";
                        this.label3.Size = new System.Drawing.Size(189, 20);
                        this.label3.TabIndex = 3;
                        this.label3.Text = "VNT001 ( kondenzátor )";
                        //
                        // label4
                        //
                        this.label4.Location = new System.Drawing.Point(12, 85);
                        this.label4.Name = "label4";
                        this.label4.Size = new System.Drawing.Size(189, 20);
                        this.label4.TabIndex = 4;
                        this.label4.Text = "VNT004";
                        //
                        // vnt001
                        //
                        this.vnt001.BackColor = System.Drawing.Color.Silver;
                        this.vnt001.Increment = new decimal(new int[] {
                                                                        100,
                                                                        0,
                                                                        0,
                                                                        0});
                        this.vnt001.Location = new System.Drawing.Point(207, 7);
                        this.vnt001.Maximum = new decimal(new int[] {
                                                                        1000000000,
                                                                        0,
                                                                        0,
                                                                        0});
                        this.vnt001.Minimum = new decimal(new int[] {
                                                                        1410065408,
                                                                        2,
                                                                        0,
                                                                        -2147483648});
                        this.vnt001.Name = "vnt001";
                        this.vnt001.Size = new System.Drawing.Size(74, 20);
                        this.vnt001.TabIndex = 5;
                        this.vnt001.Value = new decimal(new int[] {
                                                                        1000,
                                                                        0,
                                                                        0,
                                                                        0});
                        //
                        // vnt002
                        //
                        this.vnt002.BackColor = System.Drawing.Color.Silver;
                        this.vnt002.Increment = new decimal(new int[] {
                                                                        100,
                                                                        0,
                                                                        0,
                                                                        0});
                        this.vnt002.Location = new System.Drawing.Point(207, 31);
                        this.vnt002.Maximum = new decimal(new int[] {
                                                                        1000000000,
                                                                        0,
                                                                        0,
                                                                        0});
                        this.vnt002.Minimum = new decimal(new int[] {
                                                                        1410065408,
                                                                        2,
                                                                        0,
                                                                        -2147483648});
                        this.vnt002.Name = "vnt002";
                        this.vnt002.Size = new System.Drawing.Size(74, 20);
                        this.vnt002.TabIndex = 6;
                        this.vnt002.Value = new decimal(new int[] {
                                                                        500,
                                                                        0,
                                                                        0,
                                                                        0});
                        //
                        // vnt003
                        //
                        this.vnt003.BackColor = System.Drawing.Color.Silver;
                        this.vnt003.Increment = new decimal(new int[] {
                                                                        100,
                                                                        0,
                                                                        0,
                                                                        0});
                        this.vnt003.Location = new System.Drawing.Point(207, 57);
                        this.vnt003.Maximum = new decimal(new int[] {
                                                                        1000000000,
                                                                        0,
                                                                        0,
                                                                        0});
                        this.vnt003.Minimum = new decimal(new int[] {
                                                                        1410065408,
                                                                        2,
                                                                        0,
                                                                        -2147483648});
                        this.vnt003.Name = "vnt003";
                        this.vnt003.Size = new System.Drawing.Size(74, 20);
                        this.vnt003.TabIndex = 7;
                        this.vnt003.Value = new decimal(new int[] {
                                                                        500,
                                                                        0,
                                                                        0,
                                                                        0});
                        //
                        // vnt004
                        //
                        this.vnt004.BackColor = System.Drawing.Color.Silver;
                        this.vnt004.Increment = new decimal(new int[] {
                                                                        100,
                                                                        0,
                                                                        0,
                                                                        0});
                        this.vnt004.Location = new System.Drawing.Point(207, 83);
                        this.vnt004.Maximum = new decimal(new int[] {
                                                                        1000000000,
                                                                        0,
                                                                        0,
                                                                        0});
                        this.vnt004.Minimum = new decimal(new int[] {
                                                                        1410065408,
                                                                        2,
                                                                        0,
                                                                        -2147483648});
                        this.vnt004.Name = "vnt004";
                        this.vnt004.Size = new System.Drawing.Size(74, 20);
                        this.vnt004.TabIndex = 8;
                        this.vnt004.Value = new decimal(new int[] {
                                                                        500,
                                                                        0,
                                                                        0,
                                                                        0});
                        //
                        // btnvyrob1
                        //
                        this.btnvyrob1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
                        this.btnvyrob1.Location = new System.Drawing.Point(534, 255);
                        this.btnvyrob1.Name = "btnvyrob1";
                        this.btnvyrob1.Size = new System.Drawing.Size(79, 38);
                        this.btnvyrob1.TabIndex = 9;
                        this.btnvyrob1.Text = "výrobek 1 ";
                        this.btnvyrob1.UseVisualStyleBackColor = true;
                        this.btnvyrob1.Click += new System.EventHandler(this.Btnvyrob1Click);
                        //
                        // numnasobic
                        //
                        this.numnasobic.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
                        this.numnasobic.BackColor = System.Drawing.Color.Silver;
                        this.numnasobic.Location = new System.Drawing.Point(482, 266);
                        this.numnasobic.Maximum = new decimal(new int[] {
                                                                        100000,
                                                                        0,
                                                                        0,
                                                                        0});
                        this.numnasobic.Minimum = new decimal(new int[] {
                                                                        1,
                                                                        0,
                                                                        0,
                                                                        0});
                        this.numnasobic.Name = "numnasobic";
                        this.numnasobic.Size = new System.Drawing.Size(46, 20);
                        this.numnasobic.TabIndex = 10;
                        this.numnasobic.Value = new decimal(new int[] {
                                                                        1,
                                                                        0,
                                                                        0,
                                                                        0});
                        //
                        // panel1
                        //
                        this.panel1.BackColor = System.Drawing.Color.Maroon;
                        this.panel1.Location = new System.Drawing.Point(190, 12);
                        this.panel1.Name = "panel1";
                        this.panel1.Size = new System.Drawing.Size(11, 10);
                        this.panel1.TabIndex = 11;
                        this.panel1.Visible = false;
                        //
                        // btnkontrola
                        //
                        this.btnkontrola.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
                        this.btnkontrola.Location = new System.Drawing.Point(12, 270);
                        this.btnkontrola.Name = "btnkontrola";
                        this.btnkontrola.Size = new System.Drawing.Size(75, 23);
                        this.btnkontrola.TabIndex = 12;
                        this.btnkontrola.Text = "kontrola";
                        this.btnkontrola.UseVisualStyleBackColor = true;
                        this.btnkontrola.Click += new System.EventHandler(this.BtnkontrolaClick);
                        //
                        // panel2
                        //
                        this.panel2.BackColor = System.Drawing.Color.Maroon;
                        this.panel2.Location = new System.Drawing.Point(190, 33);
                        this.panel2.Name = "panel2";
                        this.panel2.Size = new System.Drawing.Size(11, 10);
                        this.panel2.TabIndex = 12;
                        this.panel2.Visible = false;
                        //
                        // panel3
                        //
                        this.panel3.BackColor = System.Drawing.Color.Maroon;
                        this.panel3.Location = new System.Drawing.Point(190, 56);
                        this.panel3.Name = "panel3";
                        this.panel3.Size = new System.Drawing.Size(11, 10);
                        this.panel3.TabIndex = 12;
                        this.panel3.Visible = false;
                        //
                        // panel4
                        //
                        this.panel4.BackColor = System.Drawing.Color.Maroon;
                        this.panel4.Location = new System.Drawing.Point(190, 82);
                        this.panel4.Name = "panel4";
                        this.panel4.Size = new System.Drawing.Size(11, 10);
                        this.panel4.TabIndex = 13;
                        this.panel4.Visible = false;
                        //
                        // MainForm
                        //
                        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                        this.BackColor = System.Drawing.Color.Silver;
                        this.ClientSize = new System.Drawing.Size(625, 305);
                        this.Controls.Add(this.odpovedlbl);
                        this.Controls.Add(this.panel2);
                        this.Controls.Add(this.panel3);
                        this.Controls.Add(this.panel4);
                        this.Controls.Add(this.btnkontrola);
                        this.Controls.Add(this.panel1);
                        this.Controls.Add(this.numnasobic);
                        this.Controls.Add(this.btnvyrob1);
                        this.Controls.Add(this.vnt004);
                        this.Controls.Add(this.vnt003);
                        this.Controls.Add(this.vnt002);
                        this.Controls.Add(this.vnt001);
                        this.Controls.Add(this.label4);
                        this.Controls.Add(this.label3);
                        this.Controls.Add(this.label2);
                        this.Controls.Add(this.label1);
                        this.Name = "MainForm";
                        this.Text = "SKLAD THT - VNT";
                        ((System.ComponentModel.ISupportInitialize)(this.vnt001)).EndInit();
                        ((System.ComponentModel.ISupportInitialize)(this.vnt002)).EndInit();
                        ((System.ComponentModel.ISupportInitialize)(this.vnt003)).EndInit();
                        ((System.ComponentModel.ISupportInitialize)(this.vnt004)).EndInit();
                        ((System.ComponentModel.ISupportInitialize)(this.numnasobic)).EndInit();
                        this.ResumeLayout(false);
                }
                private System.Windows.Forms.Label odpovedlbl;
                private System.Windows.Forms.Panel panel4;
                private System.Windows.Forms.Panel panel3;
                private System.Windows.Forms.Panel panel2;
                private System.Windows.Forms.Button btnkontrola;
                private System.Windows.Forms.Panel panel1;
                private System.Windows.Forms.NumericUpDown numnasobic;
                private System.Windows.Forms.Button btnvyrob1;
                private System.Windows.Forms.NumericUpDown vnt004;
                private System.Windows.Forms.NumericUpDown vnt003;
                private System.Windows.Forms.NumericUpDown vnt002;
                private System.Windows.Forms.NumericUpDown vnt001;
                private System.Windows.Forms.Label label4;
                private System.Windows.Forms.Label label3;
                private System.Windows.Forms.Label label2;
                private System.Windows.Forms.Label label1;
        }
}
Editováno 26.4.2016 20:10
 
Odpovědět 26.4.2016 20:08
Avatar
Tomáš Brůna
Redaktor
Avatar
Odpovídá na Kotyza Lukáš
Tomáš Brůna:26.4.2016 20:17

abych pravdu řekl, tak netuším :( leda že by jsi poslal celý projekt, toto:

using (StreamWriter sw = new StreamWriter(@"uloziste.txt"))
                     {

                             decimal x = vnt001.Value;
                             sw.WriteLine(x.ToString());
                     }
                     using (StreamReader sr = new StreamReader(@"uloziste.txt"))
                     {
                             string s;
                             while ((s = sr.ReadLine()) != null)
                             {
                                     MessageBox.Show(s);
                                             /*zatím to mám poslané do massage boxu ale to teď neřeším*/
                             }
                     }

u mně normálně jede

Odpovědět 26.4.2016 20:17
Vi veri universum vivus vici
Avatar
Odpovídá na Tomáš Brůna
Kotyza Lukáš:26.4.2016 20:35

http://www.itnetwork.cz/dev-lighter/716

http://www.itnetwork.cz/dev-lighter/715

http://www.itnetwork.cz/dev-lighter/714

a ještě nejspíš by to nemělo mít vliv ale v jakém programu to otvíráš já to otvírám v sharpdevelopu

 
Odpovědět 26.4.2016 20:35
Avatar
Tomáš Brůna
Redaktor
Avatar
Tomáš Brůna:26.4.2016 21:00

konečně..... :D :D...
snažíš se číst z neexistujícího numericUpDownu, teda snažíš ze z něj číst něž ho vůbec vytvoříš,
takže přesuň tohle:

InitializeComponent();

před to kde čteš.

http://www.itnetwork.cz/dev-lighter/717

Odpovědět 26.4.2016 21:00
Vi veri universum vivus vici
Avatar
Odpovídá na Tomáš Brůna
Kotyza Lukáš:26.4.2016 21:07

už to funguje strašně moc děkuji zase jsem o něco chytřejší

 
Odpovědět  +1 26.4.2016 21:07
Avatar
Aleš Horna
Člen
Avatar
Aleš Horna:2.5.2016 16:20

Ahoj, rád bych se zeptal, zda jde nějak zjistit počet řádků v textovém dokumentu? Děkuji

 
Odpovědět 2.5.2016 16:20
Avatar
Lukas C#
Redaktor
Avatar
Odpovídá na Aleš Horna
Lukas C#:2.5.2016 16:22

Založ si int, který při každém přečení řádku ve while cyklu inkrementuješ.

 
Odpovědět  +1 2.5.2016 16:22
Avatar
Lukáš Hypša:25.2.2018 13:38

Mám takovej podivnej problém. Pokud vytvořím .txt soubor a napíšu do něj text, program mi umí přečíst jen ASCII znaky a ostatní zobrazí jako otazníky. Pokud do něj ale nejdřív něco zapíšu přes StreamWriter, pak to najednou umí číst bez problému. Hádám, že to bude ve formátu nebo kodování toho .txt souboru. Neví někdo? :D

Odpovědět 25.2.2018 13:38
Jsem lama co se roky snaží naučit napsat aspoň pár řádků a furt mu to nejde...
Avatar
krepsy3
Redaktor
Avatar
krepsy3:26.2.2018 12:04

Je to jako když otevřeš notepad, něco napíšeš a pak dáš uložit - dole máš nabídku kódování. Je tam ASCII, ANSI a UTF-8 :D StreamWriter má defaultní kódování UTF-8, dá se ovlivnit nastavením příslušné vlastnosti, jméno teď z hlavy nevím, ale bude to něco jako StreamWriter.En­coding

Odpovědět 26.2.2018 12:04
Programátor je stroj k převodu kávy na kód.
Avatar
Jakub Ondrák:18.5.2018 17:27

priority: Low :-)

WriteAllLines(po­leStringu, cestaKSouboru) nebo AppendAllLines(po­leStringu, cestaKSouboru)

nejdřív je cestaKSouboru a pak poleStringu

 
Odpovědět 18.5.2018 17:27
Avatar
Odpovídá na Michal Žůrek - misaz
Patrik Pastor:2. května 21:51

vypustueni z pameti... nema presne tohle delat GC, nebo na co tam je? Nebo to je tak, jak rikal kolega ve druhem dilu, ze by "using" vubec nemusel existovat, kdyby se na ty objekty pouzival destruktor a k vypusteni z pameti by tedy doslo automaticky.

 
Odpovědět 2. května 21:51
Avatar
Patrik Pastor:2. května 22:31

Chtel jsem se zeptat, sice to "pro jednoduchost" autor neuvadi, ale chtel jsem si zapis do souboru vyzkouset ve vytvorenem souboru ve druhe dile (kde je rec o pravech a kod s try, catch podminkama), ale soubor se mi nevypsal, takze by bylo dobre pro tu "jednoduchost" udelat i priklad. Udelal jsem toto:

if (File.Exists(Pat­h.Combine(ces­ta, "databaze.dat")))
{
try
{
// Zde umístěte kód pro načtení vašeho nastavení ze souboru
....
}
catch
{
...
}
else
{
try
{
// Zde umístěte kód pro vytvoření vašeho nastavení
using (StreamWriter sw = new StreamWriter(@"C:\U­sers\ppast\Ap­pData\Roaming\A­plikace"))
// cesta k prvnimu vytvorenemu souboru se vsemi podminkami a pravy
{
sw.WriteLine("První řádek");
sw.WriteLine("Tento text je na druhém řádku");
sw.WriteLine("A do třetice.");
sw.Flush();
}
}

Ale nevypsalo se mi nic (reps. nevytvoril se ani soubor), takze prosim o radu, nebo autora aby si dal praci a pro tu "jednoduchost" udelal priklad se souborem i se pravy a podminkami, diky

 
Odpovědět 2. května 22:31
Avatar
Odpovídá na Patrik Pastor
Michal Žůrek - misaz:3. května 0:09

Jedná se o to že při I/O operacích se volají funkce operačního systému a po dokončení práce se opět musí volat funkce operačního systému na uzavření souboru. Toto ale GC nedělá, potože to ani není jeho práce. GC čistí paměť, neprovádí volání operačního systému.

Volání Close, respktive Dispose naopak ten objekt neodstraní z paměti, ale pouze provede to volání operačního systému, které v operačním systému uzavře přístup k souboru. O odstranění objektu (např. StreamWriter) z paměti se potom řádně postará GC.

Pokud Close nezavoláš, tak GC ten objekt odstraní z paměti (ale nezavolá funkci zavření v operačním systému). Paměťově je to v tvé aplikaci OK, ale v operačním sytému stále visí ten otevřený soubor se kterým jednak nejde pracovat (ani tvoje aplikace, která už nemá třídu, která se souborem uměla pracovat, ani jiné aplikace, protože soubor je blokován tvou aplikací) a jednak operační systém musí kvůli toho udržovat nějaké interní informace, které zabírají paměť (a toto teprve dělá ten memory leak).

Editováno 3. května 0:10
 
Odpovědět 3. května 0:09
Avatar
Odpovídá na Patrik Pastor
Michal Žůrek - misaz:3. května 0:12

Destruktory se v .NET moc nepoužívají, protože to zpomaluje čištění paměti a přidává overhead každému objektu. Místo toho se používá using blok a rozhraní IDisposable, které ten overhead přidává jen třídám, které to opravdu potřebují.

 
Odpovědět 3. května 0:12
Avatar
Odpovídá na Patrik Pastor
Michal Žůrek - misaz:3. května 0:14

takt o spadlo na nějakou vyjímku. Zakomentuj si blok try/catch nebo si dej do catch breakpoint nebo něco a uvidíš.

 
Odpovědět 3. května 0:14
Avatar
Odpovídá na Michal Žůrek - misaz
Patrik Pastor:3. května 8:19

Takze kod je ok? Muzu pouzivat using v tom kontextu?(tedy v podmince else, kdyz jeste neexistuje soubor, a je using pouzit v try bloku). Cili kod je ok, ale mam hledat exception, kterou to vyhodi?

 
Odpovědět 3. května 8:19
Avatar
Odpovídá na Michal Žůrek - misaz
Patrik Pastor:3. května 8:22

pokud by ale byly destruktory zde, tak by prece zrusili referencen jak v aplikaci, tak v operacni pameti (timpadem by nedochazovalo k memoryleak) a GC by byl zbytecny, proc se tedy nepouzivaji?

 
Odpovědět 3. května 8:22
Avatar
Odpovídá na Patrik Pastor
Michal Žůrek - misaz:3. května 13:19

using můžeš (a měl bys) používat všude, kde pracuješ v souboru. Je jendo jestli je to v else, try nebo někde jinde.

 
Odpovědět 3. května 13:19
Avatar
Odpovídá na Patrik Pastor
Michal Žůrek - misaz:3. května 13:20

viz. můj 2 komentář z 3.5.2019 0:12

Destruktory se v .NET moc nepoužívají, protože to zpomaluje čištění paměti a přidává overhead každému objektu. Místo toho se používá using blok a rozhraní IDisposable, které ten overhead přidává jen třídám, které to opravdu potřebují.

 
Odpovědět 3. května 13:20
Avatar
Patrik Pastor:3. května 15:43

chtel bych se zeptat, z dalsi lekce, kde zapisujeme do textaku pomoci StreamWriter, jsem chtel neco napsat do souboru. Kdyz jsem zapisoval cestu do new StreamWriter(ces­ta), vyhodilo mi to chybu. Cesta je ale spravne a smeruje do meho vytvoreneho souboru z tohoto dilu. Musel jsem tedy prepsat na Path.Combine(cesta, "neco.txt"), aby se mi to tam konecne ulozilo. Ptam se tedy proc se mi to defaulne neuklada do souboru, kdery jsem vytvoril (respektive slozku), ale musil pro dalsi soubory vytvaret nove. Diky za odpoved

 
Odpovědět 3. května 15:43
Avatar
Odpovídá na Michal Žůrek - misaz
Patrik Pastor:3. května 19:03

jak se potom lisi ty tridy, ktere ten "overhead" potrebuji od tech, ktere ne? Napsat to, bez dalsich detailu neni zcela dostacujici, proc by se potom destruktory pouzivaly v nizsich jazicich (ktere jsou prave rychlejsi a destruktor maji, takze by to bylo opak k tomu, co tvrdis).

 
Odpovědět 3. května 19:03
Avatar
Vasil Rudobaba:3. října 5:45

Ahoj.
V článku je pro čtení použít cykl pro čtení

while ((s = sr.ReadLine()) != null)

Prostě cyklus čte dokud řádek není null.
Nějaké výtky k používání ?

while(!sr.EndOfStream)
 
Odpovědět 3. října 5:45
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 63 zpráv z 63.