Pénzügyi algoritmusok A C++ programozás alapjai Folyamok kezelése Fájlok írása/olvasása
Folyamok kezelése Szabvány folyamok
Eddig Kiírás a szöveges konzolra: << operátor Szöveggé alakítás Az ostream osztály példánya cout Beolvasás a szövegeskonzolról: cin >> operátor Különböző adattípusok beolvasása Az istream osztály példánya A cout és a cin mind ún. adatfolyamok
Folyamok Folyam (stream): Adatsor, ami írható és/vagy olvasható Többféle forrás/cél lehetséges Szöveges konzol, fájl, hálózati kapcsolat, stb. Szabvány folyamok: cin: cout: cerr: clog: szöveges konzolos bemenet szöveges konzolos kimenet hibajelzésekre naplózásra
String Stream A string osztály példányaiból is készíthető folyam Olvasáskor a sztring elejéről indulva olvasunk Íráskor az aktuális írási pozíciótól kezdve felülírunk Tipikus használata: Olvasás Teljes sor feldolgozása típushelyesen (pl. "5 a 7" [5; 'a'; 7]) Szöveg számmá alakítása (pl. "1.2" 1.2) Írás Változók sztringgé alakítása (pl. 1.2 "1.2") Adatelemek összefűzése sztringgé (pl. [5; 'a'; 7] "5 a 7") Az <sstream> könyvtárban található
String Stream példa string s = "3.14"; float f; int i=5; stringstream(s) >> f; cout << "float: " << f << endl; Új stringstream objektum s-ből, majd float kiolvasása stringstream ss(s); ss << i; f értéke 3.14 cout << "string: " << ss.str() << endl;
String Stream példa string s = "3.14"; float f; Új stringstream objektum s-ből int i=5; (s lemásolódik) stringstream(s) >> f; cout << "float: " << f << endl; stringstream ss(s); ss << i; i beírása a folyamba cout << "string: " << ss.str() << endl; A kiírt érték "5.14" A folyam belsejében lévő sztring kiolvasása
Hibakezelés A folyamok kiértékelhetők bool-ként Igaznak számítanak, ha készen állnak további műveletekre Hamisnak, ha vége a bemenetnek vagy hiba történt Állapotlekérdező függvények bad(): igaz, ha nem sikerült egy írás vagy olvasás fail(): mint a bad() + ha beolvasáskor nem jó a formátum Pl. karaktert olvasunk szám helyett eof(): nincs több olvasható adat good(): igaz, ha egyik előző sem igaz Az állapot a clear() függvénnyel törölhető
Hibakezelés kivételekkel cin.exceptions( ios::failbit ios::badbit ); int i; try Bitmaszk jelöli azokat a { hibákat, amikre kivételt cin >> i; szeretnénk kapni } catch (ios::failure e) { std::cout << "Error!" << endl; }
Hibakezelés kivételekkel cin.exceptions( ios::failbit ios::badbit ); int i; try { cin >> i; } catch (ios::failure e) { std::cout << "Error!" << endl; } A kivétel típusa failure, ami (többek között) az ios osztályban definiált
Fájlok írása/olvasása Fájl folyamok
Fájl folyamok Folyamok készíthetők fájlokból is A folyam forrása/célja ilyenkor egy fájl Háromféle fájl folyam van (<fstream>) ofstream: kimeneti fájl folyam, fájlok írására ifstream: bemeneti fájl folyam, fájlok olvasására fstream: kétirányú fájl folyam, fájlok írására/olvasására
<iostream> Folyamok áttekintés ios <sstream> <fstream> istream ostream ifstream iostream ofstream fstream stringstream
Fájlok megnyitása Az open( "filename", mode ) tagfüggvénnyel vagy konstruktorban A fájl neve lehet abszolút vagy relatív elérési út is Módok (szabadon kombinálhatók a operátorral): ios::in ios::out ios::binary ios::ate ios::app ios::trunc Megnyitás olvasásra Megnyitás írásra Megnyitás bináris módban Kezdőpozíció a fájl végén Írás a fájl végére illeszt (append) Ha létező fájl, akkor tartalma felülíródik Sikeresség ellenőrizhető: is_open() tagfüggvény
Fájl bezárása A fájl közös erőforrás Amíg a fájl nyitva van, más nem fér hozzá Lehetőleg mihamarabb szabadítsuk fel Fájl bezárása: close() tagfüggvény Minden módosítást kiír a fájlba és bezárja A destruktor is meghívja DE: akkor már nehéz hibát kezelni Célszerű mindig bezárni a fájlt használat után Bezárás után az objektum újra használható
Szöveges fájlok Alapértelmezés szerint a fájlok szövegesek Szöveges adatok írhatók bele/olvashatók ki belőle A karakterkódolás problémákat okozhat! Íráskor minden adatot szövegesen kell reprezentálni (serializing) Olvasáskor minden adatot szöveges formából kell visszaállítani (parsing) Olvasásra és írásra >> és << operátorok Teljes sor kiolvasására: getline( stream, buffer) A buffer egy string objektum
Kurzorpozíció A folyamok belül nyilvántartanak Írási pozíciót és/vagy Olvasási pozíciót Pozíciók lekérdezése (streampos típust ad vissza): tellg() tellp() Pozíciók beállítása seekg( pos ) seekp( pos ) olvasási ( get ) pozíció írási ( put ) pozíció olvasási ( get ) pozíció írási ( put ) pozíció
Kurzorpozíció A folyamok belül nyilvántartanak Írási pozíciót és/vagy olvasási pozíciót Pozíciók lekérdezése/beállítása: tellg() / seekg( pos ) olvasási ( get ) pozíció tellp() / seekp( pos ) írási ( put ) pozíció ios::streampos típussal seekg( offset, dir ) seekp( offset, dir ) offset: ios::streamoff típusú eltolás dir: eltolás viszonyítási pontja (ios::beg, ios::cur vagy ios::end)
Bináris fájlok használata Bináris módban az adatok a memóriabeli képük szerint, bit szinten íródnak a fájlba Ehhez nem a >> és << operátorok használatosak Írás: write( memory_block, size ) Olvasás: read( memory_block, size ) A memory_block egy char* pointer az adat elejére Tetszőleges változóra: (char*)&variable A size az adat mérete
Bufferek, szinkronizáció Az írás (olvasás) nem mindig közvetlenül történik Különösen fájloknál nem Célszerű több műveletet összegyűjteni egy bufferben A buffer kiírása (feltöltése) a szinkronizáció Szinkronizáció történik: A fájl (vagy más célpont/forrás) bezárásakor (close fv.) Ha megtelik a buffer (automatikus) endl és flush beillesztésekor a << operátorral sync() függvény meghívásával Hiba esetén a visszatérési érték -1
Fájlrendszer kezelése A C++ szabvány nem definiál olyan módszert, amivel fájlokat és mappákat lehetne kezelni Adott fájl tartalmának kezelésére valók a folyamok Fájl létrehozása is lehetséges folyamokkal (lásd open) Nem támogatott: Fájlok felsorolása egy mappában Fájl törlése, áthelyezése Mappa létrehozása, törlése, áthelyezése Ezekre a műveletekre platformspecifikus megoldások vagy külső, nem szabványos könyvtárak használhatók. http://stackoverflow.com/questions/612097/how-can-i-get-the-list-of-files-in-a-directory-using-c-or-c
Köszönöm a figyelmet!