Számítástechnika I. BMEKOKAA152 10. előadás Mutatók, File Kezelés. Dr. Bécsi Tamás



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

Programozás I gyakorlat

Programozás II. Fájlkezelés

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

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

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.

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

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

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

Információs Technológia

Példák tematikus csoportosításban

Bevezetés a C++ programozási nyelvbe

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

Körkörös listák. fej. utolsó. utolsó. fej

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

A táblázatkezelő felépítése

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

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

Ablakok használata. 1. ábra Programablak

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

Információs Technológia

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

Dinamikus memóriakezelés Fájlkezelés

Mikrokontrollerek. Tihanyi Attila május 8

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

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

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Console I/O, Operátorok. Dr. Bécsi Tamás 2. Előadás

117. AA Megoldó Alfréd AA 117.

C++ programozási nyelv Struktúrák a C++ nyelvben Gyakorlat

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

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

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

3. Gyakorlat Ismerkedés a Java nyelvvel

Osztály szint tagok. Krizsán Zoltán 1 [2012. március 12.] Objektumorientált programozás C# alapokon tananyag

1. Alapok. Programozás II

7. gyakorlat Sorozatok, Fájlkezelés

Bevezetés a programozásba 2

VHDL szimuláció. Tervezés. Labor II. Dr. Hidvégi Timót

Programozás alapjai 1. (BMEVIEEA100)

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

Feladat: Hogyan tudunk létrehozni egy olyan vector nevű tömb típust, amely egy háromdimenziós térbeli vektort reprezentál?

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

HENYIR felhasználói dokumentáció

Párhuzamos programozás

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.

C programozás. 2 óra A C nyelv típusai

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

A PROGAMOZÁS ALAPJAI 1. Függvény mint függvény paramétere. Függvény mint függvény paramétere. Függvény mint függvény paramétere

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

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.

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

Programozási Nyelvek: C++

KOVÁCS BÉLA, MATEMATIKA I.

Bevezetés a C++ programozásba

C# gyorstalpaló. Készítette: Major Péter

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

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

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

C PROGRAMOZÁS KÖZÉPISKOLÁSOKNAK...

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

Programozás I gyakorlat. 5. Struktúrák

TCP/IP SOCKET INTERFACE

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

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

Programozás alapjai II. (2. ea) C++

Programozás alapjai II. (2. ea) C++

EPER E-KATA integráció

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

Arany Dániel Matematikai Tanulóverseny 2011/2012-es tanév első (iskolai) forduló haladók I. kategória

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

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

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

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

A döntő feladatai. valós számok!

Lineáris algebra gyakorlat

A Hozzárendelési feladat megoldása Magyar-módszerrel

Stack Vezérlés szerkezet Adat 2.

Az aktiválódásoknak azonban itt még nincs vége, ugyanis az aktiválódások 30 évenként ismétlődnek!

Csoportosított adatok megjelenítése sorhalmaz függvények használatával

Java II. I A Java programozási nyelv alapelemei

Adatok ábrázolása, adattípusok. Összefoglalás

Az első lépések. A Start menüből válasszuk ki a Minden program parancsot. A megjelenő listában kattintsunk rá az indítandó program nevére.

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

INFORMATIKAI ALAPISMERETEK

Programozas 1. Strukturak, mutatok

Analízis elo adások. Vajda István október 3. Neumann János Informatika Kar Óbudai Egyetem. Vajda István (Óbudai Egyetem)

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

AWP TELEPÍTÉSE- WINDOWS7 64 OPERÁCIÓS RENDSZEREN

A Felhasználónév és Jelszó mezőkbe írjuk be az adatainkat, majd kattintsunk a Bejelentkezés gombra, vagy üssük le az Enter billentyűt.

1. Metrótörténet. A feladat folytatása a következő oldalon található. Informatika emelt szint. m2_blaha.jpg, m3_nagyvaradter.jpg és m4_furopajzs.jpg.

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

Árverés kezelés ECP WEBSHOP BEÉPÜLŐ MODUL ÁRVERÉS KEZELŐ KIEGÉSZÍTÉS. v ECP WEBSHOP V1.8 WEBÁRUHÁZ MODULHOZ

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

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

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Nagyméretű dokumentumok hivatkozásai

Időzített rendszerek és az UPPAAL

Adatbázis használata PHP-ből

typedef : típusnév definiálása

Átírás:

Számítástechnika I. BMEKOKAA152 10. előadás Mutatók, File Kezelés Dr. Bécsi Tamás

Dinamikus memóriafoglalás void * malloc ( size_t size ); Lefoglal size byte memóriát, visszatér az elejével Hiba esetén NULL a visszatérési érték void * calloc ( size_t num, size_t size ); Lefoglal size*num byte memóriát, és minden bíte értékét 0-ra állítja, majd visszatér az a memóriaterület elejével Hiba esetén NULL a visszatérési érték void * realloc ( void * ptr, size_t size ); Megváltoztatja a lefoglalt memóriaterület méretét Amennyiben az adott helyen nem fér el, új helyen foglalja le, és átmásolja a tartalmat Hiba esetén NULL a visszatérési érték void free ( void * ptr ); Felszabadítja a lefoglalt memóriát 2

Dinamikus memóriafoglalás sizeof A fordítás idején hatásos sizeof unáris operátor bármilyen C nyelvű objektum méretének meghatározására használható. A sizeof objektum és sizeof (típusnév) kifejezések egy egész számot adnak eredményül, ami a megadott objektum vagy adattípus bájtokban mért mérete. 3

Példa dinamikus memóriafoglalásra malloc #include<stdio.h> #include<stdlib.h> int main(void) unsigned m,i; double *t; printf("mekkora tomb kell? "); scanf("%u",&m); // Memóriafoglalás t=(double*)malloc(m*sizeof(double)); if(t==null) printf("sikertelen allokalas.\n"); return 1; // Innentől úgy használjuk, mint egy közönséges tömböt. for(i=0;i<m;i++) t[i]=i; for(i=m-1;i+1!=0;i--) printf("%g ",t[i]); // felszabadítás, ha már nem kell free(t); return 0; 4

Példa dinamikus memóriafoglalásra 2. realloc #include <stdio.h> #include <stdlib.h> int main() int *t,n=5,i,szam; t=(int*) malloc(n*sizeof(int)); for (i=0;i<n;i++) *(t+i)=i; Irj be egy szamot, es hozzafuzom:123 Ime: 0 1 2 3 4 123 printf("irj be egy szamot, es hozzafuzom:"); scanf("%d",&szam); t=(int*) realloc(t,(n+1)*sizeof(int)); t[n]=szam; printf("ime:\n"); for (i=0;i<n+1;i++) printf("%d ",t[i]); free(t); 5

6.2. Struktúrák és függvények Struktúra mutatók Ha nagy struktúrát kell átadnunk egy függvénynek, akkor sokkal hatékonyabb, ha a struktúra mutatóját adjuk át és nem pedig a teljes struktúrát másoljuk át. A struktúra mutatójának deklarációja: struct pont *pp; Ez egy struct pont típusú struktúrát kijelölő mutatót hoz létre. Ha pp egy pont struktúrát címez, akkor *pp maga a struktúra, és (*pp).x, ill. (*pp).y pedig a struktúra tagjai. A pp értékét felhasználva pl. azt írhatjuk, hogy struct pont kezdet, *pp; pp = &kezdet; printf("kezdet: (%d, %d)\n", (*pp).x, (*pp).y); 6

6.2. Struktúrák és függvények Struktúra mutatók A zárójelre a (*pp).x kifejezésben szükség van, mert a. struktúratag operátor precedenciája nagyobb, mint a * operátoré. A *pp.x kifejezés azt jelentené, mint a *(pp.x), ami viszont szintaktikailag hibás, mivel jelen esetben x nem mutató. A struktúrák mutatóit gyakran használjuk rövidített jelölési formában. Ha p egy struktúra mutatója, akkor a p-> struktúratag kifejezés közvetlenül a struktúra megadott tagját címzi. 7

6.2. Struktúrák és függvények Struktúra mutatók A. és -> struktúraoperátorok a függvény argumentumát tartalmazó () kerek és az indexet tartalmazó [] szögletes zárójelekkel együtt a legmagasabb precedenciájú operátorok, így rendkívül szorosan kötnek. Például, ha adott a struct int hossz; char *str; *p; deklaráció, akkor a ++p->hossz kifejezés a hossz változót inkrementálja és nem a p-t, mivel a precedencia-szabályoknak és a végrehajtási sorrendnek megfelelő alapértelmezés ++(p->hossz). A kötés zárójelezéssel változtatható meg, pl. a (++p)->hossz a hossz változóhoz való hozzáférés előtt inkrementálja a p értékét, a (p++)->hossz pedig a hozzáférés után inkrementál. 8

File Kezelés Alapfogalmak Cél: Adatok tárolása számítógépen Kétféle file típust különböztetünk meg: szöveges (text) Olvasható file, (Jegyzettömb/Notepad stb.) Jellemzően szövegeket tartalmaz bináris (binary) Adatok kezelése olyan formátumban, ahogy a memóriában van. Alapvetően a kettő között nincs nagy különbség, csak néhány esetben, pld. a sorlezárásoknál 9

File Kezelés Lépések 1. File Mutató FILE *fp; 2. Megnyitás FILE *fopen(const char *filename, const char *mode); 3. Műveletek Pozícionálás Írás/olvasás 4. Bezárás int fclose(file *a_file); 10

File Megnyitása FILE *fopen(const char *filename, const char *mode); FILE *fopen(filenév, megnyitási mód); A filenév elérési úttal, vagy a nélkül tartalmazza a file nevét Sikertelen megnyitás esetén a file mutató NULL értékkel tér vissza Például: FILE *f; //File pointer f = fopen("c:\\proba\\teszt.txt","w");//megnyitás if (f==null) printf("hiba!"); return 2; 11

File kezelés Megnyitási módok r,w,a (read, write, append) b (binary) (hiánya esetén text mode) + (update) r w a r+ w+ a+ rb wb ab r+b w+b a+b rb+ wb+ ab+ Léteznie kell x x Létrehozás, ha létezik, törlődik x x Olvasható tetszőleges pozícióban x x x x Írható tetszőleges pozícióban x x x Csak a végére írhatunk (hozzáfűzés) x x 12

File Kezelés Írás text módban int fputs ( const char * str, FILE * stream ); Az str által átadott stringet írja a stream (file)-ba. \0 karakterig ír, az már nem kerül be Siker esetén egy nemnegatív számmal tér vissza int fputc ( int character, FILE * stream ); Az átadott character t írja a stream (file)-ba Siker esetén visszaadja a karaktert int fprintf ( FILE * stream, const char * format,... ); Hasonlóan működik, mint a printf, csak file-ba ír. 13

File Kezelés Írás text módban, példa int filecreate(char filename[]) FILE *f; //File mutató char c; int i; f = fopen(filename,"w"); // Megnyitás írásra (kiürítés) if (f==null) printf("hiba!"); return 1; for (i = 1; i <=4; i++) fputs("sor:",f); //Sor beírása fputs segítségével fprintf(f,"%d.", i); //fprintf, mint a printf for (c='a';c<'a'+i;c++) fputc(c,f); //Egy karakter beírása fprintf(f,"\n"); //Sor lezárása \n-el fclose(f); // file bezárása return 0; 14

File Kezelés Olvasás text módban char * fgets ( char * str, int num, FILE * stream ); str-be karaktereket olvas be a stream (file)-ból Az olvasás (num-1) karakterszám elérésekor, új sor, vagy file vége esetén ér véget. Hiba esetén, illetve ha már nincs mit beolvasni a file végéről, NULL mutatóval tér vissza int fgetc ( FILE * stream ); Visszaadja a karaktert, az aktuális file pozícióból, a pozíció egyet lép Hiba, vagy file vége esetén EOF (-1) a visszatérési érték int fscanf ( FILE * stream, const char * format,... ); Hasonlóan működik, mint a scanf, csak file-ból olvas. 15

File Kezelés Olvasás text módban, fgetc int listfile(char filename[]) FILE *f; //File pointer char c; // Megnyitás olvasásra if ((f = fopen(filename,"r"))==null) return 1; c=fgetc(f); while(c!=eof) printf("%c",c); c=fgetc(f); fclose(f); // File bezárása return 0; 16

File Kezelés Olvasás text módban, fgets int readline_file(char filename[]) FILE *f; //File pointer char s[200]; f = fopen(filename,"r"); // megnyitás olvasásra while(fgets(s,200,f)!=0) printf("%s",s); fclose(f); //Bezárás return 0; 17

File Kezelés Hozzáfűzés int append_file(char filename[]) FILE *f; //File pointer char s[200]; f = fopen(filename,"a"); // Megnyitás hozzáfűzésre fprintf(f,"hu, de hozzafuztem egy sort..."); fclose(f); 18

File kezelés Pozícionálás int fseek ( FILE * stream, long int offset, int origin ); A File olvasás/írás aktuális pozícióját állítja be az origin-ben megadott helyhez viszonyítva offset távolságra Írás és Olvasásra megnyitott file-ok esetén az fseek meghívása szükséges a kétféle operáció közötti váltáshoz. Siker esetén 0-val tér vissza. Konstans kifejezés az origin mezőben SEEK_SET SEEK_CUR SEEK_END referencia pozíció A file Eleje Az aktuális pozíció A file vége 19

File kezelés Pozíció lekérés long int ftell ( FILE * stream ); Visszaadja az aktuális pozíciót a File-ban Hiba esetén a visszatérési érték -1 20

File kezelés Pozícionálás, példa int readwrite_char_file(char filename[]) FILE *f; //File pointer char c; f = fopen(filename,"r+"); // olvasás/írás c=fgetc(f); while(c!=eof) if (c=='.') fseek(f,-1,seek_cur); //Pozícionálás fputc(' ',f); fseek(f,0,seek_cur); //Csak a módok közötti váltás miatt! c=fgetc(f); fclose(f); // File bezárása return 0; 21

File Kezelés Bináris mód size_t fread ( void * ptr, size_t size, size_t count, FILE * stream ); ptr-be olvas count darab size byte méretű adatot a stream file-ból, az aktuális file pozícióból. Visszatérési értéke a sikeresen beolvasott adatok száma. size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream ); count darab size byte méretű adatot ír a stream file-ba, az aktuális file pozícióban. Az aktuális file pozíció értelemszerűen az írás végére változik visszatérési értéke a beírt elemek száma (count siker esetén) 22

Bináris file kezelés Példa 1 void decimalfile() int i; FILE *f=fopen("szamok.dat", "wb"); for (i=0;i<10;i++) fwrite(&i,sizeof (int),1,f); fclose(f); 23

Bináris file kezelés Példa 2 struktúra struct tember int kor;char nev[11];; 1: mbc 1 2: bbc 7 void createfile(char fn[]) 3: bbc 38 4: zbc 30 struct tember e=65,"abc"; 5: cbc 24 int i; FILE *f=fopen(fn, "wb"); srand(time(0)); for (i=0;i<5;i++) e.nev[0]='a'+rand()%26; e.kor=rand()%40; fwrite(&e,sizeof (struct tember),1,f); fclose(f); 24

Bináris file kezelés Példa 3 listázás void listfile(char fn[]) struct tember e=65,"abc"; int i=1; FILE *f=fopen(fn, "rb"); while (fread(&e,sizeof (struct tember),1,f)) printf("%2d: %5s %d \n",i++,e.nev,e.kor); fclose(f); 1: mbc 1 2: bbc 7 3: bbc 38 4: zbc 30 5: cbc 24 25