21:17 -!- mode/#wyklady [+m] by Gynvael 21:17 <@Gynvael> ok 21:17 <@Gynvael> witam wszystkich na czesci 10siatej mojego wykladziku dot. jezyka C 21:17 <@Gynvael> dzisiaj ciag dalszy zapisu/odczytu plikow 21:17 <@Gynvael> ostatnio bylo duzo teorii, dzisiaj w sumie same przyklady 21:17 <@Gynvael> przykladow mam 7 21:18 <@Gynvael> po kazdym omowionym bedzie czas jak zwykle na pytanka 21:18 -!- Topic for #wyklady: PERL: #1 - piatek 20:00 (wstep, by mulander) | C: #10 - sroda 21:00 (cd obslugi plikow) | ASM: #2 - poniedzialek 21:00 (linux+nasm) (log z #1 http://gynvael.vexillium.org/wyklad.log) || logi na: http://progsman.webd.pl/adami/gynkurs/ | lista zadan z C: http://gynvael.vexillium.org/lista.txt (G0blin prowadzi, 800 pkt, drugi phoenix__, 675 pkt) | komentarze slac na gynvael@vexillium.org 21:18 -!- Topic set by Gynvael [~gynvael@shine.bright.morning.light] [Tue Sep 20 17:33:11 2005] 21:18 <@Gynvael> najpierw jeszcze przypomne ze w piatek pierwsza czesc wykladu z PERLa (prowadzi mulander) 21:18 <@Gynvael> a w poniedzialek czesc druga mojego wykladu z assemblera 21:18 <@Gynvael> ok 21:18 <@Gynvael> wiec lecimy 21:19 <@Gynvael> http://gynvael.vexillium.org/dane.txt 21:19 <@Gynvael> sciagnijcie sobie ten plik 21:19 <@Gynvael> tam jest troche danych tekstowych 21:19 <@Gynvael> a dokladneij jakas tam (pelna kotow) przykladowa tabelka 21:19 <@Gynvael> fragment wkleje: 21:19 <@Gynvael> IMIE NAZWISKO WIEK 21:19 <@Gynvael> -------------------------- 21:19 <@Gynvael> Ala Makota 20 21:19 <@Gynvael> Kot Maale 21 21:20 <@Gynvael> ok 21:20 <@Gynvael> teraz tak 21:20 <@Gynvael> normalny czlowiek spojrzy i zobaczy 3 kolumny 21:20 <@Gynvael> IMIE, NAZWISKO i WIEK 21:20 <@Gynvael> i dane w nich 21:20 <@Gynvael> programista powinien troche bardziej zaglebic sie w strukture tego slowa 21:20 <@Gynvael> (wiecej o ty mbedzie na nastepnym wykladzie, o parsingu) 21:20 <@Gynvael> *o tym 21:20 <@Gynvael> czyli 21:21 <@Gynvael> dla programisty 2 pierwsze linie to w sumie komentarze 21:21 <@Gynvael> bo one do niczego sa niepotrzebne 21:21 <@Gynvael> a nastepnie format kazdej linii jest taki 21:21 <@Gynvael> na poczatku jest string, potem troche spacji/tabow 21:21 <@Gynvael> potem znowu string 21:21 <@Gynvael> potem spacje 21:21 <@Gynvael> i na koncu liczba 21:22 <@Gynvael> ok 21:22 <@Gynvael> spojrzmy najpierw na prosty program 21:22 <@Gynvael> ktory po prostu wyswietli ten plik 21:22 <@Gynvael> linia po linii 21:22 <@Gynvael> http://gynvael.vexillium.org/wyswietl.c 21:23 <@Gynvael> kompiluje sie ofc: gcc wyswietl.c -o wyswietl -Wall -pedantic 21:24 <@Gynvael> teraz tak 21:24 <@Gynvael> co ten program w zasadzie robi od strony kodu 21:24 <@Gynvael> FILE *f <=- o tym mowilem na poprzednim wykladzie 21:24 <@Gynvael> char linia[256]; <=- deklaracja tablicy 256 charow 21:24 <@Gynvael> (czyli sliczne miejsce na przechowanie linii) 21:24 <@Gynvael> potem jest otwarcie pliku 21:24 <@Gynvael> f = fopen("dane.txt", "r"); 21:25 <@Gynvael> "dane.txt" to plik, "r" to tryb (read, pod winda read text) 21:25 <@Gynvael> przypomne ze fopen zwraca tzw "handle" pliku (uchwyt, takie ladne slangowe slowo) 21:25 <@Gynvael> a dokladniej pointer na strukturke FILE 21:25 <@Gynvael> jesli plik z jakiegos powodu sie nie otworzy 21:26 <@Gynvael> np nie ma go, nie ma praw odczytu, jest zablokowany albo jest "dane.txt" to katalog 21:26 <@Gynvael> wtedy fopen zwroci NULL 21:26 <@Gynvael> to tez jest sprawdzone w nastepnej linijce 21:26 <@Gynvael> czyli jesli nie da sie otworzyc - wyswietl komunikat i idz sobie (return 1) 21:26 <@Gynvael> potem jest petla 21:27 <@Gynvael> while(fgets(linia, sizeof(linia), f) != NULL) 21:27 <@Gynvael> printf("%s", linia); 21:27 <@Gynvael> warunkiem petli jest to ze fgets() zwroci cos innego niz NULL 21:27 <@Gynvael> wypada wiedziec (lub sprawdzic - man fgets) ze fgets zwraca zazwyczaj swoj pierwszy argument 21:28 <@Gynvael> a NULL zwraca jesli plik sie skonczy (tj juz wszystko zostalo odczytane 21:28 <@Gynvael> co robi fgets ? (bylo ostatnio) odczytuje jedna linie, max sizeof(linia) znakow, z pliku "f" (lacznie z \n) 21:28 <@Gynvael> tak ze pierwsza linie mozna przetlumaczyc: 21:29 <@Gynvael> "dopoki udala sie odczytac linie" 21:29 <@Gynvael> druga linia - blok kodu petli - printf("%s", linia) to po prostu wypisanie tej linii na ekran 21:30 <@Gynvael> czyli cala petla wypisuje linia po linii plik na ekran 21:30 <@Gynvael> uzylem printf zamiast puts, bo puts dodaje \n na koniec (tj przechodzi na koneic linii) 21:30 <@Gynvael> a jest to zbedne, jako ze fgets odczytuje \n z pliku tez 21:30 <@Gynvael> k 21:30 <@Gynvael> fclose(f); zamyka plik 21:31 <@Gynvael> dodam tutaj ze zdarza sie popelnic blad 21:31 <@Gynvael> poniewaz fclose(f) nei zmienia wartosci "f" 21:31 <@Gynvael> zdarzyc sie moze nastepujaca sytuacja (mi sie zdarzylo) 21:31 <@Gynvael> FILE *a, *b; 21:31 <@Gynvael> a = fopen("jakis.plik", "w"); 21:31 <@Gynvael> fclose(a); 21:31 <@Gynvael> b = fopen("inny.plik", "w"); 21:32 <@Gynvael> moze sie zdarzyc (czesto sie zdarza) 21:32 <@Gynvael> ze a == b w tym momencie (wskazuja na to samo miejsce w pamieci 21:32 <@Gynvael> i programista nie swiadom niczego zrobi 21:32 <@Gynvael> fprintf(a,"asdf"); 21:32 <@Gynvael> i bedzie sie dziwil czemu nie ma bledu, wszystko dziala, "a u kolegi sie sypie" ;p 21:32 <@Gynvael> w sumie dobrym pomyslem jest robienie przy wiekszych projektach 21:32 <@Gynvael> fclose(f); f = NULL; 21:33 <@Gynvael> to zapobiegnie bledom 21:33 <@Gynvael> ok 21:33 <@Gynvael> tyle o tym przykaldzie 21:33 -!- mode/#wyklady [-m] by Gynvael 21:33 <@Gynvael> pytania ? 21:33 <@mulander> tak 21:33 <@mulander> czy istnieje mozliwosc sprawdzenia jaki blad dokladnie przekazuje system do programu przy nieudanym otwarciu pliku ? 21:33 < phoenix_> co sie stanie jak sie nie zamknie plku? 21:34 -!- sulfur [~sulfur@213.199.204.33] has joined #wyklady 21:34 <@Gynvael> mulander: jest globalna zmienna errno, ona zawiera kod bledu 21:34 < sulfur> witam 21:34 < sulfur> duzo sie spoznilem ? 21:34 < sulfur> ;] 21:34 <@Gynvael> mulander: mozna zrobic perror("costam"); (dokladnie tak), i wtedy dostaniemy opis ostatniego bledu 21:34 <@Gynvael> sulfur: jak w topicu ;> 21:34 <@mulander> np. Permission denied ? 21:34 <@Gynvael> mulander: yep 21:35 < sulfur> looo 21:35 <@Gynvael> phoenix_: to zalezy 21:35 < sulfur> przesadzilem 21:35 < G0blin> Gynvael: dlaczego sie robi tak jak powiedziales? 21:35 < sulfur> Gynvael: mam nadzieje ze sie wytlumaczysz ze info do mnie nie dotarlo ;ppp 21:35 <@Gynvael> phoenix_: pod linuxem/winNT jak otworzysz jeden plik w programie etc, to nic 21:35 < G0blin> powiedziales jak temu zapobiedz, ale nie powiedziales czemu :] 21:35 <@Gynvael> phoenix_: pod win9x AFAIC po odpaleniu 100 razy tego programu byc juz nic nie otworzyl ;p 21:35 < G0blin> zapobiec* 21:36 <@Gynvael> phoenix_: natomiast jesli duzo plikow w jednym programie otwierasz, i ich nie zamykasz, to system ci nie pozwoli w pewnym momencie wiekszej ilosci otworzyc dopooki ktoregos nie zamkniesz 21:36 <@Gynvael> G0blin: tzn ? 21:36 <@Gynvael> sulfur: hehehe ty to wiesz co ja tu mowie ;p 21:36 <@Gynvael> sulfur: noo przynajmniej z C 21:36 <@Gynvael> ;> 21:36 <@Gynvael> G0blin: -=213204=- <@Gynvael> moze sie zdarzyc (czesto sie zdarza) 21:36 <@Gynvael> -=213213=- <@Gynvael> ze a == b w tym momencie (wskazuja na to samo miejsce w pamieci 21:36 <@Gynvael> -=213221=- <@Gynvael> i programista nie swiadom niczego zrobi 21:36 <@Gynvael> -=213228=- <@Gynvael> fprintf(a,"asdf"); 21:36 <@Gynvael> -=213239=- <@Gynvael> i bedzie sie dziwil czemu nie ma bledu, wszystko dziala, "a u kolegi sie sypie" ;p 21:36 <@Gynvael> G0blin: o to ci chodzi ? 21:37 < phoenix_> Gynvael: czemu sie nie odpali ? 21:37 < G0blin> rak 21:37 < G0blin> o to 21:37 < G0blin> tak* 21:37 <@Gynvael> phoenix_: ee co sie nie odpali, zgubilem sie ;> 21:37 <@Gynvael> G0blin: ;p to mowilem 21:37 <@Gynvael> ;p 21:37 < phoenix_> Gynvael: plik jak sie go 100 razy otworzy bez fclose() 21:38 < G0blin> -=213213=- <@Gynvael> ze a == b w tym momencie (wskazuja na to samo miejsce w pamieci 21:38 < G0blin> ale czemu?? :> 21:38 < sulfur> hm 21:38 < sulfur> wolniej 21:38 <@Gynvael> ok 21:38 < sulfur> nie nadazam 21:38 < sulfur> ;] 21:38 <@Gynvael> odpowiem wam obu na pytanie 21:38 <@Gynvael> bo to w sumie ta sama odpowiedz 21:38 <@Gynvael> ale to na +m 21:38 < G0blin> :] 21:38 <@Gynvael> zaraz zdejme na chwile jeszcze ;> 21:38 -!- mode/#wyklady [+m] by Gynvael 21:38 <@Gynvael> ok 21:38 <@Gynvael> wiec tak 21:39 <@Gynvael> system operacyjny pozwala kazdemu programowi otworzyc konkretna liczbe plikow (np 64) 21:39 <@Gynvael> wiecej nie pozwala (chyba ze program ma jakies specialne przywileje) 21:39 <@Gynvael> tj otworzyc na raz 21:39 <@Gynvael> to jest jedna sprawa 21:39 <@Gynvael> czyli jesli otwieramy pliki 21:39 <@Gynvael> i ich nie zamykamy 21:39 <@Gynvael> to po otwrciu 64 plikow 21:39 <@Gynvael> nastepnego juz nie otworzymy 21:40 <@Gynvael> bo system nie pozwoli 21:40 <@Gynvael> ;> 21:40 <@Gynvael> to takie anty-abuse zabespieczenie 21:40 <@Gynvael> zeby ktos systemu nie spowolnil/wywalil 21:40 <@Gynvael> druga sprawa jest to 21:40 <@Gynvael> ze niektooore stare systemy 21:40 <@Gynvael> nie zamykaly plikow po procesie (tj jesli on ich nie zamknal) 21:40 <@Gynvael> (te nowe juz czyszcza po procesach) 21:41 <@Gynvael> a jako ze kazde otwarcie pliku wiaze sie z zaalokowaniem niewielkiej ilosci pamieci (na jakies tam systemowe smieci dot plikow) 21:41 <@Gynvael> to po pewnym czasie (tj po pewnej ilosci neizamknietych plikow) 21:41 <@Gynvael> systemowi konczyla sie pamiec 21:42 <@Gynvael> czyli Not Enough Mem, plz reboot or BSoD 21:42 <@Gynvael> ;> 21:42 <@Gynvael> teraz tak 21:43 <@Gynvael> fopen alokuje kawalek pamieci 21:43 <@Gynvael> nie chce sklamac z ktorego regionu 21:43 <@Gynvael> powiem ze pod winda z zupelnie innego niz malloc, i to nie ze stosu ;> 21:43 <@Gynvael> fclose ta pamiec uwalnia 21:43 <@Gynvael> zalooozmy na chwile (to calkiem dobre zalozenie) 21:44 <@Gynvael> ze system-libc ma liste wolnych blokow FILE 21:44 <@Gynvael> [FILE1] [FILE2] 21:44 <@Gynvael> jak cos jest alokowane, to pierwsze z listy 21:44 <@Gynvael> czyli np [FILE1] 21:44 <@Gynvael> a jak cos jest uwalniane (fclose) to jest wrzucane na poczatek listy 21:44 <@Gynvael> niech FILE1 ma adres 4, a FILE2 ma adres 24 21:45 <@Gynvael> [4:FILE1] [24:FILE2] 21:45 <@Gynvael> robimy teraz tak: 21:45 <@Gynvael> FILE *a, *b; 21:45 <@Gynvael> a = fopen("ala.txt", "w"); 21:45 <@Gynvael> a = 4 (czyli pokazuje na FILE1) 21:45 <@Gynvael> i FILE1 znika z listy 21:45 <@Gynvael> lista: [24:FILE2] 21:45 <@Gynvael> teraz robimy fclose 21:45 <@Gynvael> lista: [4:FILE1] [24:FILE2] 21:46 <@Gynvael> a NADAL == 4, nic nie zmienialo wartosci "a" 21:46 <@Gynvael> i teraz b... 21:46 <@Gynvael> b = fopen("xxx.www", "w"); 21:46 <@Gynvael> pierwsze z listy 21:46 <@Gynvael> czyli [4:FILE1] 21:46 <@Gynvael> lista: [24:FILE2] 21:46 <@Gynvael> b = 4 (czyli FILE1) 21:46 <@Gynvael> a == b w tym momencie 21:46 <@Gynvael> mimo ze plik "ala.txt" zostal zamkniety 21:47 <@Gynvael> czyli fprintf(a, "ala ma kota"); 21:47 <@Gynvael> zapisze do pliku "xxx.www" 21:47 <@Gynvael> a programista mogl pomyslec dwie rzeczy: 21:47 <@Gynvael> tzn pomylic: 21:47 <@Gynvael> - "a" zamiast "b" w fprintf 21:47 <@Gynvael> - za wczesnie fclose(f) 21:47 <@Gynvael> w obu przypadkach jesli szuka bledu, to go znajdzie 21:47 <@Gynvael> ale jesli nie 21:47 <@Gynvael> to program u niego moze dzialac 21:48 <@Gynvael> a zalozmy ze pojdzie gdzies do kolegi 21:48 <@Gynvael> skompiluje 21:48 <@Gynvael> a kolegi system nie powiedzmy ze po fclose() wrzuca na koneic listy 21:48 <@Gynvael> czyli przy fprintf(a,... sie po prostu wywali, bo FILE1 nie bedize uzywane 21:48 <@Gynvael> ok 21:48 <@Gynvael> sprawdzmy teraz na linie i windzie jeszcze czy zdarzyc sie moze 21:48 <@Gynvael> taka sytuaccja 21:49 <@Gynvael> ze po zamknieciu, nastepne otwarcie dostanie ten sam adres-FILE 21:49 <@Gynvael> FILE *f; 21:49 <@Gynvael> f = fopen("xxx.www", "wb"); 21:49 <@Gynvael> printf("1) %p\n", (void*) f); 21:49 <@Gynvael> fclose(f); 21:49 <@Gynvael> f = fopen("yyy.aaa", "wb"); 21:49 <@Gynvael> printf("2) %p\n", (void*) f); 21:49 <@Gynvael> fclose(f); 21:50 <@Gynvael> taki programik testuje 21:50 <@Gynvael> najpierw win98 21:50 <@Gynvael> 21:55:48 LiTeStEp D:\code\gynvael\quest4elite\wyklad\c_10>asdf 21:50 <@Gynvael> 1) 7803B6D0 21:50 <@Gynvael> 2) 7803B6D0 21:50 <@Gynvael> jak widac zdarzylo sie dokladnie to o czym mowilem 21:50 <@Gynvael> adresy sa takie same 21:50 <@Gynvael> teraz linux (rh, 2.4) 21:50 <@Gynvael> gynvael@localhost:gynvael> ./a.out 21:50 <@Gynvael> 1) 0x8049720 21:50 <@Gynvael> 2) 0x8049720 21:50 <@Gynvael> jak widac tez tak jest 21:51 <@Gynvael> coz, na NT nie sprawdze bo starsza ma lapa wylaczonego i sie nie moge polaczyc ;pppp 21:51 <@Gynvael> ok 21:51 <@Gynvael> tyle 21:52 -!- mode/#wyklady [-m] by Gynvael 21:52 <@Gynvael> pytania ? 21:53 < phoenix_> jak beda 2 pliki otwarte to jak bedzie? 21:53 <@Gynvael> to beda inne adresy ofc 21:53 < sulfur> Gynvael: jak to jest lekcja perl to po co im wykladasz taka niskopoziomowke ? 21:54 < sulfur> perl jest chyba pol-auto-magiczny nie ? 21:54 <@mulander> sulfur to nie o perl :P 21:54 < G0blin> sulfur: topic przeczytaj 21:54 < G0blin> tylko uwaznie :P 21:54 <@Gynvael> sulfur: topic... 21:54 <@mulander> btw gynvael ja mam pytanie innej natury :P 21:54 <@Gynvael> sulfur: dzisiaj jest sroda ... 21:54 <@Gynvael> sulfur: czyli C 21:54 <@mulander> tylko niewiem czy mozesz tutaj na nie odpowiedziec bo z C jest tylko spokrewnione. 21:54 < sulfur> ahhh 21:54 <@Gynvael> sulfur: a PERL jest mulander'a po za tym 21:54 < sulfur> a to dobrze ;] 21:55 < sulfur> sory 21:55 <@Gynvael> mulander: pytaj sie 21:55 <@Gynvael> mulander: najwyzej cie zabanuje 21:55 <@Gynvael> mulander: joke 21:55 <@Gynvael> ;ppppp 21:55 <@mulander> :) 21:55 <@mulander> sprawa jest taka perl korzysta z biblioteki C do operacji na plikach 21:55 <@Gynvael> yep 21:56 <@mulander> wlasnie testowalem w ten sam sposob. 21:56 <@Gynvael> i ? 21:56 <@mulander> na lin i win czy ten problem rowniez wystepuje. 21:56 <@mulander> wiec jezeli korzysta on z tej samej biblioteki to dlaczego w perlu to nie wystepuje ? 21:56 <@Gynvael> mulander: bo perl owszem korzysta z tego 21:56 <@Gynvael> mulander: ale ma wlasne funkcje do tego ktore sprawdzaja jeszcze 10 rzeczy po kolei 21:57 <@Gynvael> mulander: dlatego perl jest bardziej wysokopoziomowy niz C ;p bo w perlu to jest zrobione za ciebie 21:57 <@Gynvael> ;> 21:57 < sulfur> bo jest pol-auto-magiczny ;] 21:57 < G0blin> :] 21:57 <@Gynvael> ok 21:57 <@Gynvael> jeszcze jakies pytanka ? 21:58 <@mulander> tak. 21:58 <@mulander> z jak patrze na te wyniki z adresami. 21:59 [Users #wyklady] 21:59 [@Gynvael ] [ furiosan_] [ m4shed ] [ phoenix_ ] [ unknow] 21:59 [@mulander] [ G0blin ] [ Nekrataal] [ rainrider] 21:59 [ Blizzard] [ jarekj ] [ phoe ] [ sulfur ] 21:59 -!- Irssi: #wyklady: Total of 13 nicks [2 ops, 0 halfops, 0 voices, 11 normal] 21:59 <@mulander> to nasuwa mi sie pytanie, ile tej niewiem czy moge to tak nazwac :P pamieci, rezerwuje system dla operacji na pliku ? 21:59 <@Gynvael> mulander: a wiesz ze nie wiem ? ;pppppp 21:59 < G0blin> mulander: gyn nie wie gdzie ona jest 21:59 < G0blin> a ma wiedziec ile? :> 21:59 <@Gynvael> libc rezerwuje sizeof(FILE) (to z 20 bajtow) 21:59 -!- jarekj [angel@83.16.2.198] has quit [Client Quit] 21:59 <@Gynvael> ile system to nei wiem ;> serio ;> 21:59 < G0blin> a btw: 22:00 < G0blin> teraz Gynvael jest Gynvael-san :] 22:00 <@Gynvael> G0blin: ne, teraz jest Gynvael-sensei ;> 22:00 <@Gynvael> ;ppp 22:00 <@Gynvael> jesli chodzi o scislosc 22:00 < G0blin> a no tak :P 22:00 <@Gynvael> ale nvm 22:00 < G0blin> :/ 22:00 -!- L0nger [~nictuniem@tz82.internetdsl.tpnet.pl] has joined #wyklady 22:00 <@Gynvael> ok 22:00 <@Gynvael> lecimy dalej 22:00 < L0nger> hi :P 22:00 -!- mode/#wyklady [+m] by Gynvael 22:00 <@Gynvael> hi L0nger ;> 22:00 <@Gynvael> teraz przyklad drugi 22:01 <@Gynvael> http://gynvael.vexillium.org/przeformatuj.c 22:01 <@Gynvael> btw L0nger ty sciagnij jeszcze 22:01 <@Gynvael> http://gynvael.vexillium.org/dane.txt 22:01 -!- L0nger is now known as lngr_ok 22:01 <@Gynvael> ok 22:01 <@Gynvael> wiec tak 22:01 -!- lngr_ok is now known as L0nger 22:01 <@Gynvael> kompilacja - wiadomo 22:02 <@Gynvael> po odpaleniu dostaje sie dane sformatowane tak: 22:02 <@Gynvael> 20 = [ Makota Ala ] 22:02 <@Gynvael> 21 = [ Maale Kot ] 22:02 <@Gynvael> 22 = [ Noalice Neko ] 22:02 <@Gynvael> 23 = [ Noneko Alice ] 22:02 <@Gynvael> 24 = [ Tokot Ala ] 22:02 <@Gynvael> 25 = [ Toala Kot ] 22:02 <@Gynvael> czemu tak dziwnie ? bo to dla nas bez znaczenia jak ;p 22:02 <@Gynvael> tylko wazne "jak dziala" ;p 22:02 <@Gynvael> ok 22:02 <@Gynvael> teraz jak to cudo dziala 22:02 <@Gynvael> po kolei 22:02 <@Gynvael> FILE *f; 22:02 <@Gynvael> char imie[32], nazwisko[32]; 22:02 <@Gynvael> int wiek; 22:03 <@Gynvael> pare deklaracji, znane juz "f", 2x tablice charow imie i nazwisko 22:03 <@Gynvael> i int na wiek 22:03 <@Gynvael> potem jest otwarcie pliku + sprawdzneie bledu 22:03 <@Gynvael> jak w poprzednim przykladzie 22:03 <@Gynvael> potem jest pominiecie dwoch pierwszych linii 22:03 <@Gynvael> /* pomin pierwsze dwie linie */ 22:03 <@Gynvael> while(!feof(f) && fgetc(f) != '\n'); 22:03 <@Gynvael> while(!feof(f) && fgetc(f) != '\n'); 22:03 <@Gynvael> w sumie jest to srednio-ladna metoda 22:03 <@Gynvael> ale ma swoje zalety (i wady) 22:04 <@Gynvael> ok 22:04 <@Gynvael> co to jest w tym while 22:04 <@Gynvael> !feof(f) 22:04 <@Gynvael> f end of file(f) 22:04 <@Gynvael> dopoki nie natkniemy sie na koneic pliku 22:04 <@Gynvael> tak mozna ta instrukcje odczytac 22:04 -!- Nekrataal is now known as Nekrataal^aw 22:04 <@Gynvael> z tym ze taka mala uwaga 22:04 <@Gynvael> feof bedzie zwracal wartosc niezerowa (czyli ebdzie zwracal ze koniec pliku) 22:05 <@Gynvael> po tym jak BEDZIEMY PROBOWALI ODCZYTAC COS Z KONCA PLIKU 22:05 <@Gynvael> czasami w niektorych tutorkach jest przyklad kopiowania plikow w ktorym autor o tym nie wiedzial 22:05 <@Gynvael> i pliki sa po prostu zle kopiowane (ostatni bajt jest dwa razy skopiowany) 22:05 <@Gynvael> coz ;> 22:05 <@Gynvael> ale nvm 22:05 <@Gynvael> && fgetc(f) != '\n' 22:06 <@Gynvael> fgetc odczytuje jeden znak (char) z pliku 22:06 <@Gynvael> i go zwraca (jako inta, ale nvm) 22:06 <@Gynvael> czyli ta linie mozna przetlumaczyc jako 22:06 <@Gynvael> "dopoki nei bedzie konca pliku i nie natkniemy sie na koniec linii" 22:06 <@Gynvael> czyli "idz jeden znak za koneic linii" ;p 22:06 <@Gynvael> jakie sa wady tego ? 22:07 <@Gynvael> to jest najzwyczajniej w swiecie wolne ;> 22:07 <@Gynvael> jesli linia by miala 1 gb, to bysmy do za miesiac czekali az przejdzie do nastepnej 22:07 <@Gynvael> na szczescie nasza ma tylko 40 znakow wiec looz ;> 22:07 <@Gynvael> inna metoda moglo by byc np stworzenie buforka 1000 znakow i zrobienie 22:07 <@Gynvael> fgets(buforek, 1000, f); 22:07 <@Gynvael> i tyle 22:07 <@Gynvael> ;> 22:07 <@Gynvael> 2x ofc ;> 22:08 <@Gynvael> to bylo by szybsze 22:08 <@Gynvael> ale nie zadzialalo by jesli linia by miala wiecej niz 1000 znakow 22:08 <@Gynvael> np 1001 znakow 22:08 <@Gynvael> ofc mozna ustawic buforek zeby mial 10000 znakow 22:08 <@Gynvael> ale wtedy co jesli linia bedzie miala 10001 znakow ?;p 22:08 <@Gynvael> etc ;> 22:08 <@Gynvael> mozna to zrobic jeszcze w ladniejszy - bardziej zoptymalizowany sposob 22:08 <@Gynvael> ale jest on odrobinke bardziej skomplikowany 22:09 <@Gynvael> dlatego podam go tylko teoretycznie ;> 22:09 <@Gynvael> wiec caly pomysl polega na odczytaniu np 1000 znakow z pliku 22:09 <@Gynvael> do pamieci 22:09 <@Gynvael> po czym w pamieci szukamy '\n' a potem drugiego '\n' 22:09 <@Gynvael> jesli nie znajdziemy, odczytujemy kolejne 1000 znakow 22:09 <@Gynvael> a jesli tak, to stwierdzamy ktory to byl znak (np 450) i cofamy plik o (1000-450) znakow (za pomoca fseek, bylo ostatnio) 22:10 <@Gynvael> taka metoda byla by najszybsza (z uwagi na to ze malo wywolan funkcji i malo odczytow z pliku jest) 22:10 <@Gynvael> ogolnie zasada optymalizacji operacji na plikach jest taka: 22:10 <@Gynvael> odczytuj duzo, zapisuj duzo 22:10 <@Gynvael> dzieki temu glowica latajaca po dysku nei zmeczy sie co chwile lecac do naszego pliku, lecac do innego (bo ja OS poprosi), lececac do naszego etc 22:10 <@Gynvael> tylko raz tam poleci, zapisze/odczyta duzo, i juz 22:11 <@Gynvael> ok 22:11 <@Gynvael> tyle o tych dwoch liniach ;ppp 22:11 <@Gynvael> while(fscanf(f, "%32s %32s %i\n", imie, nazwisko, &wiek) == 3) 22:11 <@Gynvael> printf( "%3i = [ %s %s ]\n", wiek, nazwisko, imie); 22:11 <@Gynvael> to jest przeformatowanie 22:11 <@Gynvael> jak to dziala ? 22:11 <@Gynvael> tam jest funkcja fscanf 22:11 <@Gynvael> ostatnio o niej bylo malo 22:11 <@Gynvael> teraz powiem troche wiecej 22:11 <@Gynvael> fscanf dziala odwrotnie do printf 22:11 <@Gynvael> o ile printf wypisywal cos SFORMATOWANEGO 22:11 <@Gynvael> to (f)scanf odczytuje cos SFORMATOWANEGO 22:12 <@Gynvael> fscanf(plik, FORMAT, POINTERY,DO,MIEJSC,GDZIE,ZAPISAC,POSZCZEGOLNE,POLA) 22:12 <@Gynvael> rzucmy okiem na to fscaf z przykladu 22:12 <@Gynvael> f to ofc handle pliku 22:12 <@Gynvael> "%32s %32s %i\n" 22:12 <@Gynvael> co to by znaczylo w printf ? 22:12 <@Gynvael> ze mamy 3 pola, string o wielkosci 32 znaki, kolejny taki string, i liczbe 22:13 <@Gynvael> w scanf to znaczy prawie to samo 22:13 <@Gynvael> znaczy to dokladnie: 22:13 <@Gynvael> sa 3 pola, pierwszy jest string MAKSYMALNIE O WIELKOSCI 32 znaki (string dla niego to wszystko co nie jest spacja) 22:13 <@Gynvael> potem jest NIEOKRESLONA LICZBA SPACJI (czyli jedna lub wiecej) 22:13 <@Gynvael> potem jest znowu string o wielkosci max 32 znaki 22:13 <@Gynvael> potem znowu spacje 22:13 <@Gynvael> potem liczba, i na koncu koniec linii 22:14 <@Gynvael> (z tym ze scanf dosc luzno traktuje \n ;p czasem ignoruje etc) 22:14 <@Gynvael> potem mamy 3 pointery 22:14 <@Gynvael> imie, nazwisko, &wiek 22:14 <@Gynvael> imie i nazwisko to ofc nazwy tablicy, czyle de facto pointery na pierwsze elementy tablic 22:14 <@Gynvael> wiec referencja (&) jest zbedna 22:15 <@Gynvael> (niektorzy programisci mimo wszystko przy tablicach ja pisza.. ja tego natomiast nie polecam, z uwagi na to ze nazwa tablicy jest jednak pointerem, i nie nalezy jej traktowac jak zmiennej) 22:15 <@Gynvael> wiek jest intem, wiec &wiek jest pointerem do inta 22:15 <@Gynvael> == 3) 22:15 <@Gynvael> potem mamy ==3 22:15 <@Gynvael> co zwraca fscanf ? zwraca LICZBE POPRAWNIE ODCZYTANYCH POL 22:15 <@Gynvael> czyli ta cala linie mozna odczytac 22:16 <@Gynvael> dopoki uda sie poprawnie odczytac pierwsza kolumne jako string do "imie", druga jako string do "nazwisko", trzecia jako liczbe do "wiek", to .... 22:16 <@Gynvael> to printf( "%3i = [ %s %s ]\n", wiek, nazwisko, imie); 22:16 <@Gynvael> ;> 22:16 <@Gynvael> czyli wypisz troche inaczej sformatowane 22:16 <@Gynvael> po tym jest tylko zamkniecie pliku i return 22:16 <@Gynvael> ok 22:16 <@Gynvael> tyle o tym 22:16 -!- mode/#wyklady [-m] by Gynvael 22:16 <@Gynvael> pytania ? 22:17 < sulfur> 2 uwagi mam male 22:17 < G0blin> jakies mialem, tylko zapomnialem :P 22:17 < sulfur> while(!feof(f) && fgetc(f) != '\n'); 22:17 < sulfur> toto 22:17 < sulfur> zamienilbym raczej na while(fgetc(f) != '\n' && !feof(f)); 22:18 < sulfur> wtedy zdajsie feof dzialalby lepiej 22:18 < G0blin> .........:> 22:18 <@Gynvael> yep 22:18 <@Gynvael> sulfur: ma ofc racje ;> 22:18 < L0nger> koniunkcja to obentie jaka kolejnosc chyba nie? 22:18 <@Gynvael> ale to jest sprawa dokladnie jednego wywolania feof;> 22:18 <@Gynvael> L0nger: tu chodzi o ilosc wywolan 22:18 <@Gynvael> ;> 22:18 < L0nger> a 22:18 <@Gynvael> feof przed fgetcem jest pewne zwrocic 0 22:18 <@Gynvael> ;> 22:19 < sulfur> ok 22:19 < sulfur> teraz 2 22:19 < sulfur> jak robicie bufor ma plik 22:19 < sulfur> np taki 1000 bajow 22:19 < sulfur> czy ilestam 22:20 < sulfur> to pamietajcie oprocz szukania \n uwazac na \0, zeby nie wyjechac za daleko 22:20 <@Gynvael> ;> 22:20 <@Gynvael> no nie do konca ;> 22:20 < sulfur> trzeba je ofc wstawic jesli nie ma automatu 22:20 <@Gynvael> \0 jest zbedne 22:20 <@Gynvael> moze w pliku wystapic 22:20 <@Gynvael> lepeij sprawdzac ile bajtow sie odczytalo 22:20 <@Gynvael> np fread zwraca ilosc bajtow 22:20 <@Gynvael> i imho najlepiej by bylo tego uzyc 22:20 < sulfur> tia 22:21 < sulfur> no przykladowo, ale u ciebie tu nie wystapi \0 22:21 <@Gynvael> ok 22:21 <@Gynvael> hehe 22:21 <@Gynvael> przypadek 22:21 <@Gynvael> ;> 22:21 < sulfur> chyba ze zrobisz na zlosc komus 22:21 < sulfur> wiem 22:21 < sulfur> parsowalem w weekend doki htmlowe 22:21 < sulfur> to sie zalamalem 22:21 < sulfur> jaki balagan zrobili 22:21 < sulfur> no ale nvm 22:21 <@Gynvael> hehehehe zdarza sie ;> 22:21 <@Gynvael> ok 22:21 < sulfur> dalej 22:21 <@Gynvael> jeszcze jakies pytanka ? 22:21 < phoenix_> ta 22:21 < phoenix_> czy beda logi? 22:21 < L0nger> lol 22:21 <@Gynvael> phoenix_: tak, zawsze sa 22:22 < phoenix_> no nie wiem ;] 22:22 < phoenix_> no dobra dalej 22:22 <@Gynvael> ok 22:22 -!- mode/#wyklady [+m] by Gynvael 22:22 <@Gynvael> ok 22:22 <@Gynvael> http://gynvael.vexillium.org/inne.txt 22:22 <@Gynvael> teraz sie pobawimy w troche inna zabawe 22:22 <@Gynvael> mianowicie 22:22 <@Gynvael> jezyk C jest: fajny 22:22 <@Gynvael> jezyk C jest: dziwny 22:23 <@Gynvael> to jest fragment tego pliku 22:23 <@Gynvael> zalozmy ze interesuje nas tylko ostatnia kolumna 22:23 <@Gynvael> i tylko ja chcemy wypisac 22:23 <@Gynvael> przedstawie dwa sposoby jak za pomoca fscanf mozna to zrobic 22:23 <@Gynvael> http://gynvael.vexillium.org/wydobadz.c 22:23 <@Gynvael> sciagnijcie 22:23 <@Gynvael> odpalcie 22:24 <@Gynvael> 22:29:41 LiTeStEp >wydobadz 22:24 <@Gynvael> fajny 22:24 <@Gynvael> dziwny 22:24 <@Gynvael> inny 22:24 <@Gynvael> mily 22:24 <@Gynvael> costam 22:24 <@Gynvael> powinniscie otrzymac taki wynik 22:24 <@Gynvael> teraz jak program dziala 22:24 <@Gynvael> FILE *f; char jaki[32]; 22:24 <@Gynvael> z ciekawych rzeczy - deklaracja jaki[32] 22:24 <@Gynvael> potem otwarcie pliku i sprawdzenie bledu 22:24 <@Gynvael> a potem petla 22:24 <@Gynvael> while(fscanf(f, "%*s %*s %*s %32s", jaki) == 1) 22:24 <@Gynvael> puts(jaki); 22:24 <@Gynvael> teraz tak 22:24 <@Gynvael> teraz dwie rzeczy 22:25 <@Gynvael> pierwsza 22:25 <@Gynvael> to mam w formacie 4 pola 22:25 <@Gynvael> "%*s %*s %*s %32s" 22:25 <@Gynvael> a druga, to mam tylko jeden parametr 22:25 <@Gynvael> , jaki 22:25 <@Gynvael> i rowniez sprawdzam czy poprawnie wypelnione zostalo jedno pole 22:25 <@Gynvael> == 1) 22:25 <@Gynvael> cala tajemnica twki w * 22:25 <@Gynvael> znak asterisk (*) po % w przypadku scanf oznacza: 22:26 <@Gynvael> WCZYTAJ TO POLE, ALE NIC Z NIM NIE ROB, ZIGNORUJ 22:26 <@Gynvael> czyli ten format 22:26 <@Gynvael> "%*s %*s %*s %32s" 22:26 <@Gynvael> mowi 22:26 -!- phoe [1011@bxy134.neoplus.adsl.tpnet.pl] has quit [Ping timeout: 240 seconds] 22:26 <@Gynvael> zignoruj 3 pierwsze pola, wczytaj czwarte jako string max 32 znakowy 22:26 <@Gynvael> co tez jest robione 22:26 <@Gynvael> czyli w sumie tylko 4rta kolumna jest odczytywana 22:27 <@Gynvael> potem jest wypisywana (puts) 22:27 <@Gynvael> i koneic filozofii 22:27 <@Gynvael> ok 22:27 <@Gynvael> pytania ? 22:27 -!- mode/#wyklady [-m] by Gynvael 22:27 < L0nger> co jesli mamy duzo kolumn? 22:27 <@mulander> tak, w C niema regexpow ? 22:27 < m4shed> musze niestety isc spac dobranoc all 22:27 < m4shed> bye :( 22:27 < phoenix_> ide cya all 22:27 < L0nger> bye 22:27 -!- phoenix_ [~phoenix@cdl207.neoplus.adsl.tpnet.pl] has quit [Quit: bye ] 22:27 <@Gynvael> mulander: bingo, nie ma;> 22:27 <@Gynvael> L0nger: mozna dac duzo %*s 22:27 <@Gynvael> ;> 22:28 -!- sft|- [~superb@cjv20.neoplus.adsl.tpnet.pl] has joined #wyklady 22:28 <@mulander> cos czytalem o jakiejs bibliotece C z regexpami. 22:28 < L0nger> Gynvael: np. 1000? :> 22:28 <@Gynvael> L0nger: to sa dwa sposoby 22:28 <@Gynvael> mulander: ofc, liby sa do tego, ale std nie ma 22:28 < L0nger> Gynvael:? 22:28 <@Gynvael> L0nger: albo "%*s ...... %*s" - czyli 1000 tego 22:28 -!- m4shed [n3tdes@bsd.miki.eu.org] has quit [Remote host closed the connection] 22:28 < L0nger> nom 22:29 <@Gynvael> L0nger: albo: for( i = 0 ; i < 1000; i ++ ) fscanf(f, "%*s "); a tu odczyt ostatniej 22:29 <@Gynvael> ;> 22:29 <@mulander> a nie mozna bodajze %[] ? 22:29 <@mulander> to chyba czyta az napotka dany znak 22:29 <@Gynvael> o %[] za chwile 22:29 <@Gynvael> ;> 22:29 <@Gynvael> mulander: to w sumie jedyny uklon w strone regexp ;> 22:29 <@mulander> :) 22:29 < L0nger> ok 22:30 <@Gynvael> ok 22:30 < L0nger> nie jarze jeszcze czegos z poprzedniego zrodla ale to na privie bo blama :P 22:30 <@Gynvael> jeszcze jakies pytanka ? 22:30 <@Gynvael> L0nger: to priivuj 22:30 <@Gynvael> ;> 22:30 < L0nger> :P 22:30 < L0nger> potem :> 22:30 < L0nger> teraz cd 22:30 <@Gynvael> ok 22:30 -!- mode/#wyklady [+m] by Gynvael 22:30 <@Gynvael> teraz drugi kod 22:30 <@Gynvael> http://gynvael.vexillium.org/wydobadz2.c 22:30 <@Gynvael> kompilacja wiadomo 22:30 <@Gynvael> odpalenie tez 22:30 <@Gynvael> 22:36:39 LiTeStEp >wydobadz 22:30 <@Gynvael> fajny 22:30 <@Gynvael> dziwny 22:30 <@Gynvael> inny 22:30 <@Gynvael> mily 22:30 <@Gynvael> costam 22:31 <@Gynvael> taki wynik powinien dac 22:31 <@Gynvael> program sie rozni DOKLADNIE JEDNA RZECZA 22:31 <@Gynvael> formatem 22:31 <@Gynvael> ;> 22:31 <@Gynvael> while(fscanf(f, "%*[^:]: %32s\n", jaki) == 1) 22:31 <@Gynvael> tam mamy takie cudo 22:31 <@Gynvael> %*[^:]: (widzicie, ani jednej literki ;p i niech mi ktos powie ze C nie jest dziwny) 22:32 <@Gynvael> ok 22:32 <@Gynvael> co to za cudo 22:32 <@Gynvael> % oznacza pole 22:32 <@Gynvael> * oznacza ze pole ma byc odczytane ale nie zapisywane 22:33 <@Gynvael> teraz tak 22:33 <@Gynvael> miedzy [ a ] 22:33 <@Gynvael> sa znaki ktore moga wystapic w STRINGU 22:33 <@Gynvael> np moze tam byc: 22:33 <@Gynvael> [abcd] 22:33 -!- jarekj [angel@83.16.2.198] has joined #wyklady 22:33 <@Gynvael> wtedy scanf uzna ze to pole jest tak dlugo jak dlugo wysterpuja tylko te litery, abcd 22:33 <@Gynvael> mozna w skrocie to zapisac 22:33 <@Gynvael> [a-d] 22:34 <@Gynvael> czyli od a do d 22:34 <@Gynvael> mozna napisac tez 22:34 <@Gynvael> [A-Za-z] 22:34 <@Gynvael> czyli "od A do Z i od a do z" 22:34 <@Gynvael> ewentualnie 22:34 <@Gynvael> mozna uzyc znaku ^ ktory oznacza "inne niz" 22:34 <@Gynvael> czyli 22:35 <@Gynvael> [^a] - wszystkie znaki inne niz "a" 22:35 <@Gynvael> [^abcd] - wszystkie znaki inne niz abcd 22:35 <@Gynvael> [^a-zA-Z] - wszystkei nie-litery ;> 22:35 <@Gynvael> u nas jest 22:35 <@Gynvael> [^:] 22:35 <@Gynvael> czyli wszystko co nie jest dwukropniem 22:35 <@Gynvael> ;> 22:35 <@Gynvael> czemu : ? 22:35 <@Gynvael> jezyk C jest: dziwny 22:35 <@Gynvael> jezyk C jest: inny 22:35 <@Gynvael> pamietacie format tego pliku 22:35 <@Gynvael> ? 22:35 <@Gynvael> ciekawa rzecza jest to ze przed naszym przymiotnikiem 22:35 <@Gynvael> jest : 22:36 <@Gynvael> i wlasnie na tym to sie opiera 22:36 <@Gynvael> a ten : po ] ? to po prostu znak 22:36 <@Gynvael> czyli 22:36 <@Gynvael> "%*[^:]: %32s\n" 22:36 <@Gynvael> to oznacza 22:36 <@Gynvael> odczytaj do dwukropka i wyrzuc, pomin dwukropek, potem spacje, a na koncu odczytaj pole-string-max-32-znaki 22:36 <@Gynvael> czyli de facto ostatnia kolumne 22:37 <@Gynvael> MOZNA BY napisac nawet 22:37 <@Gynvael> "jezyk C jest: %32s" 22:37 <@Gynvael> i to tez by przeszlo 22:37 <@Gynvael> ok 22:37 <@Gynvael> teraz pytanka 22:37 -!- mode/#wyklady [-m] by Gynvael 22:38 < L0nger> wszystko zrozumiale :P 22:38 <@Gynvael> ql ;> 22:38 <@Gynvael> lecimy dalej ? 22:38 -!- Szejker [~szejker@mixer.biz.tm] has joined #wyklady 22:38 < L0nger> k 22:38 <@Gynvael> zostaly jeszcze 3 przyklady 22:38 <@Gynvael> czesc Szejker 22:38 <@Gynvael> ok 22:38 -!- mode/#wyklady [+m] by Gynvael 22:39 <@Gynvael> ok 22:39 <@Gynvael> narazie tyle przykladow z plikow tekstowych 22:39 <@Gynvael> teraz pliki binarne 22:39 <@Gynvael> http://gynvael.vexillium.org/bin_1.c 22:40 <@Gynvael> kompilacje znaja 22:40 <@Gynvael> 22:46:24 LiTeStEp >bin_1 22:40 <@Gynvael> odczytalem z pliku 10 22:41 <@Gynvael> ok 22:41 <@Gynvael> co robi program logicznie: 22:41 <@Gynvael> 1) zapisuje 10 do pliku 1.bin (binarnie, jako int) 22:41 <@Gynvael> 2) odczytuje inta z pliku 1.bin (binarnie, do inta) 22:42 <@Gynvael> po kolei 22:42 <@Gynvael> na pozcatku standardowe deklaracje 22:42 <@Gynvael> i nadanie i = 10 22:42 <@Gynvael> f = fopen("1.bin", "wb"); 22:42 <@Gynvael> tam sie pojawila literka "b" 22:42 <@Gynvael> linuxowcy/*nixowcy jej nie potrzebuja 22:42 <@Gynvael> windowsowcy tak, przykro mi ;< bill gates nas windowsowcow nie lubi ;p 22:42 <@Gynvael> b jak binary ofc ;> 22:43 <@Gynvael> o roznicy miedzy trybem tekstowym a binarnym bylo ostatnio;> 22:43 <@Gynvael> potem kontrola bledow 22:43 <@Gynvael> i zapisanie 22:43 <@Gynvael> fwrite(&i, sizeof(i), 1, f); 22:43 <@Gynvael> o samym fwrite bylo ostatnio 22:43 <@Gynvael> przypomne tylko co robi 22:43 <@Gynvael> fwrite(pointer na pierwszy bajt jakichkolwiek danych, wielkosc pola, ilosc pol, plik) 22:44 <@Gynvael> nie bede sie w te pola wglebial, byloo ostatnio 22:44 <@Gynvael> powiem tylko ze ilosc pol * wielkosc pola to ilosc bajtow do zapisania 22:44 <@Gynvael> najproscie wielksoc pola ustawic na 1, a ilosc pol na ilosc bajtow do zapisania 22:44 <@Gynvael> ;> 22:44 <@Gynvael> ok 22:44 <@Gynvael> ale nvm 22:44 <@Gynvael> czyli w naszym wypadku zapisuje i BINARNIE do pliku f 22:44 <@Gynvael> dokladniej rzecz biorac to 4ry bajty z pamieci z adresu i 22:45 <@Gynvael> jesli otworzycie w jakims hex edytorze plik 1.bin to waszym ocza pokaze sie ciag 22:45 <@Gynvael> 0A 00 00 00 22:46 <@Gynvael> http://gynvael.vexillium.org/hex.gif 22:46 <@Gynvael> to dla niedowiarkow 22:46 <@Gynvael> 0A 00 00 00 to little endianowo zapisany int 22:46 <@Gynvael> int ma 4 bajty 22:46 <@Gynvael> wiec sie zgadza 22:46 <@Gynvael> co to znaczy "little endianowo" ? 22:46 <@Gynvael> w duuzym skrocie, odwrocona kolejnosc bajtow 22:46 <@Gynvael> czyli bajty od tylu zapisany 22:46 <@Gynvael> na ludzki to by bylo 22:46 <@Gynvael> 00 00 00 0A 22:47 <@Gynvael> czyli 22:47 <@Gynvael> 0x0000000A 22:47 <@Gynvael> czyli 10 ;> 22:47 <@Gynvael> wiec sie wszystko zgadza 22:47 <@Gynvael> potem jest zamkniecie pliku 22:47 <@Gynvael> fclose(f); 22:47 <@Gynvael> i otwarcie do odczytu 22:47 <@Gynvael> f = fopen("1.bin", "rb"); 22:47 <@Gynvael> tez binarnie 22:47 <@Gynvael> fread(&i, sizeof(i), 1, f); 22:47 <@Gynvael> potem odczyt 4rech bajtow i zapis ich w pamieci pod adres zmiennej "i" 22:47 <@Gynvael> i wypisanie co sie odczytalo 22:47 <@Gynvael> czyli 10 22:47 <@Gynvael> zamkniecie pliku, return 22:47 <@Gynvael> tyle 22:48 -!- mode/#wyklady [-m] by Gynvael 22:48 <@Gynvael> pytania ? 22:48 < sulfur> gynv: wiedza ile co kiedy zajmuje w porownaniu do textowki itp ? 22:49 < Szejker> Gynvael: wow... jestem pod wrazeniem, brawo ;-) tak btw. czesc :> 22:49 <@Gynvael> sulfur: jesli nei sa slepi to widza ;> 22:49 < sulfur> ok 22:49 <@Gynvael> Szejker: czesc czesc ;> 22:49 <@Gynvael> ok to jak z pytaniami ? 22:49 <@Gynvael> brak ? 22:49 <@Gynvael> to lecimy dalej 22:50 -!- mode/#wyklady [+m] by Gynvael 22:50 <@Gynvael> ok 22:50 <@Gynvael> wrazie gdyby ktos nie zauwazyl 22:50 <@Gynvael> zapis binarny ma pare wad i pare zalet 22:50 <@Gynvael> z wad: niektorzy ludzie maja problem z odczytem tego.. ale to kwestia wprawy 22:51 <@Gynvael> z przewag: szybszy do odczytu/zapisu (za rowno jesli chodzi o ilosc kodu jak i ilosc myslenia i dlugosc dzialania programu, wkoncu komputer mysli binarnie, nei tekstowo) 22:51 <@Gynvael> i wszystko jest bardziej upakowane ;> 22:51 <@Gynvael> "12345678" jako string to jest 8-9 znakow (zalezy czy '\0' chcemy) 22:51 <@Gynvael> a jako int to jest zawsze 4 ;> 22:52 <@Gynvael> (ew jako long long to 8, etc ;p, ale ing/long starczy) 22:52 <@Gynvael> po za tym binarnie mozemy wykorzystac wszystkie znaki, a tekstowo np 0x0a to jakis koneic linii, 0x00 to koniec stringa, etc.. blah... 22:52 <@Gynvael> no 22:52 <@Gynvael> ;> 22:52 <@Gynvael> lecimy dalej 22:52 <@Gynvael> przyklad drugi 22:52 <@Gynvael> http://gynvael.vexillium.org/bin_2.c 22:53 <@Gynvael> 22:58:47 LiTeStEp >bin_2 22:53 <@Gynvael> odczytalem z pliku: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 22:53 <@Gynvael> ok 22:53 <@Gynvael> teraz co program robi logicznie ? 22:54 <@Gynvael> - wypelnia tablice 20 intow intami od 0 do 19 22:54 <@Gynvael> - zapisuje cala tablice do pliku 22:54 <@Gynvael> - odczytuje tablice z pliku i wypisuje 22:54 <@Gynvael> int tab[20], i; 22:54 <@Gynvael> deklaracja.. 22:54 <@Gynvael> for( i = 0; i < 20; i++ ) 22:54 <@Gynvael> tab[i] = i; 22:54 <@Gynvael> wypelnienie, nic dodac nic ujac 22:54 <@Gynvael> f = fopen("2.bin", "wb"); 22:54 <@Gynvael> otwarcie pliku i kontrola bledow nizej.. bylo juz 22:55 <@Gynvael> fwrite(tab, sizeof(i), 20, f); 22:55 <@Gynvael> fwrite jak widac duzo sie nie rozni 22:55 <@Gynvael> tab - pointer na pierwszy element/bajt tablicy 22:55 <@Gynvael> sizeof(i) - to uzylem przez przypadek, ale akurat to dobry przyklad 22:55 <@Gynvael> sizeof(i) to ofc sizeof(int) 22:55 <@Gynvael> jako ze tab[0] to tez int, wiec wszystko sie zgadza... 4 ;> 22:55 <@Gynvael> 20 to liczba pol w tablicy 22:56 <@Gynvael> mozna by zamiast sizeof(i), 20 napisac 1, sizeof(i)*20, albo nawet 1, 80 22:56 <@Gynvael> czyli to zapisuje 80 bajtow od "tab" do pliku "f" 22:56 <@Gynvael> ok 22:56 <@Gynvael> potem zamkniecie pliku 22:56 <@Gynvael> i analogiczny odczyt 22:56 <@Gynvael> po czym wypisanie calosci 22:56 <@Gynvael> sadze ze to dosc prosty przyklad 22:56 <@Gynvael> pytania ? 22:56 -!- mode/#wyklady [-m] by Gynvael 22:57 -!- L0nger [~nictuniem@tz82.internetdsl.tpnet.pl] has quit [Quit: dobranoc wszystkim] 22:57 < sulfur> ja mam jedno 22:57 < sulfur> ;] 22:57 <@Gynvael> taak ? 22:57 [Users #wyklady] 22:57 [@Gynvael ] [ Blizzard ] [ G0blin] [ Nekrataal^aw] [ sft|- ] [ Szejker] 22:57 [@mulander] [ furiosan_] [ jarekj] [ rainrider ] [ sulfur] [ unknow ] 22:57 -!- Irssi: #wyklady: Total of 12 nicks [2 ops, 0 halfops, 0 voices, 10 normal] 22:57 < sulfur> otoz czy ma jakis wplyw uzywanie fwrite przy roznej konfoguracji sizeof dla 2 i 3 parametru na bog i little endian ? 22:58 < sulfur> chodzi tu o roznice w wynikach 22:58 <@Gynvael> bog ? 22:58 <@Gynvael> a 22:58 <@Gynvael> big 22:58 <@Gynvael> ;p 22:58 <@Gynvael> nie 22:58 <@Gynvael> nie ma 22:58 < sulfur> k 22:58 < sulfur> ja bym powiedzial ze ma 22:58 <@Gynvael> warunek w sumie jest taki, ze zrobienie fwrite(..., DUZO, 1, f ) to wywalenie programu 22:58 <@Gynvael> ;p 22:58 <@Gynvael> nie wiem czemu 22:58 < sulfur> ale nie chce mi sie sprawdzac ;] 22:59 <@Gynvael> a ja sprawdzalem ;p 22:59 <@Gynvael> i nie ma 22:59 <@Gynvael> ;p 22:59 <@Gynvael> btw nie na kazdym osie/libc program sie wtedy wywali 22:59 <@Gynvael> ;> 22:59 <@Gynvael> ale zdarzylo mi sie 22:59 <@Gynvael> ;p 22:59 < sulfur> gynv: a moze to z tego wynika wlasnie 22:59 <@Gynvael> sulfur: fwrite nie odczytuje pliku 22:59 <@Gynvael> ee typu 22:59 <@Gynvael> tylko bajty 23:00 <@Gynvael> jego nie obchodzi czy to int little, int big, czy float 23:00 <@Gynvael> nawet nie obchodzi go czy sie ilosc bajtow zgadza 23:00 <@Gynvael> on po prostu na zywca laduje bajty z pliku do pamieci 23:00 <@Gynvael> a jak sobie to programista/C zinterpretuje to juz nie fwrite/fread sprawa 23:00 <@Gynvael> ;> 23:00 < sulfur> no ok 23:00 < sulfur> ale skoro tak 23:00 < sulfur> to jak cos zapiszemy na little a odczytamy na big to mamy cos innego 23:00 < sulfur> siur ? 23:00 <@Gynvael> ofc ;> 23:01 < sulfur> no ok 23:01 < sulfur> dalej 23:01 <@Gynvael> (dlatego cross-platformowe informacje przyjelo sie w big-endianach zapisywac.. np adresy IP w headerkach pakietow) 23:01 <@Gynvael> ok 23:01 <@Gynvael> dalej 23:01 -!- mode/#wyklady [+m] by Gynvael 23:01 <@Gynvael> ok 23:01 <@Gynvael> ostatni planowy przyklad 23:02 <@Gynvael> http://gynvael.vexillium.org/ex.tga 23:02 <@Gynvael> http://gynvael.vexillium.org/bin_3.c 23:02 <@Gynvael> czyli odczytanie naglowka pliku graficznego TGA 23:02 <@Gynvael> ex.tga to moj awatarek z forum uw-team 23:02 <@Gynvael> jak mozna sie przekonac otwierajac go w dowolnym dobrym programie do przegladania obrazkow 23:02 <@Gynvael> ma on wymiary 80x61 23:03 <@Gynvael> i glebie kolorow na 24 bity 23:03 <@Gynvael> program bin_3 odczytuje jego naglowek 23:03 <@Gynvael> i wypisuje te 3 informacje ktore podalem 23:03 <@Gynvael> 23:09:23 LiTeStEp >bin_3 23:03 <@Gynvael> szerokosc: 80 23:03 <@Gynvael> wysokosc : 61 23:03 <@Gynvael> bpp : 24 23:03 <@Gynvael> u mnei dziala jak widac; > 23:03 <@Gynvael> teraz co jest co 23:03 <@Gynvael> struct TGA_HEADER { 23:03 <@Gynvael> ... 23:03 <@Gynvael> } __attribute__((packed)); 23:04 <@Gynvael> to ofc strukturka naglowka pliku TGA 23:04 <@Gynvael> skad ja wyczaslem ? 23:04 <@Gynvael> a przekleilem z furiosan_'a projektu ;pp 23:04 <@Gynvael> pewnie nie takiej odpowiedzi sie spodziewaliscie 23:04 <@Gynvael> ok zdradze tajemnice 23:04 <@Gynvael> http://wotsit.org 23:05 <@Gynvael> hmm 23:05 <@Gynvael> http://www.wotsit.org 23:05 <@Gynvael> (bez www cos nie dziala --;) 23:05 <@Gynvael> nvm 23:05 <@Gynvael> to jest baza danych informacji o plikach roznych, m.in. z dokumentacjami od plikow binarnych 23:06 <@Gynvael> na podstawie takiej dokumentacji mozna stworzyc, np taka struktuke jak to nasze TGA_HEADER 23:06 <@Gynvael> na temat samej struktury i attribute sie wglebial nie bede, bylo, jak kogos interesuje niech poszpera po logach z wykladow 23:06 <@Gynvael> ok 23:06 <@Gynvael> teraz po kolei jak program dziala 23:06 <@Gynvael> FILE *f; 23:06 <@Gynvael> struct TGA_HEADER tga; 23:06 <@Gynvael> deklaracje 23:06 <@Gynvael> potem jest otwarcie pliku 23:06 <@Gynvael> i sprawdzneie bledu 23:06 <@Gynvael> ofc otwarcie jako plik binarny 23:06 <@Gynvael> fread(&tga, 1, sizeof(tga), f); 23:07 <@Gynvael> a to male cudo wczytuje caly naglowek pliku tga do strukturki naglowka 23:07 <@Gynvael> fclose(f); 23:07 <@Gynvael> koniec filozofii odczytu naglowka 23:07 <@Gynvael> (TGA ma wyjatkowo prosta budowe, dlatego jest dobry na poczatek) 23:07 <@Gynvael> potem po prostu wypisanie tych informacji i koniec 23:07 <@Gynvael> co bardziej dociekliwi moga spojrzec hex-editorem na plik ex.tga 23:08 <@Gynvael> i faktycznie znalesc na offsetach 0xC i 0xE wartosci 23:08 <@Gynvael> 50 00 i 3D 00 23:08 <@Gynvael> czyli little-endianowo zapisane wordy 0x50 i 0x3D 23:08 <@Gynvael> czyli 80 i 61 ;> 23:08 <@Gynvael> a gdzies tam pozniej 18, czyli 0x18 czyli 24 ;> 23:09 <@Gynvael> (na 0x10 offsecie bodajze) 23:09 <@Gynvael> ok 23:09 <@Gynvael> tyle 23:09 <@Gynvael> pytania ? 23:09 -!- mode/#wyklady [-m] by Gynvael 23:12 <@Gynvael> hmm 23:12 <@Gynvael> chyba brak 23:12 -!- mode/#wyklady [+m] by Gynvael 23:12 <@Gynvael> ok 23:13 <@Gynvael> skoro wszystkich uspilem tyo na dzisiaj koneic ;p 23:13 <@mulander> :) 23:13 <@Gynvael> http://gynvael.vexillium.org/kopiowanie.c 23:13 <@Gynvael> to jest przyklad kopiowania 23:13 -!- sulfur [~sulfur@213.199.204.33] has quit [Quit: User pushed the X - because it's Xtra, baby] 23:13 <@Gynvael> na zadanie domowe jest przeanalizowac 23:13 <@Gynvael> ;> 23:13 <@mulander> Gynv steganografia to tez praca w trybie binarnym na pliczku ? :) 23:13 <@Gynvael> stefanografia ? ;p 23:13 <@Gynvael> wtf ? ;p 23:13 <@Gynvael> ok 23:13 <@Gynvael> koniec wykladu ;pp