Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaMichaela Mann Megváltozta több, mint 5 éve
1
C++ I/O rendszere A C++ támogatja a C I/O rendszerét is
Objektum-orientált I/O rutinok C++ I/O rendszerének előnye: új típus integrálása könnyen kialakítható
2
Automatikusan nyitott stream-ek
cin standard input Keyboard cout standard output Screen cerr standard error Screen clog bufferelt verziója a cerr-nek Screen Átirányíthatók!
3
Osztályok az I/O műveletek támogatására
iostream.h fájlban: streambuf Legalacsonyabb szintű osztály: alap input output műveletek ios Magasabb szintű: formattálás, hibaellenőrzés, státusz információ istream, ostream, iostream
4
Témakörök Formattált I/O I/O manipulátorok Inserter-ek Extractor-ok
Fájl kezelés
5
Formattált I/O A C-hez hasonlóan C++-ban is lehetséges az adatok megjelenítése különböző formátumban Minden stream-hez tartoznak ún. formátum flag-ek (long típusú egész érték) Névvel rendelkező konstansok az ios osztályon belül ezeknek a flagek-nek a beállítására
6
Ios osztályban definiált format flag-ek
class ios { public: static const flags skipws left right internal
7
dec , okt , hex ,
8
showbase , showpoint , uppercase, showpos ,
9
fixed , scientific , unitbuf ,
10
adjustfield, basefield, floatfield
11
long flags(); long flags(long f); long setf (long flags); A flags által specifikált flag-ek beállításra kerülnek long unsetf (long flags); A flags által specifikált flag-ek törlésre kerülnek
12
Flag-ek jelentése skipw whitespace karakterek (space, tab és újsor) elhagyása a bemeneten left, mezőigazítás: feltöltés az érték után right feltöltés az érték előtt internal feltöltés az előjel és az érték között
13
dec //a számrendszer alapja egészeknél :10 (decimális)
hex //16 (hexadecimális okt // 8 (oktális)
14
Flag-ek jelentése showbase kiíráskor oktálisak elé 0, hexadecimálisaok elé 0x előtag showpoint a záró nullák megjelenítése showpos + jel megjelenítése pozítiv érték előtt uppercase e és x helyett E és X.
15
scientific. lebegőpontos numerikus. érték megjelenítése scientific
scientific lebegőpontos numerikus érték megjelenítése scientific jelöléssel (d.ddddddEdd) fixed lebegőpontos érték megjelenítése fixpontos formátumba (dddd.dd)
16
adjustfield, //mezőigazításal kapcsolatos jelző
basefield, //egész számrendszer alapszámával kapcsolatos jelző floatfield //lebegőpontos kimenettel kapcsolatos jelző
17
A format flag-ek állítása
setf() függvény segítségével (ios osztály tagja) long setf (long flags) A flags által specifikált flag-ek beállításra kerülnek Visszaadott érték: az előző format flags
18
Példa a showpos flag beállítására
stream.setf(ios::showpos) vagy cout.setf (ios::showbase | ios:: hex);
19
Flag-ek törlése long unsetf (long flags);
unsetf() függvény segítségével (ios osztály tagja long unsetf (long flags); A flags által specifikált flag-ek törlésre kerülnek Visszaadott érték: az előző format flags
20
Flag-ek lekérdezése flags() függvény segítségével (ios osztály tagja
long flags() Visszaadott érték: az előző format flags
21
Flag-ek beállítása bitmintával
flags() függvény segítségével (ios osztály tagja long flags(long f) A függvény a bitmintának megfelelően állítja a flag-eket f: bitminta Visszaadott érték: az előző format flags
22
További formátum paraméterek
Mezőszélesség pontosság kitöltő karakterek
23
Minimális mezőszélesség
int width(int w); Az outputra kerülő adat minimálisan w számú helyet foglal el. Ha az adat hosszabb, akkor hosszabb mezőszélességben kerül kiírásara A mezőszélesség visszaáll az alapértelmezés szerintire
24
Pontosság int precision (int p)
P: a lebegőpontos érték outputja esetén a tizedespont után megjelenítendő tizedesjegyek száma Visszaadott érték: az előző pontosság Alapértelmezés: 6 tizedes jegy
25
Mező kitöltése char fill ( char ch) ch: az új töltő karakter
Visszaadott érték: a régi töltő karakter Amennyiben a mezőszélesség nagyobb, mint a kiírásra kerülő érték jegyeinek száma, akkor ezzel a kitöltő karakterrel kerül feltöltésre a mező többi része
26
Példa #include <iostream.h> main() {
cout << << " hello " << 100 << '\n‘; cout << 10 << ' ' << -10<< '\n'; cout << << '\n';
27
Példa cout.setf(ios::hex| ios::scientific);
cout << << " hello " << 100 << '\n'; cout.setf(ios::showpos); cout << 10 << ' ' << -10<< '\n'; cout.setf(ios::showpoint| ios::fixed); cout << 100.0; return 0; }
28
Eredmény 123.23 hello 100 10 –10 100 1.2323e+02 hello 64 A fffffff6
29
I/O manipulátorok Speciális függvények a formátum információk megadására Néha könnyebb használni őket, mint az ios formátum flag-eket és függvényeket. include <iomanip.h> szükséges a használatukhoz, ha a manipulátonak van paramétere
30
Manipulátorok dec endl ends flush hex oct resetiosflags(long f)
setbase( int base) setfill ( int ch) setiosflags(long f) setprecision(int p) setw( int w) ws
31
Inserter-ek létrehozása
A C++-ban az output: insertion << operátor neve: insertion operator << átdefiniálása: inserter function, vagy röviden inserter
32
Inserter formája { // az inserter törzse return stream; }
ostream &operator<<(ostream &stream, class-name ob) { // az inserter törzse return stream; }
33
Fontos! Az első paraméter hivatkozás egy ostream típusú objektumra (ostream az ios osztályban van definiálva) A második paraméter az az objektum, ami outputra kerül A visszaadott érték egy hivatkozás a stream-re, amely ostream típusú
34
Az inserter-ek tulajdonságai
Nem tagfüggvényei annak az osztálynak, amelyre definiálták. (miért?) Megsérti az egységbezárás elvét? friend függvényként kell generálni
35
Extractor-ok definiálása
A C++-ban az input: extractor << operátor neve: extraction operator << átdefiniálása: extractor function, vagy röviden extractor
36
Extractor formája { // az extractor törzse return stream; }
istream &operator<<(istream &stream, class-name ob) { // az extractor törzse return stream; }
37
Fájl I/O alapok A következő fájlokra van szükség: fstream.h ifstream.h
ofstream.h
38
Stream létrehozása ifstream in; //input ofstream out; //output
fstream io; //input és output
39
Fájl megnyitása void open (char *fájl-név, int mode, int access)
40
mode értékek: ios::app (nyitás outputra hozzáfűzéssel) ios::ate
ios::in (nyitás inputra) ios::nocreate (hiba, ha a fájl még nem létezik) ios::noreplace (hiba, ha a fájl már létezik) ios::out (nyitás outputra) ios::trunc (ha volt ilyen nevű fájl, akkor törölve lesz és újat hoz létre)
41
access értékek 0 normál fájl 1 csak olvasható fájl 2 rejtett fájl
4 rendszer fájl 8 archív fájl
42
Példa fájl megnyitására
ofstream out; out.open(„teszt”, ios::out, 0); fstream mystream; mystream.open(„teszt”, ios::in | ios::out);
43
Fájl megnyitásának sikeressége
if (!mystream) { cout << „Fájl nyitás nem sikerült!”; } A stream értéke 0, ha sikertelen a fájl nyitás.
44
Fálj megnyitása konstruktorral
ifstream mystream.open(„teszt”);
45
Fájl zárása mystream.close();
46
Fálj végének vizsgálata
int eof(); Nem zérus értéket ad vissza, ha vége a fájlnak, egyébként pedig zérus értéket.
47
Bináris I/O műveletek istream &get(char &ch); ostream &put(char ch);
istream &read(unsigned char *buf, int num); ostream &write(const unsigned char *buf, int num); int gcount(); istream &get(char *buf, int num, char delm=‘\n’); int get(); istream &getline(char *buf, int num, char delim=‘\n’); int peek(); istream &putback(char c); ostream &flush();
48
Random elérés istream &seekg(streamoff offset, seek_dir origin);
ostream &seekp(streamoff offset, seek_dir origin); Streamoff: iostream.h-ban definiált típus seek_dir egy enumerációs érték: ios::beg ios::cur ios::end
49
Fájl pointerek get pointer: a következő input művelet helye
put pointer: a következő output művelet helye A megfelelő seek() fv. A kurrens get illetve put pointert offset bájttal mozgatja a specifikált kezdethez képest.
50
Fájl pointerek pozíciójának lekérdezése
streampos tellg(); streampos tellp();
51
I/O státusz goodbit 0 nincs hiba 1 hiba van eofbit 0 fájl vége
1 egyébként failbit 0 nem végzetes hiba badbit 0 végzetes hiba 1 egyébkénthiba van
52
Hibakezelő függvények
int bad(); int eof(); int fail(); int good();
53
Hiba törlése void clear(int flags=0);
54
#include <iostream.h>
#include <fstream.h> main() { ofstream fout("teszt"); if(!fout){ cout << "nem tudja megnyitni a fájlt!"; return 1; } fout<<"Hello!\n"; fout<<100<<' ' << hex <<100<< endl; fout.close();
55
ifstream fin("teszt"); if(!fin) { cout << "nem tudja megnyitni a fájlt!"; return 1; } char str[80]; int i,j; fin>> str>>i>>j; cout<<str<<endl<<i<<' '<<j<<endl; fin.close(); return 0;
56
#include <iostream.h>
#include <fstream.h> #include <stdio.h> main(int argc, char *argv[]) { if (argc!=2) { cout << "nem j¢ param‚terek!\n"; return 1; } ofstream out ( argv[1] ); if(!out){ cout << "nem tudja megnyitni a f jlt!\n"; return 1; }
57
char str[80]; cout<<„írj sztringet diszkre, majd return-nel állj le!\n"; do { cout<<": "; gets(str); out<<str<<endl; } while (*str); out.close(); return 0; }
58
#include <iostream.h>
#include <fstream.h> main(int argc, char *argv[]) { if (argc!=3) { cout << "nem j¢ param‚terek!\n"; return 1; } ifstream fin(argv[1]); ofstream fout(argv[2]); if(!fout){ cout << "nem tudja megnyitni az output f jlt!\n"; return 1; }
59
if(!fin){ cout << "nem tudja megnyitni az input fájlt!\n"; return 1; } char ch; fin.unsetf(ios::skipws); while (!fin.eof()) { fin>>ch; if (ch==' ') ch='|'; fout<<ch; } return 0;
60
#include <iostream.h>
#include <fstream.h> main(int argc, char *argv[]) { if (argc!=3) { cout << "nem j¢ param‚terek!\n"; return 1; } ifstream fin(argv[1]); ofstream fout(argv[2]); if(!fout){ cout << "nem tudja megnyitni az output f jlt!\n"; return 1; }
61
if(!fin){ cout << "nem tudja megnyitni az input f jlt!\n"; return 1; } char ch; fin.unsetf(ios::skipws); while (!fin.eof()) { fin>>ch; if (ch==' ') ch='|'; fout<<ch; } return 0;
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.