Programozás (GKxB_INTM021) Széchenyi István Egyetem, Gy r 2018. május 6.
Parancssori paraméterek Parancssorban történ programindításkor a program nevét követ en szóközökkel elválasztva paraméterek (command line arguments) adhatók meg, melyekkel a program m ködése befolyásolható. Könyvtár tartalmának listázása tömör formátum wajzy@wajzy-notebook:~/dokumentumok/gknb_intm021/el adások/ea13$ ls beolvas1.cpp ea13.log ea13.toc masol2 param2 param4.cpp beolvas2 ea13.nav guns.txt masol2.cpp param2.cpp beolvas2.cpp ea13.out kiir1 masolat.dat param2.o Könyvtár tartalmának listázása hosszú (long) formátum wajzy@wajzy-notebook:~/dokumentumok/gknb_intm021/el adások/ea13$ ls -l összesen 4851004 -rw-rw-r-- 1 wajzy wajzy 393 máj 5 12:13 beolvas1.cpp -rwxrwxr-x 1 wajzy wajzy 14613 máj 5 12:05 beolvas2 -rw-rw-r-- 1 wajzy wajzy 401 máj 5 12:13 beolvas2.cpp
Parancssori paraméterek Feladat: készítsünk programot, ami kilistázza saját paramétereit! Kimenet1 wajzy@wajzy-notebook:~/dokumentumok/gknb_intm021/el adások/ea13$./param1 egy ketto harom "szokozt tartalmaz" Az elinditott program neve:./param1 1. parameter: egy 2. parameter: ketto 3. parameter: harom 4. parameter: szokozt tartalmaz Kimenet2 wajzy@wajzy-notebook:~/dokumentumok/gknb_intm021/el adások/ea13$./param1 Az elinditott program neve:./param1 Nem adtak meg parametereket.
Parancssori paraméterek A main függvény paraméterei int main(int argc, char* argv[]) { /*... */ } int main(int argc, char** argv) { /*... */ } argc argv A paraméterek száma (argument count), beleszámolva az elindított programot is Paraméterek mutatótömbje (argument vector) 5 argc NULL argv "./param1" "egy" "ketto" "harom" "szokozt tartalmaz"
Parancssori paraméterek #i n c l u d e <i o s t r e a m > u s i n g namespace s t d ; i n t main ( i n t argc, c h a r a r g v [ ] ) { c o u t << "Az e l i n d i t o t t program neve : " << a r g v [ 0 ] << e n d l ; i f ( a r g c == 1) { c o u t << "Nem a d t a k meg p a r a m e t e r e k e t. \ n" ; } e l s e { f o r ( i n t i =1; i <a r g c ; i ++) { c o u t << i << ". p a r a m e t e r : " << a r g v [ i ] << e n d l ; } } r e t u r n 0 ; }
Parancssori paraméterek #i n c l u d e <i o s t r e a m > u s i n g namespace s t d ; i n t main ( i n t argc, c h a r a r g v ) { c o u t << "Az e l i n d i t o t t program neve : " << a r g v [ 0 ] << e n d l ; i f ( a r g c == 1) { c o u t << "Nem a d t a k meg p a r a m e t e r e k e t. \ n" ; } e l s e { f o r ( a r g v ++; a r g v!= NULL ; a r g v++) { c o u t << a r g v << e n d l ; } } r e t u r n 0 ; }
Parancssori paraméterek Feladat Két paraméterrel megadott, zárt intervallumba es véletlenszám el állítása Probléma A paraméterek típusa nem megfelel Megoldás1 A stringstream használata char* int konverzióhoz (rugalmasabb) Megoldás2 C függvény (atoi, ASCII to int) használata
Parancssori paraméterek 1 #i n c l u d e <i o s t r e a m > // c o u t 2 #i n c l u d e <c s t d l i b > // srand, rand 3 #i n c l u d e <ctime > // t i m e 4 #i n c l u d e <s s t r e a m > // s t r i n g s t r e a m 5 u s i n g namespace s t d ; 6 7 i n t main ( i n t argc, c h a r a r g v [ ] ) { 8 i f ( a r g c!= 3) { 9 c o u t << " H a s z n a l a t : " << a r g v [ 0 ] << " min max\n" ; 10 } e l s e { 11 s t r i n g s t r e a m s s ; 12 i n t min, max ; 13 s s << a r g v [ 1 ] << ' ' << a r g v [ 2 ] ; 14 s s >> min ; 15 s s >> max ;
Parancssori paraméterek 16 s r a n d ( t i m e (NULL ) ) ; 17 c o u t << "A [ " << min << ", " << max 18 << " ] i n t e r v a l l u m b a " 19 << " e s o v e l e t l e n szam : " 20 << min + rand ()%(max min+1) << e n d l ; 21 } 22 r e t u r n 0 ; 23 } Kimenet wajzy@wajzy-notebook:~/dokumentumok/gknb_intm021/el adások/ea13$./param3 1 5 A [1, 5] intervallumba eso veletlen szam: 4
Parancssori paraméterek #i n c l u d e <i o s t r e a m > // c o u t #i n c l u d e <c s t d l i b > // s rand, rand, a t o i #i n c l u d e <ctime > // t i m e u s i n g namespace s t d ; i n t main ( i n t argc, char a r g v [ ] ) { i f ( a r g c!= 3) { c o u t << " H a s z n a l a t : " << a r g v [ 0 ] << " min max\n" ; } e l s e { i n t min = a t o i ( a r g v [ 1 ] ) ; i n t max = a t o i ( a r g v [ 2 ] ) ; s r a n d ( t i m e (NULL ) ) ; c o u t << "A [ " << min << ", " << max << " ] i n t e r v a l l u m b a " << " e s o v e l e t l e n szam : " << min + r a n d ()%(max min+1) << e n d l ; } r e t u r n 0 ; }
Referenciák A referencia tekinthet új név társításának egy létez változóhoz, vagy olyan mutatónak, amelyen automatikusan végrehajtásra kerül az indirekció. 4 i n t main ( ) { 5 i n t d a r a b = 1 ; // v a l t o z o 6 i n t mutdarab = &d a r a b ; // mutato 7 i n t& r e f D a r a b = d a r a b ; // r e f e r e n c i a 8 // i n t& r e f D a r a b ; // Mi az e r e d e t i v a l t o z o cime? 9 // i n t& r e f D a r a b = 5 ; // Konstansnak n i n c s cime 10 c o u t << " d a r a b=" << d a r a b 11 << " r e f D a r a b=" << r e f D a r a b 12 << " mutdarab=" << mutdarab 13 << " mutdarab=" << mutdarab << e n d l ;
Referenciák 15 d a r a b ++; 16 r e f D a r a b ++; 17 c o u t << " d a r a b=" << d a r a b 18 << " r e f D a r a b=" << r e f D a r a b 19 << " mutdarab=" << mutdarab 20 << " mutdarab=" << mutdarab << e n d l ; 21 r e t u r n 0 ; 22 } Kimenet darab=1 refdarab=1 mutdarab=0x7ffe641fbc0c *mutdarab=1 darab=3 refdarab=3 mutdarab=0x7ffe641fbc0c *mutdarab=3
Referenciák Készíthet referenciát fogadó függvény is 4 v o i d n e g y z e t E r t e k ( i n t a l a p ) { 5 a l a p = a l a p a l a p ; 6 } 7 8 v o i d n e g y z e t M u t a t o ( i n t a l a p ) { 9 a l a p = a l a p a l a p ; 10 } 11 12 v o i d n e g y z e t R e f e r e n c i a ( i n t& a l a p ) { 13 a l a p = a l a p a l a p ; 14 }
Referenciák Készíthet referenciát fogadó függvény is 16 i n t main ( ) { 17 i n t szam = 2 ; 18 c o u t << " Kezdetben : szam=" << szam ; 19 n e g y z e t E r t e k ( szam ) ; 20 c o u t << ", n e g y z e t E r t e k ( ) utan : szam=" << szam ; 21 n e g y z e t M u t a t o (&szam ) ; 22 c o u t << "\ nnegyzetmutato ( ) utan : szam=" << szam ; 23 n e g y z e t R e f e r e n c i a ( szam ) ; 24 c o u t << ", n e g y z e t R e f e r e n c i a ( ) utan : szam=" 25 << szam << e n d l ; 26 // n e g y z e t R e f e r e n c i a ( 5 ) ; // Konstansnak n i n c s cime 27 r e t u r n 0 ; 28 } Kimenet Kezdetben: szam=2, negyzetertek() utan: szam=2 negyzetmutato() utan: szam=4, negyzetreferencia() utan: szam=16
Referenciák Referenciával visszatér fv. 4 i n t szam = 5 ; 5 6 i n t& v i s s z a ( i n t param ) { 7 // r e t u r n 1 ; // k o n s t a n s n a k n i n c s cime 8 i n t l o k a l i s ; 9 // r e t u r n l o k a l i s ; // f e l s z a b a d u l, m i r e h a s z n a l n a n k 10 // r e t u r n param ; // d e t t o 11 r e t u r n szam ; 12 } 13 14 i n t main ( ) { 15 i n t n = v i s s z a ( 4 2 ) 2 ; 16 cout << "n=" << n ; 17 v i s s z a ( 4 2 ) = 3 ; 18 v i s s z a (42)++; 19 c o u t << "\ nszam=" << szam ; 20 r e t u r n 0 ; 21 } Kimenet n=10 szam=4
Magas szint be- és kimenet Feladat Írjunk programot, ami a paraméterként adott szövegfájl tartalmát kiírja! Megoldás Magas B/K (high-level I/O) használata (operációs rendszert l független, hordozható megoldás, de csak a legfontosabb szolgáltatások érhet ek el) Fájlkezelés lépési: 1 (Megfelel típusú folyam) megnyitása 2 B/K m veletek elvégzése 3 Folyam (stream) lezárása A folyamok hasonlítanak a cin/cout pároshoz, de azok automatikusan nyílnak/zárulnak!
Magas szint be- és kimenet Beolvasás karakterenként #i n c l u d e <i o s t r e a m > #i n c l u d e <f s t r e a m > // i f s t r e a m u s i n g namespace s t d ; i n t main ( i n t argc, char a r g v [ ] ) { i f ( a r g c!= 2) { c o u t << " H a s z n a l a t : " << a r g v [ 0 ] << " f a j l n e v \n" ; } e l s e { i f s t r e a m f ( a r g v [ 1 ] ) ; i f ( f. is_open ( ) ) { char c ; w h i l e ( f. g e t ( c ),! f. e o f ( ) ) c o u t << c ; f. c l o s e ( ) ; } e l s e { c e r r << " F a j l n y i t a s i h i b a. \ n" ; } } r e t u r n 0 ; }
Magas szint be- és kimenet ifstream f(argv[1]); ifstream: bemeneti folyam típusa (osztály) f: a folyamváltozó neve argv[1]: a folyam forrása, ebb l fog olvasni f.is_open() Ellen rzi a megnyitás sikerességét (Létezik a fájl? Van jogunk olvasni?... ) (Az ifstream osztály tagfüggvénye) f.get(c) Beolvas egyetlen karaktert a c változóba (istream& get (char& c);) f.eof() Ellen rzi, hogy a fájl végének (end of file) elérését mutató jelz bit (ag) magas érték -e Csak az els túlolvasási kísérlet után lesz a bit magas érték! f.close() Folyam lezárása
Magas szint be- és kimenet Programunk kimenete wajzy@wajzy-notebook:~/dokumentumok/gknb_intm021/el adások/ea13$./beolvas1 guns.txt She's got a smile it seems to me Reminds me of childhood memories Where everything Was as fresh as the bright blue sky Now and then when I see her face cat (concatenate les and print) kimenete wajzy@wajzy-notebook:~/dokumentumok/gknb_intm021/el adások/ea13$ cat guns.txt She's got a smile it seems to me Reminds me of childhood memories Where everything Was as fresh as the bright blue sky Now and then when I see her face
Magas szint be- és kimenet Minden szó külön stringben 5 i n t main ( i n t argc, char a r g v [ ] ) { 6 i f ( a r g c!= 2) { 7 c o u t << " H a s z n a l a t : " << a r g v [ 0 ] 8 << " f a j l n e v \n" ; 9 } e l s e { 10 i f s t r e a m f ( a r g v [ 1 ] ) ; 11 i f ( f. is_open ( ) ) { 12 s t r i n g s ; 13 w h i l e ( f >> s,! f. e o f ( ) ) 14 c o u t << s << e n d l ; 15 f. c l o s e ( ) ; 16 } e l s e { 17 c e r r << " F a j l n y i t a s i h i b a. \ n" ; 18 } 19 } 20 r e t u r n 0 ; 21 } Kimenet She's got a smile it seems to me Reminds me of childhood memories Where everything Was as fresh as
Magas szint be- és kimenet Teljes sorok olvasása 5 i n t main ( i n t argc, c h a r a r g v [ ] ) { 6 i f ( a r g c!= 2) { 7 c o u t << " H a s z n a l a t : " << a r g v [ 0 ] << " f a j l n e v \n" ; 8 } e l s e { 9 i f s t r e a m f ( a r g v [ 1 ] ) ; 10 i f ( f. is_open ( ) ) { 11 s t r i n g s ; 12 w h i l e ( g e t l i n e ( f, s ),! f. e o f ( ) ) { 13 c o u t << s << e n d l ; 14 } 15 f. c l o s e ( ) ; 16 } e l s e { 17 c e r r << " F a j l n y i t a s i h i b a. \ n" ; 18 } 19 } 20 r e t u r n 0 ; 21 }
Magas szint be- és kimenet Sorok írása 1 #i n c l u d e <i o s t r e a m > 2 #i n c l u d e <f s t r e a m > // o f s t r e a m 3 u s i n g namespace s t d ; 4 5 i n t main ( i n t argc, c h a r a r g v [ ] ) { 6 i f ( a r g c!= 2) { 7 c o u t << " H a s z n a l a t : " << a r g v [ 0 ] << " f a j l n e v \n" ; 8 } e l s e { 9 o f s t r e a m f ( a r g v [ 1 ] ) ; // a l a p é r t e l m e z e s : f e l u l i r a s 10 i f ( f. is_open ( ) ) { // ( t r u n c a t e ) 11 s t r i n g d a l [ ] = { 12 " She ' s g o t a s m i l e i t seems t o me", 13 " Reminds me o f c h i l d h o o d memories ",
Magas szint be- és kimenet Sorok írása 18 "And i f I ' d s t a r e t o o l o n g ", 19 " I ' d p r o b a b l y b r e a k down and c r y " 20 } ; 21 f o r ( unsigned i =0; 22 i <s i z e o f ( d a l )/ s i z e o f ( d a l [ 0 ] ) ; 23 i ++) { 24 f << d a l [ i ] << e n d l ; 25 } 26 f. c l o s e ( ) ; 27 } e l s e { 28 c e r r << " F a j l n y i t a s i h i b a. \ n" ; 29 } 30 }
Magas szint be- és kimenet Másolás karakterenként 5 i n t main ( i n t argc, char a r g v [ ] ) { 6 i f ( a r g c!= 3) { 7 c o u t << " H a s z n a l a t : " << a r g v [ 0 ] 8 << " f o r r a s c e l \n" ; 9 } e l s e { 10 i f s t r e a m be ( a r g v [ 1 ] ) ; 11 i f ( be. is_open ( ) ) { 12 o f s t r e a m k i ( a r g v [ 2 ] ) ; 13 i f ( k i. is_open ( ) ) { 14 char c ; 15 w h i l e ( be. g e t ( c ),! be. e o f ( ) ) { 16 k i << c ; 17 }
Magas szint be- és kimenet Másolás karakterenként 18 k i. c l o s e ( ) ; 19 } e l s e { 20 c e r r << " M e g n y i t a s i h i b a : " 21 << a r g v [ 2 ] << e n d l ; 22 } 23 be. c l o s e ( ) ; 24 } e l s e { 25 c e r r << " M e g n y i t a s i h i b a : " 26 << a r g v [ 1 ] << e n d l ; 27 } 28 } 29 r e t u r n 0 ; 30 }
Magas szint be- és kimenet Másolás blokkonként 1 #i n c l u d e <i o s t r e a m > 2 #i n c l u d e <f s t r e a m > 3 u s i n g namespace s t d ; 4 #d e f i n e MERET 65536 5 6 i n t main ( i n t argc, c h a r a r g v [ ] ) { 7 i f ( a r g c!= 3) { 8 c o u t << " H a s z n a l a t : " << a r g v [ 0 ] 9 << " f o r r a s c e l \n" ; 10 } e l s e { 11 i f s t r e a m be ( a r g v [ 1 ], i o s : : b i n a r y ) ; 12 i f ( be. is_open ( ) ) { 13 o f s t r e a m k i ( a r g v [ 2 ], i o s : : b i n a r y ) ; 14 i f ( k i. is_open ( ) ) { 15 c h a r p u f f e r = new c h a r [MERET ] ; 16 i n t b e o l v a s v a ;
Magas szint be- és kimenet Másolás blokkonként 17 do { 18 be. r e a d ( p u f f e r, MERET ) ; 19 b e o l v a s v a = be. gcount ( ) ; 20 k i. w r i t e ( p u f f e r, b e o l v a s v a ) ; 21 } w h i l e ( b e o l v a s v a == MERET ) ; 22 d e l e t e [ ] p u f f e r ; 23 k i. c l o s e ( ) ; 24 } e l s e { 25 c e r r << " M e g n y i t a s i h i b a : " << a r g v [ 2 ] << e n d l ; 26 } 27 be. c l o s e ( ) ; 28 } e l s e { 29 c e r r << " M e g n y i t a s i h i b a : " << a r g v [ 1 ] << e n d l ; 30 } 31 } 32 r e t u r n 0 ; 33 }
Magas szint be- és kimenet Folyamok egy-egy felültöltött konstruktora explicit ifstream (const char* lename, ios_base::openmode mode = ios_base::in); explicit ofstream (const char* lename, ios_base::openmode mode = ios_base::out); Megnyitási mód konstansok: (kombinálhatók bitenkénti vagy operátorral, vagy összeadással) in (input) Megnyitás olvasásra out (output) Megnyitás írásra binary Bináris üzemmód (karakteres helyett = nincs transzláció) ate (at end, append) Hozzáf zés (fájlmutató a fájl végére mozdul) trunc (truncate) Meglév tartalom törlése
Magas szint be- és kimenet Másolás karakterenként time./masol1 nagyfajl.dat masolat.dat real 5m33.072s user 4m54.301s sys 0m19.405s Másolás blokkonként time./masol2 nagyfajl.dat masolat.dat real 0m53.501s user 0m0.212s sys 0m12.795s Másolás az OS segédprogramjával time cp nagyfajl.dat masolat.dat real 0m50.821s user 0m0.102s sys 0m12.247s