Dinamikus memóriakezelés Fájlkezelés

Hasonló dokumentumok
Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus változók. Dinamikus változók. Dinamikus változók. Dinamikus változók. 7.

7. gyakorlat Sorozatok, Fájlkezelés

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

Programozás 6. Dr. Iványi Péter

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Programozás II. Fájlkezelés

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

Programozás C nyelven (13. ELŐADÁS) Sapientia EMTE

Példák tematikus csoportosításban

8. gyakorlat Pointerek, dinamikus memóriakezelés

Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.

Programozás I gyakorlat

A C programozási nyelv VI. Parancssori argumentumok File kezelés

7. gyakorlat. Fájlkezelés IO haladó Függvények haladó

0.1. Mi az a standard be- és kimenet? A két mintafeladat leírása

C memóriakezelés. Mutató típusú változót egy típus és a változó neve elé írt csillag karakterrel hozhatjuk létre.

Járműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamás

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós április 4. Széchenyi István Egyetem, Gy r

Mérnöki programozás 7. Szerkesztette: dr. Vass Péter Tamás

Programozas 1. Strukturak, mutatok

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

5. Gyakorlat. struct diak {

Programozás C nyelven (10a. ELŐADÁS) Sapientia EMTE

10. gyakorlat. Pointerek Tárolási osztályok

Programozás 5. Dr. Iványi Péter

1. Alapok. Programozás II

Programozás I gyakorlat. 10. Stringek, mutatók

Struktúrák (struct) A struktúra szerkezetét meghatározó deklaráció általános formája:

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 6.ELŐADÁS. Fájlkezelés PHP-ben

Adatbázisrendszerek I. Fájlszintű adattárolás C-ben

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

Bevezetés a programozásba I.

Programozás I gyakorlat

tétel: különböző típusú adatokat csoportosít, ezeket egyetlen adatként kezeli, de hozzáférhetünk az elemeihez is

C programozási nyelv Pointerek, tömbök, pointer aritmetika

malloc free malloc free int sum(int a[4]) { return a[0] + a[1] + a[2] + a[3]; }

Programozás C nyelven (9. ELŐADÁS) Sapientia EMTE

Programozás I gyakorlat

Példatár a Programozás 1 tárgyhoz

Adminisztrációs feladatok Strukturált programok A C programnyelv elemei

10. gyakorlat Struktúrák, uniók, típusdefiníciók

Programozás II. 2. Dr. Iványi Péter

7/8. gyakorlat Karaktertömbök és sztringkezelés

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós május 6. Széchenyi István Egyetem, Gy r

Bevezetés Kiíratás Beolvasás Formázás Fájlkezelés Gyakorló feladatok C++ I/O. Bevezetés. Izsó Tamás február 20. Izsó Tamás C++ I/O / 1

1. Feladat: beolvas két számot úgy, hogy a-ba kerüljön a nagyobb

Adatbázisrendszerek I. File-szintű adattárolás C-ben. 1. gyakorlat

5. gyakorlat. Konstansok Tömbök Stringek

Operációs rendszerek 1.

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

Programozás I gyakorlat

Programozás alapjai 9.Gy: Struktúra 2.

Programozás C++ -ban 2007/1

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

Pénzügyi algoritmusok

Programozási nyelvek Java

Mutatók és mutató-aritmetika C-ben március 19.

A C++ nyelvben a függvény nevek túlterhelésével biztonságosabbá tehetnénk az adatok kiírását és beolvasását.

C string műveletek (string.h alkalmazása)

Országzászlók (2015. május 27., Sz14)

Programozás alapjai 2.Gy: A C nyelv alapjai P R O

Mintavételes szabályozás mikrovezérlő segítségével

A C programozási nyelv I. Bevezetés

Bevezetés a programozásba I 4. gyakorlat. PLanG: Szekvenciális fájlkezelés. Szekvenciális fájlkezelés Fájlok használata

Szövegek C++ -ban, a string osztály

INFORMATIKA javítókulcs 2016

Hatékony memóriakezelési technikák. Smidla József Operációkutatási Laboratórium január 16.

Preprocesszor. Programozás alapjai C nyelv 11. gyakorlat. Makrók (2) Makrók (#define) Makrók (3) #include

Bevezetés a programozásba I 4. gyakorlat. PLanG: Szekvenciális fájlkezelés

Programozás II. segédlet

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

Pénzügyi algoritmusok

Függvények. Házi feladat.

A C programozási nyelv I. Bevezetés

S z á m í t ó g é p e s a l a p i s m e r e t e k

Programozás C és C++ -ban

Programozás I. gyakorlat

Bevezetés a programozásba. 8. Előadás: Függvények 2.

BallFight. A játék akkor ér véget, ha egy körben mindkét játékos passzol. Kommunikáció a BallFight programmal

Programozás alapjai C nyelv 11. gyakorlat. Preprocesszor. Makrók (#define)

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

1. Írjunk programot mely beolvas két egész számot és kinyomtatja az összegüket.

Függvény pointer. Feladat: Egy tömbben soroljunk fel függvényeket, és hívjuk meg valahányszor.

Programozás alapjai 6. előadás. Wagner György Általános Informatikai Tanszék

Objektumorientált programozás Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Programozási Nyelvek: C++

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

Bevezetés a programozásba I.

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Mutatók. Dr. Bécsi Tamás 7. Előadás

Bevezetés a programozásba I.

Programozás alapjai C nyelv 10. gyakorlat. Standard függvények. Union

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós augusztus 29. Széchenyi István Egyetem, Gy r

Bevezetés a programozásba I 8. gyakorlat. C++: szövegfolyamok, intelligens tömbök

Bevezetés a C programozási nyelvbe. Az Általános Informatikai Tanszék C nyelvi kódolási szabványa

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

Bevezetés a programozásba I 8. gyakorlat. C++: szövegfolyamok, intelligens tömbök. Adatfolyamok Hibalehetőségek

C változók. Feladat: Deklaralj egy valos, egy karakter es ket egesz tipusu valtozot! int main() {

Átírás:

Dinamikus nd tömb Fájlkezelés Dinamikus memóriakezelés Fájlkezelés A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán 2016. október 15. Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 1 / 44

Dinamikus nd tömb Fájlkezelés Tartalom 1 Dinamikus memóriakezelés Memóriafoglalás és -felszabadítás Sztring példa 2 Többdimenziós tömbök Deníció Átadás függvénynek 2D dinamikus tömb Mutatótömb 3 Fájlkezelés Bevezetés Szöveges fájlok Standard streamek Bináris fájlok Státuszjelz függvények Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 2 / 44

Dinamikus nd tömb Fájlkezelés malloc str példa 1. fejezet Dinamikus memóriakezelés Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 3 / 44

Dinamikus nd tömb Fájlkezelés malloc str példa Dinamikus memóriakezelés Olvassunk be egész számokat, és írjuk ki ket fordított sorrendben! A beolvasandó egész számok számát is a felhasználótól kérjük be! Csak annyi memóriát használjunk, amennyi feltételenül szükséges! 1 Beolvassuk a darabszámot (n) 2 n egész szám tárolására elegend memóriát kérünk az operációs rendszert l 3 Beolvassuk és eltároljuk a számokat, kiírjuk ket fordítva 4 Visszaadjuk a lefoglalt memóriát az operációs rendszernek Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 4 / 44

Dinamikus nd tömb Fájlkezelés malloc str példa Példa 1 int n, i; 2 int *p; 3 4 printf ("Há nyat olvassak be? " ); 5 scanf ("%d", &n ); 6 p = ( int *) malloc (n* sizeof ( int )) ; 7 if ( p == NULL ) return ; 8 9 printf ("Ké rek %d sz á mot :\ n", n ); 10 for ( i = 0; i < n; ++ i) 11 scanf ("%d", &p[i ]); 12 13 printf (" Ford í tva :\ n" ); 14 for ( i = 0; i < n; ++ i) 15 printf ("%d ", p[n -i -1]); 16 17 free (p); 18 p = NULL ; link 1 0xACDC 4 20 2 bájt 5 8 p:0x0000 Hányat olvassak be? 5 Kérek 5 számot: 1 4 2 5 8 Fordítva: 8 5 2 4 1 Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 5 / 44

Dinamikus nd tömb Fájlkezelés malloc str példa A malloc és free függvények <stdlib.h> void *malloc(size_t size); size bájt egybefügg memóriát foglal, és a lefoglalt terület címét visszaadja void* típusú értékként A visszaadott void* csak egy cím, ami nem dereferálható. Akkor lesz használható, ha átkonvertáljuk (pl. int*-gá). 1 int *p; /* int adat cí me */ 2 /* Mem ó riafoglal ás 5 int - nek */ 3 p = ( int *) malloc (5* sizeof ( int )); Ha nem áll rendelkezésre elég egybefügg memória, a visszatérési érték NULL. Ezt mindig ellen rizni kell. 1 if ( p!= NULL ) 2 { 3 /* haszn á lat, majd felszabad ítás */ 4 } Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 6 / 44

Dinamikus nd tömb Fájlkezelés malloc str példa A malloc és free függvények <stdlib.h> void free(void *p); A p címen kezd d egybefügg memóriaterületet felszabadítja Méretet nem adjuk meg, mert azt az op.rendszer tudja (felírta a memóriaterület elé, ezért a kezd címmel kell hívni) free(null) megengedett (nem csinál semmit), ezért lehet így is: 1 int *p = ( int *) malloc (5* sizeof ( int )); 2 if ( p!= NULL ) 3 { 4 /* haszn á lat */ 5 } 6 free (p ); /* nem baj, ha NULL */ 7 p = NULL ; /* ez jó szok ás */ Mivel a nullpointer nem mutat sehova, jó szokás felszabadítás után kinullázni a mutatót, így látni fogjuk, hogy nincs használatban. Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 7 / 44

Dinamikus nd tömb Fájlkezelés malloc str példa malloc free a malloc és a free kéz a kézben járnak ahány malloc, annyi free 1 char * WiFi = ( char *) malloc (20* sizeof ( char )); 2 int * Lunch = ( int *) malloc (23* sizeof ( int )); 3... 4 free ( WiFi ); 5 free ( Lunch ); Ha a felszabadítás elmarad, memóriaszivárgás (memory leak) Jó szokások: Amelyik függvényben foglalunk, abban szabadítsunk A malloc által visszaadott mutatót ne módosítsuk, ha lehet, ugyanazon keresztül szabadítsunk Van, hogy nem lehet tartani a jó szokásokat, ezt külön (kommentben) jelezzük Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 8 / 44

Dinamikus nd tömb Fájlkezelés malloc str példa A calloc függvény <stdlib.h> void *calloc(size_t num, size_t size); egybefügg memóriát foglal num darab, egyenként size méret elemnek, a lefoglalt területet kinullázza, és címét visszaadja void* típusú értékként Használata szinte azonos a malloc-kal, csak ez elvégzi a num*size szorzást, és kinulláz. A lefoglalt területet ugyanúgy free-vel kell felszabadítani 1 int *p = ( int *) calloc (5, sizeof ( int )); 2 if ( p!= NULL ) 3 { 4 /* haszn á lat */ 5 } 6 free (p ); Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 9 / 44

Dinamikus nd tömb Fájlkezelés malloc str példa A realloc függvény <stdlib.h> void *realloc(void *memblock, size_t size); korábban lefoglalt meóriaterületet átméretez size bájt méret re új méret lehet kisebb is, nagyobb is, mint a régi ha kell, új helyre másolja a korábbi tartalmat, az új elemeket nem inicializálja visszatérési értéke az új terület címe 1 int *p = ( int *) malloc (3* sizeof ( int )); 2 p [0] = p [1] = p [2] = 8; 3 p = realloc (p, 5* sizeof ( int )); 4 p [3] = p [4] = 8; 5... 6 free (p ); Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 10 / 44

Dinamikus nd tömb Fájlkezelés malloc str példa Példa Írjunk függvényt, mely a paraméterként kapott két sztringet összef zi. A függvény foglaljon helyet az eredménysztringnek, és adja vissza annak címét. 1 /* concatenate -- két sztring ö sszef zé se 2 dinamikusan foglal, az eredm é ny címét adja vissza 3 */ 4 char * concatenate ( char *s1, char * s2 ) { 5 size_t l1 = strlen ( s1 ); 6 size_t l2 = strlen ( s2 ); 7 char *s = ( char *) malloc (( l1 + l2 +1)* sizeof ( char )); 8 if (s!= NULL ) { 9 strcpy (s, s1 ); 10 strcpy ( s+l1, s2 ); /* vagy strcat (s, s2 ) */ 11 } 12 return s; 13 } link Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 11 / 44

Dinamikus nd tömb Fájlkezelés malloc str példa Példa A függvény használata 1 char word1 [] = "ló", word2 [] = " dar á zs "; 2 3 char * res1 = concatenate ( word1, word2 ); 4 char * res2 = concatenate ( word2, word1 ); 5 res2 [0] = 'v '; 6 7 printf ("%s\n%s", res1, res2 ); 8 9 /* A fü ggv é ny mem ó ri át foglalt, felszabad í tani! */ 10 free ( res1 ); 11 free ( res2 ); link lódarázs varázsló Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 12 / 44

Dinamikus nd tömb Fájlkezelés Def függvény 2D tömb mutatótömb 2. fejezet Többdimenziós tömbök Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 13 / 44

Dinamikus nd tömb Fájlkezelés Def függvény 2D tömb mutatótömb Többdimenziós tömbök 1D tömb Azonos típusú elemek a memóriában egymás mellett tárolva 2D tömb Azonos méret és típusú 1D tömbök a memóriában egymás mellett tárolva 3D tömb Azonos méret és típusú 2D tömbök a memóriában egymás mellett tárolva...... Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 14 / 44

Dinamikus nd tömb Fájlkezelés Def függvény 2D tömb mutatótömb Kétdimenziós tömbök 2D tömb deklarációja: 1 char a [3][2]; /* 3 soros két oszlopos karaktert ö mb */ 2 /* 2 elem 1D tö mb ök 3 elem tö mbje */ a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1] C-ben sorfolytonos tárolás, vagyis a hátsó index fut gyorsabban a[0] a[1] a[2] a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1] a[0], a[1] és a[2] 2 elem 1D tömbök Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 15 / 44

Dinamikus nd tömb Fájlkezelés Def függvény 2D tömb mutatótömb Kétdimenziós tömb átvétele soronként 1D tömb (sor) feltöltése adott elemmel 1 void fill_ row ( char row [], size_t size, char c) 2 { 3 size_t i; 4 for ( i = 0; i < size ; ++ i) 5 row [i] = c; 6 } 2D tömb feltöltése soronként 1 char a [3][2]; 2 fill_row (a [0], 2, 'a '); /* 0. sor csupa 'a ' */ 3 fill_row (a [1], 2, 'b '); /* 1. sor csupa 'b ' */ 4 fill_row (a [2], 2, 'c '); /* 2. sor csupa 'c ' */ a[0] a[1] a[2] a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1] Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 16 / 44

Dinamikus nd tömb Fájlkezelés Def függvény 2D tömb mutatótömb Kétdimenziós tömb átvétele egyben átvétel 2D tömbként csak ha az oszlopok száma ismert 1 void print_ array ( char array [][2], size_t nrows ) 2 { 3 size_t row, col ; 4 for ( row = 0; row < nrows ; ++ row ) 5 { 6 for ( col = 0; col < 2; ++ col ) 7 printf ("%c", array [ row ][ col ]); 8 printf ("\n" ); 9 } 10 } A függvény használata 1 char a [3][2]; 2... 3 print_ array (a, 3); /* 3 soros tö mb ki írá sa */ Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 17 / 44

Dinamikus nd tömb Fájlkezelés Def függvény 2D tömb mutatótömb Kétdimenziós tömb átvétele egyben 2D tömb átvétele mutatóként 1 void print_ array ( char * array, int nrows, int ncols ) 2 { 3 int row, col ; 4 for ( row = 0; row < nrows ; ++ row ) 5 { 6 for ( col = 0; col < ncols ; ++ col ) 7 printf ("%c", array [ row * ncols + col ]); 8 printf ("\n" ); 9 } 10 } A függvény használata 1 char a [3][2]; 2... 3 print_ array (( char *) a, 3, 2); /* 3 sor 2 oszlop */ Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 18 / 44

Dinamikus nd tömb Fájlkezelés Def függvény 2D tömb mutatótömb 2D dinamikus tömb Foglaljunk dinamikusan kétdimenziós tömböt, melyet a szokásos módon, d[i][j] indexeléssel használhatunk d d[0] d[1] d[2] d[0][0] d[0][1] d[0][2] d[0][3] d[1][0] d[1][1] d[1][2] d[1][3] d[2][0] d[2][1] d[2][2] d[2][3] 1 double ** d =( double **) malloc (3* sizeof ( double *)) ; 2 d [0] = ( double *) malloc (3*4* sizeof ( double )) ; 3 for ( i = 1; i < 3; ++ i) 4 d[ i] = d[i -1] + 4; Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 19 / 44

Dinamikus nd tömb Fájlkezelés Def függvény 2D tömb mutatótömb 2D dinamikus tömb A tömb felszabadítása d d[0] d[1] d[2] d[0][0] d[0][1] d[0][2] d[0][3] d[1][0] d[1][1] d[1][2] d[1][3] d[2][0] d[2][1] d[2][2] d[2][3] 1 free (d [0]); 2 free (d ); Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 20 / 44

Dinamikus nd tömb Fájlkezelés Def függvény 2D tömb mutatótömb Mutatótömb Mutatótömb deniálása és átadása függvénynek 1 char *s [3] = {" Mos ó", " Masa ", " Mosod á ja " }; 2 print_ strings (s, 3); s[0] s[1] s[2] M o s ó \0 M a s a \0 M o s o d á j a \0 Mutatótömb átvétele függvénnyel 1 void print_ strings ( char * strings [], size_t size ) 2 /* char ** strings is lehet */ 3 { 4 size_t i; 5 for ( i = 0; i < size ; ++ i) 6 printf ("%s\n", strings [i ]); 7 } Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 21 / 44

3. fejezet Fájlkezelés Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 22 / 44

Fájlok Fájl Fizikai hordozón (merevlemez, CD, USB drive) tárolt adat A fájlba kimentett adat nem vész el a program futása után, következ futáskor visszaolvasható A különböz hordozókon tárolt fájlokat egységes felületen kezeljük Fájlkezelés: 1 Fájl megnyitása 2 Adatok írása / olvasása 3 Fájl bezárása Kétféle fájltípus: Szöveges fájl Bináris fájl Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 23 / 44

Szöveges vs. Bináris Szöveges fájl szöveget tartalmaz, sorokra tagolódik txt, c, html, xml, rtf, svg Bináris fájl tetsz leges struktúrájú binárisan kódolt adatot tartalmaz exe, wav, mp3, jpg, avi, zip Amíg nem túl ésszer tlen, ragaszkodjunk az emberbarát szöveges tároláshoz. Nagy el ny, ha adatainkat nemcsak programok, hanem emberek is értik, szerkeszthetik. Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 24 / 44

Szöveges fájlba írás 1 # include < stdio.h > /* fopen, fprintf, fclose */ 2 int main ( void ) 3 { 4 FILE * fp ; 5 int status ; 6 7 fp = fopen (" hello. txt ", "w"); /* fá jlnyit ás */ 8 if ( fp == NULL ) /* nem siker ü lt */ 9 return 1; 10 11 fprintf (fp, " Szia, vil ág!\ n"); /* be írás */ 12 13 status = fclose ( fp ); /* lez árás */ 14 if ( status!= 0) 15 return 1; 16 17 return 0; 18 } link Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 25 / 44

Fájl megnyitása FILE *fopen(char *fname, char *mode); Megnyitja az fname sztringben megadott nev fájlt a mode sztringben megadott módon Szöveges fájlokhoz használt fontosabb módok: mode leírás "r" read olvasásra, a fájlnak léteznie kell "w" write írásra, felülír, ha kell, újat hoz létre, "a" append írásra, végére ír, ha kell, újat hoz létre visszatérési érték mutató egy FILE struktúrára, ez a fájlpointer Ha a fájlnyitás nem sikeres, nullpointerrel tér vissza Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 26 / 44

Fájl bezárása int fclose(file *fp); Lezárja az fp fájlpointerrel hivatkozott fájlt Ha a lezárás sikeres 1, 0 értékkel, egyébként EOF-fal tér vissza 1 fájlzárás lehet sikertelen. Pl. valaki kihúzta a pendrive-ot, miközben írtunk. Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 27 / 44

stdoutra / szöveges fájlba / sztringbe írás int printf( char *control,...); int fprintf(file *fp, char *control,...); int sprintf(char *str, char *control,...); A control sztringben meghatározott szöveget írja a képerny re fp azonosítójú (már írásra megnyitott) szöveges fájlba str cím (elegend en hosszú) sztringbe Visszatérési érték a beírt karakterek száma 2, hiba esetén negatív 2 Ha sztringbe írunk, automatikusan beírja a lezáró 0-t is, de nem számolja bele a kimenetbe Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 28 / 44

stdinr l / szöveges fájlból / sztringb l olvasás int scanf( char *control,...); int fscanf(file *fp, char *control,...); int sscanf(char *str, char *control,...); A control sztringben meghatározott formátum szerint olvas a billenty zetr l fp azonosítójú (már olvasásra megnyitott) szöveges fájlból str kezd cím sztringb l Visszatérési érték a kiolvasott elemek száma, hiba esetén negatív Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 29 / 44

Szöveges fájlból olvasás Írjunk programot, amely szöveges fájl tartalmát kiírja a képerny re 1 # include < stdio.h > 2 int main () 3 { 4 char c; 5 FILE * fp = fopen (" fajl. txt ", "r" ); /* fá jlnyit ás */ 6 if ( fp == NULL ) 7 return -1; /* sikertelen volt */ 8 9 /* olvas ás, am íg sikeres (1 karakter jö tt ) */ 10 while ( fscanf (fp, "%c", &c) == 1) 11 printf ("%c", c ); 12 13 fclose ( fp ); /* lez árás */ 14 return 0; 15 } link Jól gyeljük meg, hogyan olvasunk fájl végéig! Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 30 / 44

Szöveges fájlból olvasás Egy szöveges fájl kétdimenziós pontok koordinátáit tartalmazza, minden sora az alábbi formátumú x:1.2334, y:-23.3 Írjunk programot, mely beolvassa és feldolgozza a koordinátákat! 1 FILE * fp ; 2 double x, y; 3... 4 /* olvas ás, am íg sikeres (2 sz á mot olvastunk ) */ 5 while ( fscanf (fp, "x :% lf, y :% lf ", &x, &y) == 2) 6 { 7 /* feldolgoz ás */ 8 } Ismét jól gyeljük meg, hogyan olvasunk fájl végéig! Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 31 / 44

Billenty zet? Monitor? 1 scanf ("%c", &c ); 2 printf ("%c", c ); billenty zet konzol stdin program stdout konzol monitor A fenti kódrészlet nem közvetlenül a billenty zetr l olvas és monitorra ír, hanem a standard inputról (stdin) olvas, és a standard outputra (stdout) ír stdin és stdout szöveges fájlok Az operációs rendszeren múlik, hogy milyen periféria vagy egyéb fájl van hozzájuk rendelve Alapértelmezés az ábra szerint billenty zet (konzol programon keresztül) stdin stdout (konzol programon keresztül) monitor Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 32 / 44

Átirányítás Ha a programot az alábbi módon indítjuk, a standard output nem a monitorra megy, hanem a ki.txt szöveges fájlba c:\>prog.exe > ki.txt billenty zet konzol stdin program stdout ki.txt A standard input is átirányítható szöveges fájlra c:\>prog.exe < be.txt be.txt stdin program stdout konzol monitor Természetesen együtt is lehet c:\>prog.exe < be.txt > ki.txt Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 33 / 44

stdin és stdout Az stdin és stdout szöveges fájlok automatikusan nyitva vannak program indításakor az alábbi kódrészletek ekvivalensek 1 char c; 2 printf (" Hello " ); 3 scanf ("%c", &c ); 4 printf ("%c", c ); 1 char c; 2 fprintf ( stdout, " Hello " ); 3 fscanf ( stdin, "%c", &c ); 4 fprintf ( stdout, "%c", c ); Ha szöveges fájlból szöveges fájlba dolgozó programot írunk, fájlnyitás helyett használjuk a standard be- és kimenetet és az operációs rendszer átirányítási lehet ségeit Konzolról is olvashatunk fájl végéig, amit Ctrl+Z (windows) vagy Ctrl+D (linux) leütésével szimulálhatunk. Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 34 / 44

stdout és stderr A program kimenete és hibaüzenetei is különválaszthatóak a stderr szabványos hibakimenet használatával c:\>prog.exe 2> errlog.txt billenty zet konzol stdin program stdout stderr konzol errlog.txt monitor 1 if ( error ) 2 { 3 /* felhaszn áló nak, ami rá tartozik */ 4 printf ("Ké rem, kapcsolja ki \n" ); 5 /* hibakimenetre ré szletes inform á ci ó */ 6 fprintf ( stderr, " 61. kódú hiba \n" ); 7 } Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 35 / 44

Bináris fájlok Bináris fájl: A memória tartalmának bith másolata egy zikai hordozón A tárolt adat természetesen bels ábrázolás-függ Csak akkor használjuk, ha a szöveges tárolás nagyon ésszer tlen lenne már a nagy háziban sem kötelez elem Fájlnyitás és fájlzárás a szöveges fájlokhoz hasonlóan, csak a mode sztringben szerepelnie kell a b karakternek 3 mode leírás "rb" read olvasásra, a fájlnak léteznie kell "wb" write írásra, felülír, ha kell, újat hoz létre, "ab" append írásra, végére ír, ha kell, újat hoz létre 3 Az analógia kedvéért szöveges fájloknál bevett szokás a t (text) szerepeltetése, de ezt az fopen gyelmen kívül hagyja Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 36 / 44

Bináris fájl írása olvasása size_t fwrite (void *ptr, size_t size, size_t count, FILE *fp); A ptr címt l count számú, egyenként size méret, folytonosan elhelyezked elemet ír az fp azonosítójú fájlba Visszatérési érték a beírt elemek száma size_t fread (void *ptr, size_t size, size_t count, FILE *fp); A ptr címre count számú, egyenként size méret elemet olvas az fp azonosítójú fájlból Visszatérési érték a kiolvasott elemek száma Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 37 / 44

Bináris fájlok példa Az alábbi dog_array tömb 5 kutyát tárol 1 typedef enum { BLACK, WHITE, RED } color_t ; 2 3 typedef struct { 4 char name [11]; /* név max 10 karakter + lez árás */ 5 color_t color ; /* sz ín */ 6 int nlegs ; /* lá bak sz á ma */ 7 double height ; /* magass ág */ 8 } dog ; 9 10 dog dog_ array [] = /* 5 kutya tö mbje */ 11 { 12 { " bl ö ki ", RED, 4, 1.12 }, 13 { "cézár", BLACK, 3, 1.24 }, 14 { " buksi ", WHITE, 4, 0.23 }, 15 { " spider ", WHITE, 8, 0.45 }, 16 { " mici ", BLACK, 4, 0.456 } 17 }; link Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 38 / 44

Bináris fájlok példa A dog_array tömb kiírása bináris fájlba enyire egyszer! 1 fp = fopen (" dogs. dat ", " wb " ); /* hibakezel és!!! */ 2 if ( fwrite ( dog_array, sizeof ( dog ), 5, fp )!= 5) 3 { 4 /* hibajelz és */ 5 } 6 fclose ( fp ); /* ide is!!! */ A dog_array tömb visszaolvasása sem bonyolultabb 1 dog dogs [5]; /* tá rhely foglal ás */ 2 fp = fopen (" dogs. dat ", " rb " ); 3 if ( fread ( dogs, sizeof ( dog ), 5, fp )!= 5) 4 { 5 /* hibajelz és */ 6 } 7 fclose ( fp ); Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 39 / 44

Bináris fájlok példa Álljunk ellen a csábításnak! Ha egy másik gépen a dog struktúra bármely tagjának ábrázolása eltér, a kimentett adatokat ott nem tudjuk visszaolvasni Az átgondolatlanul kimentett bináris fájlok a programot hordozhatatlanná teszik Az átgondolt kimentés természetesen jóval bonyolultabb 1 Megállapodunk az ábrázolásban melyik bit az LSB? kettes komplemens? hány bites a mantissza? struktúra elemei szóhatárra illesztettek? És az mekkora? stb 2 Az adatokat konvertáljuk, majd kiírjuk Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 40 / 44

Bináris vs szöveges Csináljuk inkább szövegesen, mindenki jobban jár! A dog_array tömb kiírása szöveges fájlba 1 for ( i = 0; i < 5; ++ i) { 2 dog d = dog_array [i ]; 3 fprintf (fp, "%s,%u,%d,% f\n", 4 d. name, d. color, d. nlegs, d. height ); 5 } A dog_array tömb beolvasása szöveges fájlból 4 1 dog dogs [5]; /* tá rhely foglal ás */ 2 for ( i = 0; i < 5; ++ i) { 3 dog d; 4 fscanf (fp, "%s,%u,%d,% lf ", 5 d. name, &d. color, &d. nlegs, &d. height ); 6 dogs [ i] = d; 7 } 4 feltételezzük, hogy a kutya neve nem tartalmaz whitespace karaktert Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 41 / 44

Státuszjelz függvények int feof(file *fp); igaz, ha elértük a fájl végét, hamis egyébként int ferror(file *fp); igaz, ha hiba történt íráskor-olvasáskor, hamis egyébként A legtöbbször nincs szükség rájuk, használjuk az író-olvasó függvények visszatérési értékét! Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 42 / 44

Státuszjelz függvények A tipikus hiba 1 while (! feof ( fp )) 2 { 3 /* elem beolvas á sa */ 4 5 /* elem feldolgoz á sa */ 6 } elem elem elem EOF feof() akkor lesz igaz, ha már beolvastuk a fájl vége jelet. Mit is tanultunk a végjeles vektorról? 1 /* elem beolvas á sa */ 2 while (! feof ( fp )) 3 { 4 /* elem feldolgoz á sa */ 5 /* elem beolvas á sa */ 6 } Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 43 / 44

Köszönöm a gyelmet. Farkas B., Fiala P., Vitéz A., Zsóka Z. Memóriakezelés Fájlkezelés 2016. október 15. 44 / 44