Základy programování 4 - C# 2. cvičení Radek Janoštík Univerzita Palackého v Olomouci 19.2.2019 Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 19.2.2019 1 / 19
Reakce na úkoly (1/3) bool vs. Boolean (vs. Java) Rozdělení tříd do souborů Array.Equals vs. Enumerable.SequenceEqual Zbytečné if if (t1.one == t2.one && t1.two == t2.two && t1.three == t2.three) { return true; else { return false; vs. return t1.one == t2.one && t1.two == t2.two && t1.three == t2.three Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 19.2.2019 2 / 19
Reakce na úkoly (2/3) Pozor na rozdíl mezi & a && Příklad: int value = 5; bool success = (value == 6) & DoSomething(); bool success2 = (value == 6) && DoSomething(); public static bool DoSomething() { LaunchMissilesToOlomouc(); return true; Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 19.2.2019 3 / 19
Reakce na úkoly (3/3) Rozhranní IComparable je v.net nevytvářet vlastní: public interface IComparable { int CompareTo(Tuple obj); Příliš agresivní CompareTo public int CompareTo(object other){ if (this < (Tuple) other) return -1; else if (this == other) return 0; else return 1; Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 19.2.2019 4 / 19
Třída DirectoryInfo (1/2) DirectoryInfo di = new DirectoryInfo("E:\\1\\"); Pozor! zadaná cesta v konstruktoru nemusí existovat Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 19.2.2019 5 / 19
Třída DirectoryInfo (2/2) Metody pro výčet souborů a složek: EnumerateFiles(), EnumerateDirectories() Vs. pro vrácení seznamu soborů/složek GetFiles(), GetDirectories() Enum FileAttributes Archive, Compressed, Device, Directory, Encrypted, Hidden, IntegrityStream, Normal, NoScrubData, NotContentIndexed, Offline, ReadOnly, ReparsePoint, SparseFile, System, Temporary Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 19.2.2019 6 / 19
Třída FileInfo FileInfo fi = new FileInfo("E:\\1\\test.txt"); Atributy stejný význam jako u DirectoryInfo Metody pro vytváření, mazání, zápis (viz. dále) Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 19.2.2019 7 / 19
Třída DriveInfo Statická metoda GetDrives() vrací pole DriveInfo[] s informacemi od discích DriveInfo diske = new DriveInfo("E:\\"); Enum DriveType: CDRom, Fixed, Network, NoRootDirectory, Ram, Removable, Unknown Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 19.2.2019 8 / 19
Čtení obsahu souboru Statická třída File Načtení celého obsahu do stringu FileInfo f = new FileInfo(@"E:\1\test.txt"); if (f.exists) { string str = File.ReadAllText(f.FullName); Načtení celého obsahu do pole řádků FileInfo f = new FileInfo(@"E:\1\test.txt"); if (f.exists) { string[] array = File.ReadAllLines(f.FullName); Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 19.2.2019 9 / 19
Proudy (stream) Obecný mechanismus pro čtení/zápis dat od někud někam I Z venku do našeho programu! čtení z proudu I Z našeho programu někam! zápis do proudu Abstrakce stejný přístup pro různé zdroje a cíle např. I Sít I Soubor I Pamět I... Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 19.2.2019 10 / 19
Čtení souboru pomocí proudů FileInfo f = new FileInfo(@"E:\1\test.txt"); if (f.exists) { StreamReader sr = null; try { sr = f.opentext(); string s = ""; while ((s = sr.readline())!= null) { Console.WriteLine(s); catch (Exception e) { Console.WriteLine("Chyba pri cteni souboru"); finally { if (sr!=null) { sr.close(); Případně using (StreamReader sr = new StreamReader(@"E:\1\test.txt")) {... Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 19.2.2019 11 / 19
Zápis do souboru (1/4) Vytvoření souboru vrací stream File.Create(path); Zápis StreamWriter sw = null; try { sw = new StreamWriter(File.Create(@"E:\1\test2.txt")); for (int i = 0; i < 10; i++) { sw.writeline($"line {i"); catch (Exception e) { Console.WriteLine("Zapis souboru selhal"); finally { if (sw!=null) { sw.close(); Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 19.2.2019 12 / 19
Zápis do souboru (2/4) Komprimovaný soubor pouhé přidání GZipStream StreamWriter sw = null; try { GZipStream gzs = new GZipStream(File.Create(@"E:\1\test2.gzip"), CompressionLevel.Op sw = new StreamWriter(gzs); for (int i = 0; i < 10; i++) { sw.writeline($"line {i"); catch (Exception e) { Console.WriteLine("Zapis souboru selhal"); finally { if (sw!=null) { sw.close(); Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 19.2.2019 13 / 19
Zápis do souboru (3/4) binární vs. textový zápis Jak efektivně zapsat sekvenci jedniček a nul Co udělá: sw.writeline($"1110001001000"); Výsledkem je správně řetězec jedniček a nul, ale s velikostí 15B Proč? Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 19.2.2019 14 / 19
Zápis do souboru (4/4) binární Lze použít BinaryWriter https://docs.microsoft.com/en-us/dotnet/api/ system.io.binarywriter?view=netframework-4.7.2 Zapisuje se pak binárně, nikoliv textově Soubor pak nepůjde číst klasicky (textový editor zobrazí rozsypaný čaj ) Je to ale efektivněší, ale režie je na vás (oddělovače, přesný formát, počítání bajtů) BinaryWriter sw = null; try { sw = new BinaryWriter(File.Create(@"C:\cs\test2.txt")); sw.write(0b1110001001000); Vyzkoušejte třeba sw.write(0.33f); vs. sw.write(0.33); Bude nějaký rozdíl? Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 19.2.2019 15 / 19
Úkol (1/3) Naprogramovat jednoduchou příkazovou řádku s příkazy: I drives vypíše seznam disků s jejich jménem, velikostí a volným místem I dir vypíše seznam adresářů a souborů s datem jejich vytvoření, velikostí(u souborů) a názvem I cd adresar změní současný adresář na zadaný Navrhnout třídu BinaryMatrix, která bude efektivně reprezentovat binární matici Naprogramovat metody WriteMatrix a ReadMatrix pro efektivní uložení a načtení matice ze souboru Vhodně ošetřete vstupy a výstupy Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 19.2.2019 16 / 19
Úkol (2/3) Náznak volání > zadejte počáteční adresář: C:\test[enter] C:\test> C:\test>cd test2[enter] C:\test\test2>dir[enter] Directory of C:\test\test2 03.12.2016 19:14 <DIR> app 07.11.2007 07:00 17 734 test.txt 07.11.2007 07:00 45 123 test2.pdf C:\test\test2>exit[enter] Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 19.2.2019 17 / 19
Úkol (3/3) Příklad volání BinaryMatrix matrix = BinaryMatrix.ReadMatrix(path); Console.WriteLine(matrix); matrix.set(2,1,0); Console.WriteLine(matrix); matrix.writematrix(path); Výstup 1 1 0 0 1 0 1 1 1 1 1 0 0 1 0 1 0 1 Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 19.2.2019 18 / 19