Bevezetés a programozásba I. 8. gyakorlat Fájlkezelés Surányi Márton PPKE-ITK 2010.11.02.
Fájlkezelés C++-ban C++-ban van lehet ségünk fájlok kezelésére. Itt már tényleges fájlokkal dolgozunk, nem pedig szimuláljuk a m ködésüket (PlanG). Megkülönböztetünk be- illetve kimeneti fájlokat.
Megynitás a bemeneti fájl típusa: ifstream deklarálás: ifstream [változónév]; (Pl: ifstream f;) a kimeneti fájl típusa: ofstream, deklarálás hasonlóan
Megnyitás megnyitás: [változónév].open([fizikai-fájlnév]) Például: f.open("myfile.txt"); FONTOS! Ha string-et akarunk átadni a fájlnévként, akkor azt el ször karaktertömbbé kell konvertálni: Például: f.open(fname.c_str()); (másképpen fordítási hiba)
Megnyitás ha a megynitás során hiba lépett fel (pl. nem létezik a fájl, vagy nincs jog az olvasáshoz), akkor a következ kifejezés igazat fog adni. [változónév].fail() Ezzel ellen rizhetjük, hogy sikerült-e a megnyitás. Például: if (f.fail()) { cout «"Hiba a megnyitasnal,kilepunk." «endl; return 0; }
Megnyitás - megjegyzés A megnyitást és deklarálás összevonhatjuk egy sorba: eredetileg így nézett ki: ifstream ifs; // deklarálás ifs.open("fajlnev"); // megnyitás helyette írhatjuk ezt: ifstream ifs("fajlnev"); Így egyb l megnyitja a fájlt.
Beolvasás Egy értéket így tudunk beolvasni: f» in; (ahol f egy ifstream tipusú változó) Attól függ en, hogy in milyen tipusú, olyan adatot fog beolvasni, illetve olyat vár. Ha nem olyat kap, akkor hibás lesz a beolvasás. Pl: ha int tipusú, és szöveget talál a fájlban, akkor nem lesz jó a beolvasás
Beolvasás Ha egy teljes sort szeretnénk beolvasni, akkor érdemes a getline függvényt használni, csakúgy, mint konzolos beolvasásnál. (az f str; csak egy szót fog beolvasni) getline(f, in); Szintaktikája: getline(honnan, hova) Nem kötelez tudni, de nagyon hasznos: a getline-nak megadható egy harmadik paraméter is: getline(f, in, a ) Szintaktikája: getline(honnan, hova, meddig) Ahol meddig egy karakter (char)!
EOF Mivel nem tudjuk, hogy a fájlban mennyi adat van, ezért szükség van az eof() tagfüggvényre, ami akkor ad igazat, ha vége van a fájlnak. (a függvény visszatérési típusa: bool) Használat: [változónév].eof(); f.eof(); Példa: Megjegyzés Érdemes az eof() helyett a good()-ot használni, ami több mindent ellen riz, és hamisat ad, (többek között) ha elértük a fájl végét.
Lezárás Bár a fájl a program befejeztével lezáródik, érdemes lezárni, ha már nem használjuk: f.close();
Fájlba írás A kimeneti fájl típusa: ofstream Megnyitás: bemenethez hasonlóan: f.open("fajlnev.txt"); Ha megnyitjuk a kimeneti fájlt, akkor a fájl létrejön (ha már létezett, akkor a tartalma kitörl dik!) Ha sikertelen a fájlmegnyitás (pl. nincs írási jog az adott mappába), akkor az f.fail() igazat fog adni. Írás: a operátorral: pl: f ki; Lezárás ugyanúgy: f.close();
Vegyes feldolgozás mixed.cpp: Adott egy fájl, benne keresztnevek és életkorok. Feladatok: Adjuk meg az átlagéletkort! Adjuk meg a legid sebb és a legatalabb ember nevét, és életkorát! Példa fájlra: nevek.txt Cili 12 Budapest Béla 23 Győr Gábor 20 Debrecen (táblánál megoldva)
Feladatok gy-8-1.cpp: Egy fájlban egész számok találhatóak. Adjuk meg az átlagot, az 5-nél nagyobbak számát, és a legkisebb számot! Ne a konzolra írjuk ki, hanem a kimenet.txt-be! gy-8-2.cpp: Egy fájlban számok találhatóak. Adjuk meg, hogy növekv sorrendben vannak-e! gy-8-3.cpp: Egy fájlban szavak találhatóak (egy sorban több szó is lehet!). Adjuk meg a leghosszabb szót! Adjuk meg a nem-whitespace karakterek, és a szavak számát! Figyeljünk a hibakezelésre ( f.fail() )!
Házi feladat III-36.cpp: Fájlban koordinátákkal adott pontsorozatban add meg az origótól legtávolabb es pontot! (feltesszük, hogy egy sorban egy pont adatai, tehát két szám van) III-21.cpp: Egy tetsz leges, fájlból beolvasott szövegr l add meg, hány számjegy, hány nagybet és hány kisbet van benne! (Tipp: ASCII-tábla) (FIGYELEM! Ha egy karakter nem kisbet, akkor nem biztos, hogy nagybet!) III-15a.cpp: Egy fájlból beolvasott, szigorúan növ egész számsorban add meg a legnagyobb ugrást (szomszédos elemek közötti legnagyobb el forduló különbséget)! Figyeljünk a hibakezelésre ( f.fail() )!
Szorgalmi feladat SZORGALMI.cpp Egy fájlban szavak és egész számok találhatóak (szóközökkel tagolva), de a sorrendjük nem ismert. Olvassuk be ket megfelel en! A számokat adjuk össze, írjuk ki; a szavak közül pedig keressük meg a leghosszabbat, és írjuk ki! (olyan is lehetséges, hogy több szó van egymás után! pl: 2 alma banán 12 körte 6 78)