Bevezetés a programozásba I 7. gyakorlat. C++: szövegkezelés, szekvenciális fájlkezelés. Szövegkezelés Karakterkezelés

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

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

Bevezetés a programozásba I.

Alkalmazott modul: Programozás 2. előadás. Procedurális programozás: adatfolyamok, adatsorok kezelése

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

Alkalmazott modul: Programozás 2. előadás. Procedurális programozás: adatfolyamok, adatsorok kezelése. Adatfolyamok kezelése. Adatfolyamok kezelése

Alkalmazott modul: Programozás 2. fejezet. C++ alapismeretek. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

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

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

Bevezetés a programozásba I.

Alkalmazott modul: Programozás. C++ alapismeretek. C++ alapismeretek Történet

Bevezetés a programozásba I 3. gyakorlat. PLanG: Programozási tételek. Programozási tételek Algoritmusok

Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával)

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

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

Bevezetés a C++ programozásba

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

Bevezetés a programozásba. 6. Előadás: C++ bevezető

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

Programozás C++ -ban 2007/1

Bevezetés a programozásba I.

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

1. Alapok. Programozás II

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

ELTE SAP Excellence Center Oktatóanyag 1

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

Maximum kiválasztás tömbben

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

Pénzügyi algoritmusok

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):

Operációs rendszerek. 11. gyakorlat. AWK - szintaxis, vezérlési szerkezetek UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

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

Programozási alapismeretek beadandó feladat: ProgAlap beadandó feladatok téma 99. feladat 1

Bánsághi Anna 2014 Bánsághi Anna 1 of 35

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

Programozás I. gyakorlat

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

Operációs rendszerek. 9. gyakorlat. Reguláris kifejezések - alapok, BASH UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

7. Laboratóriumi gyakorlat: Vezérlési szerkezetek II.

BASH SCRIPT SHELL JEGYZETEK

Alkalmazott modul: Programozás. Programozási tételek, rendezések. Programozási tételek Algoritmusok és programozási tételek

Listák, szótárak, fájlok Listák, szótárak, fájlok

Programozás C és C++ -ban

Informatika terméktervezőknek

Objektumorientált Programozás IV.

BASH script programozás II. Vezérlési szerkezetek

Bevezetés a programozásba II 1. gyakorlat. A grafikus könyvtár használata, alakzatok rajzolása

INFORMATIKA tétel 2017

Objektum Orientált Programozás IV.

5. Gyakorlat. struct diak {

Vezérlési szerkezetek

Programozás I gyakorlat

Programozási alapismeretek 2009/2010

AWK programozás, minták, vezérlési szerkezetek

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

1. Alapok. #!/bin/bash

1. gyakorlat

7. fejezet: Mutatók és tömbök

INFORMATIKA javítókulcs 2016

Programozás alapjai. 5. előadás

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

1. Egyszerű (primitív) típusok. 2. Referencia típusok

Bevezetés a programozásba I.

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

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

2018, Funkcionális programozás

Algoritmizálás és adatmodellezés tanítása beadandó feladat: Algtan1 tanári beadandó /99 1

AWK programozás, minták, vezérlési szerkezetek

Bánsághi Anna 2014 Bánsághi Anna 1 of 68

Elemi alkalmazások fejlesztése I. Olvassunk be egy fájlból egész számokat egy tömbbe. Keressük meg a tömb valamely

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

10. gyakorlat Tömb, mint függvény argumentum

Megjegyzés: A programnak tartalmaznia kell legalább egy felhasználói alprogramot. Példa:

Programozás C++ -ban

7. gyakorlat Sorozatok, Fájlkezelés

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

A függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi.

Feladat. Bemenő adatok. Bemenő adatfájlok elvárt formája. Berezvai Dániel 1. beadandó/4. feladat április 13. Például (bemenet/pelda.

Programozási nyelvek Python

Programozási nyelvek Java

Bevezetés a programozásba I.

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

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

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

Felvételi tematika INFORMATIKA

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):

file./script.sh > Bourne-Again shell script text executable << tartalmat néz >>

INFORMATIKA tétel 2019

II. Mérés SZÉCHENYI ISTVÁN EGYETEM GYŐR TÁVKÖZLÉSI TANSZÉK

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

// keressük meg a legnagyobb faktoriális értéket, ami kisebb, // mint százmillió

3. ZH-ban a minimum pontszám 15

Operációs rendszerek. 9. gyakorlat. BASH recap, reguláris kifejezések UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

C programozás. { Márton Gyöngyvér, 2009 } { Sapientia, Erdélyi Magyar Tudományegyetem }

Szerző. Varga Péter ETR azonosító: VAPQAAI.ELTE cím: Név: Kurzuskód:

Bevezetés a programozásba. 11. Előadás: Esettanulmány

Alkalmazott modul: Programozás. Programozási tételek, rendezések Giachetta Roberto

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

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

Webprogramozás szakkör

Átírás:

Pázmány Péter Katolikus Egyetem Információs Technológiai Kar Bevezetés a programozásba I 7. gyakorlat C++: szövegkezelés, szekvenciális fájlkezelés 2011.10.25. Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto Karakterkezelés A karakterek C++-ban ASCII kódjuk alapján vannak eltárolva, ezért amikor karakter típusú változót hozunk létre, akkor igazából egy bájtban tárolt számot ment el a gép Íj módon lehetőségünk van a számokra alkalmazott műveleteket karakterekre is alkalmazni, illetve értékül adni őket számoknak, és fordítva, pl.: char ch1 = 'a'; int ch1i = ch1; // ch1i megkapja a ASCII kódját int ch2i = 97; char ch2 = ch2i; // ch2 megkapja a 97-es ASCII kódú karaktert Továbbá lehetőségünk van az egész számra alkalmazható műveleteket használni, pl.: char ch = 'a'; cout << ++ch; // kiírja a 'b'-t PPKE ITK, Bevezetés a programozásba I 7:2 Karakterkezelés A PLanG-ban látott módon lehetőségünk van manipulálni karaktereket, illetve szövegeket A karaktereket manipuláló függvények többnyire a cctype (néha cctype.h) fájlban vannak, ezért ezt be kell raknunk a programunkba, az utasítások az std névtérben vannak A következő lehetőségeink vannak (a paraméterben konstanst vagy változót adhatunk meg, és visszakapjuk az átalakított karaktert): kisbetűvé alakítás: tolower(<karakter>) nagybetűvé alakítás: toupper(<karakter>) betű-e a karakter: isalpha(<karakter>) szám-e a karakter: isdigit(<karakter>) PPKE ITK, Bevezetés a programozásba I 7:3 Feladat: Írjuk vissza a beírt 10 szót nagy kezdőbetűvel a kimenetre. elemenkénti feldolgozással végigmegyünk a szavakon használjuk a toupper() utasítást a szó első betűjén, amit indexeléssel le tudunk kérdezni, az átalakított betűt visszatesszük a szóba bemenet: szavak sorozata (szo) kimenet: a szavak nagybetűsen PPKE ITK, Bevezetés a programozásba I 7:4 #include <cctype> for (int i = 0; i < 10; i++){ cin >> s; s[0] = toupper(s[0]); // nagybetűsítés, majd visszaírás cout << s << endl; PPKE ITK, Bevezetés a programozásba I 7:5 Szöveg műveletek A szöveget kezelő utasításokat egy adott szöveg típusú változóra kell meghívnunk <változónév>.<függvénynév>() formában a string fájl tartalmazza, ezért nem kell külön fájlt beillesztenünk a programba Jelentősebb műveletek: adott karakter lekérdezése: <szöveg>[<index>] szöveg összefűzése: <szöveg1> + <szöveg2> szöveg hosszának lekérdezése: <szöveg>.length() üres-e a szöveg: <szöveg>.empty() szöveg törlése: <szöveg>.erase() résszöveg lekérdezése: <szöveg>.substr(<kezdőindex>,<hossz>) PPKE ITK, Bevezetés a programozásba I 7:6 1

Szöveg műveletek Jelentősebb műveletek: karakter első előfordulásának helye (indexe, ha nem találja string::npos a visszatérési érték): <szöveg>.find(<karakter>) karaktertömbbé konvertálás: <szöveg>.c_str() szöveg hozzáfűzése: <szöveg>.append(<új szövegrész>) új szövegrész beszúrása: <szöveg>.insert(<index>, <új szövegrész>) szövegrész lecserélése: <szöveg>.replace(<kezdőindex>, <hossz>, <új szövegrész>) Szöveg műveletek Pl.: // s.empty() igaz lenne string s1 = "árvíztűrő"; string s2 = "tükörfúrógép"; s = s1 + " " + s2; // s = "árvíztűrő tükörfúrógép" lesz // s.empty() hamis lenne s.append("!"); // s = "árvíztűrő tükörfúrógép!" lesz s.replace(0,1,"á"); // s = "Árvíztűrő tükörfúrógép!" lesz int length = s.length(); // length = 23 lesz char ch = s[2]; // ch = 'v' lesz PPKE ITK, Bevezetés a programozásba I 7:7 PPKE ITK, Bevezetés a programozásba I 7:8 Szöveg műveletek Pl.: string sub1 = s.substr(0,5); // sub1 = "Árvíz" lesz int index1 = s.find('ő'); // index1 = 8 lesz int index2 = s.find('r'); // index2 = 1 lesz, mindig az elsőt találja meg string sub2 = s.substr(0,s.find('ő')); // sub2 = "Árvíztűrő" lesz string sub3 = s.substr(s.find("fú"), s.length() - s.find("fú")); // megkeresi az "fú"-t, annak a helye a 15 // a szöveg hossza 23, tehát venni fogja a // 8 hosszan a szöveget, sub3 = "fúrógép!" lesz s.erase(); // s = "" lesz PPKE ITK, Bevezetés a programozásba I 7:9 Feladat: Olvassunk be szavakat a billentyűzetről, és ha írjuk vissza az első négy karakterét a képernyőre, vagy ha rövidebb, akkor a teljes szót. elemenként dolgozzunk fel a szavakat, amíg *-hoz nem érünk használjunk utántesztelő ciklust először kérdezzük le a hosszt, majd ennek megfelelően írjuk ki a teljes szót, vagy az elejét bemenet: szavak (szo) sorozata kimenet: szavak első négy betűje, vagy a teljes szó PPKE ITK, Bevezetés a programozásba I 7:10 do{ cin >> s; if (s.length() < 4) // ha rövidebb cout << s << endl; else // ha nem, akkor csak az eleje kell cout << s.substr(0,4) << endl; while (s!= "*"); PPKE ITK, Bevezetés a programozásba I 7:11 Sorok olvasása Ha a >> operátort használjuk beolvasásra, akkor szöveg esetén csak az első szót olvashatjuk be a bemenetről, néha azonban szükségünk van arra, hogy nem csak egy szót, hanem egy sorban többet be tudjuk olvasni Erre a célra szolgál a getline(<forrás>,<változó>) utasítás, amely a forrás folyamról beolvas egy sort a szöveg típusú változóba nálunk a forrás a képernyő bemenete, ezért getline(cin, <szöveg változó>) formában fogjuk használni pl.: getline(cin, s); // s-be bekerül a teljes sor PPKE ITK, Bevezetés a programozásba I 7:12 2

Feladat: Olvassunk be sorokat a képernyőről, és számoljuk meg, hány kezdődik szóközzel. számlálást alkalmazunk, dolgozzunk az üres sorig használjunk előreolvasást lekérdezzük a sor első karakterét, és megnézzük, hogy szóköz-e bemenet: sorok (sor) sorozata kimenet: szóközzel kezdődő sorok száma (c) string sor; int c = 0; getline(cin, sor); // sor beolvasása while (sor!= ""){ if (sor[0] == ' ') c++; // első karakter getline(cin, sor); // sor beolvasása cout << "Szóközzel kezdődő sorok száma: " << c << endl; PPKE ITK, Bevezetés a programozásba I 7:13 PPKE ITK, Bevezetés a programozásba I 7:14 Feladat: Írjunk be minden sorba egy nevet és egy telefonszámot, és írjunk ki őket formázottan, Név: név, Szám: szám formában. elemenként dolgozzunk fel 10 sort a bementről tegyük fel, hogy csak keresztneveket írunk, és szóköz után jön a telefonszám, ekkor a szóköz előtt a név lesz, utána a telefonszám, ezért itt szét kell vágnunk a sort a find() segítségével megkapjuk a szóköz helyét, a substr() segítségével megvághatjuk a sort bemenet: sorokban (sor) tárolt adatok kimenet: a sorok kiírása formázottan string sor, nev, szam; for (int i = 0; i < 10; i++){ getline(cin, sor); // sor beolvasása PPKE ITK, Bevezetés a programozásba I 7:15 PPKE ITK, Bevezetés a programozásba I 7:16 nev = sor.substr(0, sor.find(' ')); // levágjuk a sor első részét, a szóközig szam = sor.substr(sor.find(' ') + 1, sor.length() - sor.find(' ') - 1); // megkeressük a szóköz utáni karaktert cout << "Név: " << nev << ", Szám: " << szam << endl; // formázott kiíratás Elvei A fájlkezelés módjával már megismerkedtünk PLanG-ban, C++-ban teljesen hasonló fizikai fájlnevek reprezentálják a tényleges fájlokat a tárolókon, logikai fájlnevek a programban használt változók, amelyeket társítanunk kell a fizikai fájlnévhez vannak külön kimeneti és bemeneti fájlok, egyszerre egy fájl csak egy lehet az adatokat sorban olvassuk ki és írjuk ki a fájlokba, ugrálni nem lehet az adatok között az előreolvasási technika használható De C++-ban már tényleges fizikai fájlokat kezelünk, ezért még óvatosabbnak kell lennünk a kezelésükkel PPKE ITK, Bevezetés a programozásba I 7:17 PPKE ITK, Bevezetés a programozásba I 7:18 3

Fájltípusok A fájlműveletek használatához az fstream definíciós fájlra lesz szükségünk: #include <fstream> A fájl típusok az std névtérben találhatóak: Két logikai fájltípust használhatunk, mindegyikben bármilyen adat található, amelyet bármilyen sorrendben kezelhetünk: bemeneti fájl: ifstream kimeneti fájl: ofstream a fájl a deklarálástól a programblokk végéig él, de csak akkor használhatjuk, ha társítjuk fizikai fájlhoz (különben futási idejű hibát kapunk) egy logikai fájlt több fizikai fájlhoz is társíthatunk PPKE ITK, Bevezetés a programozásba I 7:19 Fájlok megnyitása A logikai és fizikai fájl társítását kétféleképpen végezhetjük: a logikai fájlnév deklarációját követően a <logikai fájlnév>.open(<fizikai fájlnév>) parancs segítségével, pl.: ifstream f; // f nevű logikai fájl f.open("adatok.txt"); // f-t az adatok.txt fájlhoz társítjuk, // innentől az f az adatok.txt fájlon dolgozik a logikai fájl definíciójával együtt megadott paraméterben, pl.: ifstream f("adatok.txt"); // f már a létrehozásától az adatok.txt // fájlhoz van társítva PPKE ITK, Bevezetés a programozásba I 7:20 Fájlok elérése Fontos, hogy a paraméterben megadott fájlnév helyileg a generált futtatható fájl könyvtárában kell legyen Ha nem ott van, az elérési útját is meg kell adnunk (persze akkor is megadhatjuk az elérési utat, ha ugyanabban a könyvtárban dolgozunk) az elérési utat az operációs rendszer elérési útjának megfelelően kell megadnunk pl.: f.open("c:\\doksik\\inf.dat"); // Windows alatt (a \ védett karakter) f.open("/home/groberto/inf.dat"); // Linux alatt PPKE ITK, Bevezetés a programozásba I 7:21 Fájlok elérése Fizikai fájlnévként karaktertömb (char[]) típusú adatokat adhatunk meg, amit lehet változó segítségével is, ezért a program futása közben is bekérhetjük a fájlnevet Ha string típusú változóba szeretnénk bekérni a fájlnevet, akkor azt át kell alakítanunk a szövegtípusban található egy olyan függvény, amely karaktertömbbé alakítja a szöveget, ezt használjuk: <változónév>.c_str() pl.: ifstream file; // logikai fájl string fname; // egy string cin >> fname; // beolvassuk a stringet file.open(fname.c_str()); // a beolvasott fájlnevet próbáljuk megnyitni PPKE ITK, Bevezetés a programozásba I 7:22 Megnyitás ellenőrzés Nem garantált, hogy a megadott elérési úton van is egy fájl, amit a program megnyithat, ezért mielőtt bármilyen tevékenységet végzünk rajta, célszerű ellenőrizni a fájl helyességét A megnyitás sikerességét a <logikai fájlnév>.fail() függvénnyel kérdezhetjük le, ha ez igaz, akkor nem sikerült megnyitni a fájlnevet, pl.: f.open("data/bemenet.dat"); // megnyitás if (f.fail()) // ha nem sikerült megnyitni cout << "Nem sikerült megnyitni a fájlt!"; else{ // ha sikerült megnyitni // ebben az ágban dolgozhatunk a fájlon PPKE ITK, Bevezetés a programozásba I 7:23 Megnyitás ellenőrzés Ha a fájlnevet a felhasználótól kérjük be, célszerű a megnyitást ciklusba foglalni, addig kérjünk be új fájlnevet a felhasználótól, amíg nem sikerül megnyitni az adott fájlt ehhez újra kell inicializálni a fájlt a <fájlnév>.clear() utasítással, pl.: ifstream f; string fnev; cin >> fnev; f.open(fnev.c_str()); // fájl megnyitása while(f.fail()){ // ha nem sikerült megnyitni f.clear(); // fájl újrainicializálás cout << "Hibás fájlnév!" << endl; cin >> fnev; f.open(fnev.c_str()); // újbóli megnyitás PPKE ITK, Bevezetés a programozásba I 7:24 4

Fájlok bezárása Fizikai fájlt használat után be kell zárni a bezárás automatikusan megtörténik a program végén, de azért célszerű mindenképpen külön bezárást végezni, amint befejeztük a programban a fájl használatát bezárni a <logikai fájlnév>.close() függvénnyel lehet bezárást követően a logikai fájlnevet újra használhatjuk másik fizikai fájl kezelésére, pl.: ifstream input("adat.txt"); // adat.txt megnyitása input.close(); // adat.txt bezárása input.open("adat2.txt"); // adat2.txt megnyitása PPKE ITK, Bevezetés a programozásba I 7:25 Beolvasás, kiírás A fájlműveletek kimeneti fájlnál az olvasás (>> operátor), bemeneti fájlnál az írás (<< operátor) a logikai típustól függően csak az adott művelet használható írhatunk sortörést az endl utasítással az operátorokat ugyanúgy használjuk, mintha a képernyőre írnánk, azzal a különbséggel, hogy a fájlt adjuk meg célként/forrásként a képernyő helyett pl.: ofstream f("kimenet.txt"); f << "File első sora" << endl << "Második sor."; // tetszőlegesen kiírhatunk dolgokat a fájlba f.close(); PPKE ITK, Bevezetés a programozásba I 7:26 Fájl vége jel Egy fájlba bármilyen adat lehet bármilyen sorrendben, olvasásnál ezért ügyelni kell arra, hogy mindig a megfelelő típusú adatot olvassuk ki. A fájl végén most is ott van az EOF jel, amit a <logikai fájlnév>.eof() függvénnyel tudunk lekérdezni, ez igaz értéket ad vissza, ha a végére értünk, pl.: ofstream f; int data; f.open("adatok.txt"); while(!f.eof()) // amíg nincs vége a fájlnak f >> data; // addig olvasunk Beolvasásnál ugyanúgy beveszi az EOF jelet, ezért célszerű előreolvasási technikával feldolgozni a fájlokat Megjegyzések Amire érdemes odafigyelni: mielőtt elkezdünk beolvasni egy fájlból, nézzük meg, hogy sikerült-e megnyitni a megnyitott fájlt mindig zárjuk be ne olvassunk tovább, ha már elértük az EOF jelet, ha nem előreolvasást használunk és nem vagyunk biztosak a fájl tartalmában, akkor ellenőrizzük le, nem-e értünk a fájl végére, mielőtt felhasználnánk az utolsó beolvasott adatot különösen figyeljünk arra, hogy ne írjunk végtelen ciklusba fájl kiírást ha egy fájlt újra megnyitunk írásra, akkor korábbi tartalma törlődni fog a megnyitáskor PPKE ITK, Bevezetés a programozásba I 7:27 PPKE ITK, Bevezetés a programozásba I 7:28 Feladat: Írjuk ki a képernyőre a szamok.txt fájlban tárolt számok összegét. bementi fájlt feldolgozzuk összegzés tételével bármennyi szám lehet a fájlban, ezért EOF jelig dolgozunk előreolvasással bemenet: fájlban (f) számok (szam) sorozata kimenet: számok összege (s) #include <iostream> #include <fstream> int szam, s = 0; ifstream f("szamok.txt"); // megnyitás if (f.fail()){ // ha nem sikerült cout << "Rossz fájlnév!"; else { // ha sikerült PPKE ITK, Bevezetés a programozásba I 7:29 PPKE ITK, Bevezetés a programozásba I 7:30 5

f >> szam; // előreolvasás while (!f.eof()){ // amíg nincs vége s += szam; f >> szam; f.close(); // fájl bezárása cout << "A számok összege: " << s; Feladat: Olvassunk be egy fájlból szavakat, és írjuk ki egy kimeneti fájlba az a betűt tartalmazó szavakat. használjunk elemenkénti feldolgozást, a find() függvénnyel nézzük meg, hogy van-e benne a betű a fájlok neveit kérjük be a felhasználótól bemenet: szavak (szo) sorozata egy bemeneti fájlban (bf) kimenet: a betűs szavak egy kimeneti fájlban (kf) PPKE ITK, Bevezetés a programozásba I 7:31 PPKE ITK, Bevezetés a programozásba I 7:32 #include <iostream> #include <fstream> string fajl_nev, szo; ifstream bf; // bemenő fájl ofstream kf; // kimenő fájl cout << "Bemenő adatok fájlja: "; cin >> fajl_nev; bf.open(fajl_nev.c_str()); // fájl megnyitás while(bf.fail()){ // ha sikertelen cout << "Nem található a fájl!" << endl << "Bemenő adatok fájlja: "; cin >> fajl_nev; // újra bekérés bf.clear(); bf.open(fajl_nev.c_str()); cout << "Kimenő adatok fájlja: "; cin >> fajl_nev; PPKE ITK, Bevezetés a programozásba I 7:33 PPKE ITK, Bevezetés a programozásba I 7:34 kf.open(fajl_nev.c_str()); while (bf >> szo){ // beolvasással egybekötött ciklusfeltétel if (szo.find('a') < szo.length()) // ha tartalmaz a-t, kiírjuk kf << szo << endl; bf.close(); // fájlok bezárása kf.close(); PPKE ITK, Bevezetés a programozásba I 7:35 Sorok olvasása Alkalmazhatjuk a teljes sor beolvasására szolgáló getline(<logikai fájlnév>, <szöveg változó>) utasítást, amely a teljes sor tartalmát kiolvassa a sortörés kivételével egy szöveg változóba Pl.: ifstream bemenet("input.txt"); getline(bemenet, s); // előreolvasás while (!f.eof()) // amíg nincs vége a fájlnak { //... műveletek s-sel getline(bemenet, s); // következő sor beolvasása PPKE ITK, Bevezetés a programozásba I 7:36 6

Feladat: Határozzuk meg egy fájlban tárolt soroknak a hosszát, és írjuk a képernyőre. a fájlnevet kérjük be a felhasználótól, sikertelen esetben lépjünk ki a programból bemenet: sorok (sor) egy bemeneti fájlban (f) kimenet: a sorok karaktereinek száma PPKE ITK, Bevezetés a programozásba I 7:37 #include <iostream> #include <fstream> string fajl_nev, sor; ifstream f; cout << "Bemenő adatok fájlja: "; cin >> fajl_nev; f.open(fajl_nev.c_str()); if (f.fail()){ // ha sikertelen cout << "Nem található a fájl!" << endl; return 1; // kilépés PPKE ITK, Bevezetés a programozásba I 7:38 getline(f, sor); // sor beolvasása while(!f.eof()){ cout << sor.length() << endl; getline(f, sor); f.close(); Sorok olvasása A sorbeolvasás egy speciális változata, amikor nem a teljes sort olvassuk be, csak egy részét Lehetőségünk van egy adott karakterig olvasni a sort: getline(<logikai fájlnév>, <változó>, <karakter>) ekkor a harmadik helyen megadjuk azt a karaktert, aminek első előfordulásánál megáll az olvasás a határoló karaktert az utasítás eldobja, tehát nem kerül be a változóba, ugyanakkor a következő olvasás utána fog kezdődni a karakter lehet vezérlőkarakter is (pl. tabulátor) kiegészítve az előző változattal, több lépésben olvashatjuk be a teljes sort PPKE ITK, Bevezetés a programozásba I 7:39 PPKE ITK, Bevezetés a programozásba I 7:40 Feladat: Egy telkonyv.txt fájlban a következő formátumban vannak a sorok: vezetéknév keresztnév,cím,telefonszám. Írjuk ki az adatokat az uj_telkonyv.txt fájlba a következő formátumba: keresztnév vezetéknév,telefonszám,cím. feltételezzük, hogy a fájl létezik, és a formátuma helyes négy lépésben olvassuk be a sort négy szöveg változóba előreolvasást használunk bemenet: a szöveg (veznev, kernev, cim, szam) egy bemeneti fájlban (bf) kimenet: aformázott szöveg a kimeneti fájlban (kf) PPKE ITK, Bevezetés a programozásba I 7:41 #include <iostream> #include <fstream> string veznev, kernev, cim, szam; ifstream bf("telkonyv.txt"); ofstream kf("uj_telkonyv.txt"); PPKE ITK, Bevezetés a programozásba I 7:42 7

// sor beolvasása 4 lépésben: getline(bf, veznev, ' '); // olvasás az első szóközig, a szóköz karakter // elveszik getline(bf, kernev, ','); // olvasás a szóköztől a vesszőig, a vessző // elveszik getline(bf, cim, ','); getline(bf, szam); // olvasás a végéig PPKE ITK, Bevezetés a programozásba I 7:43 while(!bf.eof()){ kf << kernev << " " << veznev << "," << szam << "," << cim << endl; // következő sor beolvasása: getline(f, veznev, ' '); getline(f, kernev, ','); getline(f, cim, ','); getline(f, szam); bf.close(); kf.close(); PPKE ITK, Bevezetés a programozásba I 7:44, szekvenciális fájlkezelés Feladatok II. Vegyes feladatok: 14. a) Egy tetszőleges szövegben keresd meg az "alma" szó első előfordulását, és cseréld le a "körte" szóra. b) Az "alma" és "körte" szavak helyett tetszőleges szót lehessen megadni. c) Az összes előfordulást cseréld le. 24. Egy fájlból beolvasott tetszőleges szöveget módosíts úgy egy másik fájlba, hogy a sorai elé írod az adott sor sorszámát., szekvenciális fájlkezelés Feladatok III. Programozási tételek: 9. b) Tetszőleges, fájlból beolvasott egész számsor átlagát add meg. 28. Egy fájlban tárolt, több soros szövegben add meg, hányszor található meg benne egy tetszőleges szó. 38. Olvass egy fájlból mozifeliratokat sub formátumban. a) (*) Melyik sor látszik legtöbb ideig a képernyőn? c) (*) Hol hadartak a leggyorsabban? PPKE ITK, Bevezetés a programozásba I 7:45 PPKE ITK, Bevezetés a programozásba I 7:46 8