Úvod do programování 8. hodina RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015
Umíme z minulé hodiny
Algoritmy
Hornerovo schéma Převod mezi číselnými soustavami Dlouhá celá čísla (reprezentace) Součet, rozdíl, součin, podíl Dlouhá reálná čísla (reprezentace) Zlomky (reprezentace)
Syntax
Konstanty
Jan Lánský
Úvod do programování 8. hodina
2
Cíle hodiny
Soubory
Textové (= textový režim přístupu)
Binární (= binární režim přístupu)
StreamReader, StreamWriter BinaryReader, BinaryWriter
Syntax
Čtení ze souboru a zápis do souboru Správa souborového systému
Jan Lánský
Directory, File, Path, FileInfo Úvod do programování 8. hodina
3
Přístup na disk
Přístup na disk je o mnoho řádů pomalejší než přístup do operační paměti
Nepoužívat disk jako dočasné úložiště dat, která se vejdou do operační paměti
Disk jednotky milisekund, operační paměť desítky nanosekund (5 řádů)
Zápis / čtení neprobíhá po bytech, ale po blocích
Rozhraní programovacího jazyka umožňuje práci po jednotlivých bytech Buffrování (kompilátor), disková cashe Když v programu zapíšu data na disk, fyzicky se zapíší až později Práce se sousedními daty časově méně náročná než práce s daty různých částí souborů
Jan Lánský
Úvod do programování 8. hodina
4
using System.IO;
Práce se soubory
1. krok - Otevření souboru se zadaným jménem a režimem (čtení, zápis)
Pravé tlačítko myši na podtržený identifikátor Resolve
Automatická kontrola existence, přístupových práv Pokud se soubor nepodaří otevřít vyvolá se chyba
2. krok - Čtení / zápis 3. krok - Zavření souboru
OS umožňuje mít otevřený omezený počet souboru (řádově stovky) Při uzavření souboru se na disk zapíší obsahy bufferu na disk
Pokud ukončíme program bez zápisu souboru na disk, ztratíme data z bufferu
Dokud soubor nezavřeme, blokujeme ho ostatním
Jan Lánský
Úvod do programování 8. hodina
5
Textové vs. Binární soubory
Textové
Lidsky čitelný zápis Obsah dělen na řádky *.txt, *.html, *.xml
Binární
Jan Lánský
Lidsky nečitelné Hodnoty ve stejném tvaru jako uloženy v paměti Význam dat závisí na našem rozhodnutí *.exe, *.doc
Úvod do programování 8. hodina
6
Textové soubory čtení
StreamReader – otevření pro čtení
new StreamReader(@"cesta k souboru")
string s = @"cesta"; new StreamReader(s)
Vrací počet
Read() – znak Vrací int, Konec souboru -1 přečtených znaků. Konec Read(pole, start, pocet) – pole znaků souboru je 0 ReadLine() – řádka Konec souboru null ReadToEnd() – do konce souboru Peak() – podíváme se následující znak, ale zůstane nepřečtený Soubory se musí zavírat Close() – uzavření souboru Jan Lánský
Úvod do programování 8. hodina
7
Cesta k souborům
@ "retezec"
Nepokusí se interpretovat znaky jako řídící znaky formátovacího řetězce Př.: @"..\novy" nebude odřádkovávat ("\n")
Název souboru bez cesty
Př.: @"soubor.txt",
@ (alt + 64)
Najdeme v ..\Solution\Project\bin\Debug\
Absolutní cesta: Př.: @"C:\data\tmp\a.txt" Relativní cesta: Př.: @"..\..\a.txt"
Jan Lánský
Úvod do programování 8. hodina
8
StreamReader
Přečteme soubor po řádcích a vypíšeme ho obrazovku
Práce se soubory
Otevřeme pro čtení soubor se zadanou cestou
Dokud jsou v souboru řádky Zavřeme soubor Soubor se musí vejít do paměti
Cyklus lze nahradit přečtením celého souboru najednou Jan Lánský
Úvod do programování 8. hodina
9
Textové soubory: ukázka Textové zobrazení Binární zobrazení
Konec řádku Windows dva symboly 0A, 0D. Jiné OS jinak Jan Lánský
Úvod do programování 8. hodina
10
Textové soubory zápis
Existující soubor přepíše
StreamWriter – Otevření pro zápis
new StreamWriter(@"cesta k souboru")
Připojení na konec souboru: new StreamWriter(@"cesta k souboru", true)
Write() – cokoliv (17 verzí) Write(pole, start, pocet) – pole znaků WriteLine() – jako Write + odřádkuje Flush() – zápis bufferů do souboru Close() – uzavření souboru Soubory se
musí zavírat
Jan Lánský
Úvod do programování 8. hodina
11
Přečteme soubor po řádcích vypíšeme ho do jiného souboru
StreamWriter
Otevřeme pro zápis
Počet řádků
Každých 1000 řádků budeme mít jistotu, že se data skutečně zapsala do souboru. Pojistka pro pád programu, zde není nutná Zavřeme oba soubory Jan Lánský
Flush úplně každého řádku by dost zpomaloval Úvod do programování 8. hodina
12
Přečteme soubor po znacích a do dalšího souboru vypíšeme slova délky 5 a více. Každé slovo na novém řádku.
Zápis pole
Načteme 1 znak, později musíme přetypovat na char. Konec souboru -1 Slovo je souvislá posloupnost písmen Doufáme, že slova jsou kratší než 100, jinak chyba
Začneme nové slovo Jan Lánský
Do souboru vypíšeme část pole, od indexu 0 do indexu 0 + delka - 1
Úvod do programování 8. hodina
13
FileStream
new FileStream (@"cesta", FileMode)
Soubor v Textovém režimu šel otevírat přímo
Obecné otevření souboru - nutné pro otevření souboru v binárním režimu Open je určen
FileMode – výčtový typ
pro čtení
Open – Otevře existující soubor na začátku Append – Otevře existující soubor na konci Create – Vytvoří nový soubor Create je určen pro zápis Jan Lánský
Append je určen pro zápis formou logování
Úvod do programování 8. hodina
14
Binární soubory
BinaryWriter – zápis
new BinaryWriter(FileStream) Write() – 18 verzí pro různé datové typy
BinaryReader – čtení
Musíme načítat datové typy v odpovídajícím pořadí v jakém byly zapisovány. Jinak vzniknou nesmysly.
new BinaryReader(FileStream) ReadInt32(), ReadString(), … 15 verzí
Close() – uzavření souboru
Jan Lánský
Úvod do programování 8. hodina
Soubory se musí zavírat 15
Binární soubory ukázka Textové zobrazení Je nesmysl (zalomení řádek)
Jan Lánský
Úvod do programování 8. hodina
Binární zobrazení
16
BinaryWriter Otevřeme binární soubor pro zápis Musíme uložit i délku pole Pro každý prvek pole uložíme hodnoty všech datových položek Zavřeme soubor Jan Lánský
Úvod do programování 8. hodina
17
BinaryReader Otevřeme binární soubor pro čtení
Načteme délku pole
Zavřeme soubor Jan Lánský
Pro každý prvek pole musíme znát datové typy položek a pořadí v jakém jsme položky ukládali
Úvod do programování 8. hodina
18
Seek
FileStream.Seek (posun, SeekOrgin)
Textové soubory, konce řádku dva znaky 0D, 0A, nelze rozumně použít
Nastavení se na konkrétní pozici v souboru (obdoba přístupu k prvku pole pomocí indexu) Má smysl jen pro binární soubory, které neobsahují řetězce proměnlivé délky (string)
SeekOrgin
Begin – posun se počítá od začátku souboru End – posun se počítá od konce souboru
Zamestnanec jmeno udělá Seek nepoužitelný
Seek(-1, SeekOrgin.End) – posun na poslední platný znak
Current – posun se počítá od aktuální pozice
Seek(-1, SeekOrgin.Current) – posun o jeden znak zpět
Jan Lánský
Úvod do programování 8. hodina
19
Seek: příklad
Zavřeme soubor
Ze souboru obsahujícího pouze 32bitová čísla načteme číslo se zadaným pořadím
Vytvoříme BinaryReader, který začíná číst na pozici, na které jsme nastaveni
V souboru se nastavíme na místo, které obsahuje číslo, které chceme přečíst. Velikost datového typu * pořadí
Přečteme číslo Jan Lánský
Úvod do programování 8. hodina
20
Správa souborového systému
Directory
File
Zpřístupňuje funkce pro správu souborů Delete, Copy, Move, Length velikost souboru, SetAttributes, GetAttributes nezjistím z File
FileInfo
Zpřístupňuje funkce pro správu adresářů CreateDirectory, Move, Delete GetFiles, GetDirectories, GetParent
Length, Name, FullName
Path
Podobné FileInfo, ale nemusíme vytvářet proměnnou
GetFullPath, GetFileName, GetExtension
Jan Lánský
Úvod do programování 8. hodina
21
2 rozměrná pole budou příští hodinu
Příklad: Kopie souborů Vytvoříme adresář
Návratová hodnota: Pole řetězců se jmény souborů Projdeme soubory
Informace o aktuálním souboru Výpis názvu souboru a délky
Okopírujeme soubor do zaloha
Jan Lánský
true přepisovat existující soubory
GetFileName Jméno souboru bez adresářů
Úvod do programování 8. hodina
Jméno souboru změníme, aby bylo v adresáři zaloha 22
Pokračování z minulého slajdu
Příklad: Smazání souborů Projdeme okopírované soubory
Smažeme adresář
Jan Lánský
Soubor smažeme
Úvod do programování 8. hodina
Absolutní cesty k souborům vypíšeme na obrazovku
23
Zpětná vazba
Objevili jste ve slajdech chyby?
Nechápete nějaký slajd?
Je příliš obtížný, nesrozumitelný?
Máte nějaký nápad na vylepšení? Anonymní formulář
Včetně pravopisných
Odeslání za pár vteřin
http://goo.gl/forms/WxkZqBsZLs
Jan Lánský
Úvod do programování 8. hodina
24