Wejście-wyjście w C++ Podstawy operacji

Podobne dokumenty
Wejście wyjście strumieniowe

klasy strumieniowe uzupełnienie Języki Programowania (język C++) Klasy strumieniowe Pliki nagłówkowe Klasy strumieniowe Obiekty globalne

Programowanie w językach

Pliki i manipulatory. - Łańcuchowe funkcje wejścia - getline(string) Dorota Pylak - Tryby otwarcia pliku - Formatowanie manipulatory

Programowanie i struktury danych

Operacje wejścia/wyjścia (odsłona druga) - pliki

Wykład 2 Operacje wejściawyjścia. Ewa Gajda

C++ - strumienie. C++ - strumienie. C++ - strumienie. C++ - strumienie. C++ - strumienie STRUMIENIE

C++ - strumienie. C++ - strumienie. C++ - strumienie. C++ - strumienie. C++ - strumienie STRUMIENIE

Wstęp do informatyki- wykład 8 Pętla while, do while,for -pętla w pętli- przykłady Operator rzutowania Manipulatory

Spis treści OBSŁUGA PLIKÓW W JĘZYKU C++ Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF32

C++ - strumienie. Strumienie. C++ - strumienie. C++ - strumienie. C++ - strumienie. C++ - strumienie. Formatowanie strumieni wyjściowych

C++ - [3-5] Pliki i strumienie w C++

Pliki wykład 2. Dorota Pylak

Operacje na plikach. Informatyka. Standardowe strumienie wejścia i wyjścia

Strumienie standardowe C

Operacje wejścia/wyjścia odsłona pierwsza

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

C++ - szablony. C++ - szablony. C++ - strumienie. C++ - strumienie. C++ - strumienie STRUMIENIE

Pliki wykład 2. Dorota Pylak

dr inż. Paweł Myszkowski Wykład nr 8 ( )

Język C++ wykład VIII

jest mocny, skoro da się w nim wyrazić nowe pojęcia; łatwiej przenieść go na nową platformę jest mniejszy.

Referencje. Zasady zaliczeń. Zasady zaliczeń. Zasady zaliczeń. Zasady zaliczeń. Zaawansowane Programowanie Obiektowe. Informacje organizacyjne:

Referencje. Zasady zaliczeń. Zasady zaliczeń. Zasady zaliczeń. Zasady zaliczeń. Zaawansowane Programowanie Obiektowe. Informacje organizacyjne:

Wykład :37 PP2_W9

Programowanie Obiektowe i C++

Dziedziczenie & W slajdach są materiały zapożyczone z

Programowanie obiektowe

Klasa iostream... 1 Klasy ofstream, ifstream Struktura FILE... 8

C++ - szablony. C++ - szablony. C++ - szablony. C++ - szablony. C++ - szablony. C++ - szablony

Pliki wykład. Dorota Pylak

Pliki wykład 2 -przekazywanie strumieni do funkcji -funkcje get(char &) i getline(string)

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Biblioteka standardowa - operacje wejścia/wyjścia

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Referencje. Zasady zaliczeń. Zasady zaliczeń. Zasady zaliczeń. Zasady zaliczeń. Zaawansowane Programowanie Obiektowe. Informacje organizacyjne:

Spis treści OPERACJE WEJŚCIA-WYJŚCIA W JĘZYKU C++. STEROWANIE FORMATEM, MANIPULATORY. Informatyka 2

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Pliki wykład. Dorota Pylak

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 21 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 24

Język C++ zajęcia nr 1

Wstęp do programowania obiektowego. Przekazywanie parametrów do funkcji w C++ Metody i funkcje operatorowe Strumienie: standardowe, plikowe, napisowe

Wstęp do programowania obiektowego

Wykład 9 Pliki cz.3 (getline(string)) Typ wyliczeniowy enum

Identyfikacje typu na etapie. wykonania (RTTI)

Wstęp do programowania

INFORMATYKA Studia Niestacjonarne Elektrotechnika

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

TEMAT : KLASY DZIEDZICZENIE

Język C++ Różnice między C a C++

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Program dopisujący gwiazdkę na końcu pliku tekstowego o nazwie podanej przez uŝytkownika oraz wypisujący zawartość tego pliku.

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Obsługa wyjątków. Język C++ WW12

Szablony klas, zastosowanie szablonów w programach

Funkcje przeciążone, konstruktory kopiujące, argumenty domyślne

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Nowe słowa kluczowe. Komentarze. Wskaźniki typu void. class, delete, new, friend,... /* Komentarz w C i C++ */ // Komentarz w C++ (do końca wiersza)

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Pliki. Informacje ogólne. Obsługa plików w języku C

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Podstawy programowania w C++

Przeciążenie operatorów

Funkcje zawarte w bibliotece < io.h >

Wstęp do programowania

Wykład nr 4. Temat: Dynamiczny przydział pamięci, zastosowania wskaźników, praca z plikami.

Struktury, unie, formatowanie, wskaźniki

Funkcje zawarte w bibliotece < io.h >

Programowanie Procedurale. Pliki w języku C++

C++ wprowadzanie zmiennych

1 Pierwsze kroki w C++ cz.3 2 Obsługa plików

Bibliografia 1. B. Stroustrup. Jezyk C++. Wydawnictwo Naukowo-Techniczne, Warszawa,

Rzutowanie i konwersje

Podstawy programowania skrót z wykładów:

Referencje. Referencje. Zasady zaliczeń. Zasady zaliczeń. Zasady zaliczeń. Zaawansowane Programowanie Obiektowe. Informacje organizacyjne:

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Operatory na rzecz typu TString

Ghost in the machine

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

Zmienne, stałe i operatory

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

Wstęp do Programowania 2

Programowanie w C++ Adam Szmagliński, p. F215 Środowisko programistyczne: MS Visual Studio 2012

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Pliki. Funkcje tworzące pliki i operujące na nich opisane są w części 2 pomocy systemowej. Tworzenie i otwieranie plików:

Operacje na plikach (niskiego poziomu) < IO.H >

Abstrakcyjny typ danych

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

Język ludzki kod maszynowy

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

1 P roste e t ypy p d a d n a ych c - c ąg ą g d a d l a szy 2 T y T py p z ł z o ł żo ż ne e d a d n a ych c : T BLICE

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Transkrypt:

Wejście-wyjście w C++ Podstawy operacji C++ wspiera dwie kompletne systemy We/Wy: o We\Wy języka C o We\Wy obiektowy C++ Główną zaletą We\Wy C++ : jest możliwe przeciążenie enie dla tworzonych klas. Nadaje to możliwość wbudowywać w systemy We\Wy tworzone przez programista typy danych. Strumień to urządzenie logiczne, produkujące lub pobierajjące informacje. Wszystkie strumieni We/Wy zachowują się tak samo system We/Wy daje ten samy interfejs dla różnych urządzeń fizycznych. To oznacza, na przykład, że ta sama funkcja będzie wykonywała wyprowadzenie na monitor, w plik, na drukarkę,. 1

Przy starcie programu w języku C pozostają otworzone potoki stdin, stdout, stderr. W języku C++: Strumień Znaczenie Urządzenie domyślne cin Standardowe wejście Klawiatura cout Standardowe wyjście Ekran cerr Standardowe wyjście dla błędów Ekran clog Buforowana wersja cerr Ekran Standard C++ tworzy również potoki dodatkowe wcin, wcout, wcerr, wclog dla wide text format (wchar_t) (16-bitiwych) symbolów. System We\Wy bazuje się na dwóch różnych hierarchiach klasszablonów. 2

Pierwsza hierarchia klas jest pochodną od klasy dolnego poziomu basic_streambuf. Ten klas jest bazowym dla operacji We\Wy dolnego poziomu i wspiera cały system We\Wu. Druga hierarchia klas jest pochodną od klasy basic_ios. To jest klasa bazowa dla operacji We\Wy górnego poziomu, który zabezpiecza formatowanie, kontrole błędów i informacje o stanie strumienia. Biblioteka We\Wy tworzy dwie rozdzielne wersje hierarchii klas jedną 8-bitiwą, drugą 16-bitową. Klasa - szablon basic_streambuf basic_ios basic_istream basic_ostream basic_iostream basic_fstream basic_ifstream basic_ofstream Klasa dla wersji 8-bitowej streambuf ios istream ostream iostream fstream ifstream ofstream 3

Wirtualna klasa bazowa Stan strumienia ios_base Format stanu, który nie zależy od osobliwości nacjonalnych basic_ios <> Format stanu strumienia, który zależy od osobliwości nacjonalnych basic_ostream <> Formatuje << basic_istream <> Formatuje >> basic_iostream <> Formatuje << >> basic_ofstream <> Formatuje << basic_ifstream <> Formatuje >> basic_fstream <> Formatuje << >> 4

Dla dostępu do poważnej klasy ios trzeba dołączyć nagłówek <iostream> Formatowanie operacji Wejścia \ Wyjścia Formatowanie We\Wy można dokonywać: o przy użyci składowych klasy ios o przy wykorzystani manipulatorów specjalnych funkcji, które można umieszczać w wyrażeniach dotyczącycz We\Wy Formatowanie przy użyci składowych ios Z każdym strumieniem związany jest zbiór flag formatowania, kontrolujących sposób formatowania informacji. To są maski bitowe. W klasie ios zadekłarowana wyliczeniowa maska bitowa fmtflags: (class ios_base, members patrz MSDN) 5

Enumeration fmtflags: adjustfield floatfield right skipws basefild hex scientific unitbuf boolalpha internal showbase uppercase dec left showpoint fixed oct showpos flaga ustawiona wyzerowana skipws Przy wyprowadzeniu do strumienia wiodące znaki puste (spacje, tabulatory, nowej linii) są ignorowane nie są ignorowane left Wyrównanie po lewej krawędzi Jeśli wszystkie te right Wyrównanie po prawej krawędzi flagi są ignorowane internal Wartości numeryczne są dopełniane tak, by zajęły całe pole wstawiane spacje pomiędzy cyframi i znakiem liczby ustawienia domyślne 6

flaga ustawiona wyzerowana oct wyświetlanie wartości w systemie ósemkowym domyślnie - syst. w systemie szesnastkowym dziesiętnym hex dec przywrócenie do systemu dziesiętnego ------------- showbase pokazać podstawą systemu liczenia nie pokazywać uppercase w notacji naukowej wyświetlamy E, syst. Szesnastkowym X domyślnie: e, x showpos znak + jest wyświetlany nie wyświetlany showpoint wyświetla wietla wszędzie przecinek i zero końcowe nie wyświetla wietla scientific fixed unitbuf boolalpha wartości zmienno-przecinkowe są wyświetlane w notacji naukowej 3.141592e+00 wartości zmienno-przecinkowe są wyświetlane w notacji zwykłej: 3.141592 bufor jest opróżniany (flush) po każdej operacji insertion (wyprowadzenie w strumień) wartości logiczne mogą być wprowadzone i wyprowadzone jako false, true kompilator sam wybiera odpowiednie notacje nie liczbami 0, 1 basefield dec hex oct nie 7

flaga ustawiona wyzerowana adjustfield internal left right nie floatfield fixed scientific nie Funkcji-składowe klasy ios_base: fmtflags setf(fmtflags flagi) Zwraca poprzednie ustawienie flag i ustawia wymienione na liście argumentów. stream.setf(ios::showpos ios::scientific); void unsetf(fmtflags flagi) stream strumień, do którego należy ustawienie flag, jest obiektem klasy pochodnej od klasy ios_base. W C++ nie istnieje formatowania globalnego, każde formatowanie odbywa się dla poszczególnych strumieni. showpos, scientific to są wartość wyliczeniowa w klasie ios, dla tego operator zakresu :: jest konieczny, inaczej kompilator nie widzi tych wartości. Flagi, wymienione na liście flagi, są wyzerowane. Wszystkie pozostałe flagi - bez zmian. 8

fmtflags flags(); fmtflags flags(fmtflags f); streamsize width(streamsize w); streamsize precision(streamsize p); Zwraca bieżący stan flag, nic nie zmienia w ustawieni flag ios::fmtflags f = flags(); Ustawia wszystkie flagi, zdefiniowane w szablonie fmtflags f, zwraca poprzednie ustawienie flag ios::fmtflags f = ios::showpos ios::showbase; cout.flags(f); domyślnie przy wyprowadzeni wartość zajmuje tyle pozycji, ile ma symbolów. Funkcje width() zadaje minimalną szerokość pola w, zwraca poprzednią szerokość pola. Po wykonaniu każdego wyprowadzenia szerokość pola pozostaje ustawiona jako wartość domyślna. Reszta pola (nie zajęta symbolami) będzie wypełniona symbolem zapełnienia (domyślnie spacja). Jeśli ilość symbolów przekracza ustawioną szerokość pola, będzie wyprowadzone tyle symbolów, ile ma wartość. Domyślnie liczby zmiennoprzecinkowe są wyprowadzone z dokładnością 6 cyfr. Dokładność można zmienić przy pomocy funkcji precision(). Zwraca poprzednią dokładność. Funkcja fill() składowa klasy pochodnej basic_ios: template <class Elem, class Traits> class basic_ios : public ios_base 9

char fill(char ch); Domyślnie wypełnienie pustych pozycji odbywa się spacjami. Funkcje fill() nadaje możliwość wypełnić te pozycji symbolem ch Przykład W11 Manipulatory We \ Wy Manipulatory to funkcje specjalne, które można włączać do wyrażeń We \ Wy. Dla dostępu k manipulatorom z parametrami trzeba dodać nagłówek <iomanip>. Standardowe manipulatory: manipulator przeznaczenie We \ Wy boolalpha Włącza flage boolalpha We \ Wy dec Włącza flage dec We \ Wy endl Wyprowadza znak nowej linii i opróżnia strumień ends Wyprowadza znak null Wy fixed Włącza flage fixed Wy flush Opróżnia strumień Wy Wy 10

manipulator przeznaczenie We \ Wy hex Włącza flagę hex We \ Wy internal Włącza flagęinternal Wy left Włącza flagę left Wy noboolalpha Wyłącza flagę boolalpha Wy noshowbase Wyłącza flagę showbase Wy noshowpoint Wyłącza flagę showpoint Wy noskipws Wyłącza flagę skipws Wy nounitbuf Wyłącza flagę unitbuf Wy nouppercase Wyłącza flagę uppercase Wy oct Włącza flagę oct We \ Wy resetiosflags(fmtflags f) Wyłącza flagi wymienione w f Wy right Włącza flagę right Wy scientific Włącza flagę scientific Wy setbase(int base) Przypisuje podstawie systemu liczenia wartość, wskazaną w base setfill(int ch) Definiuje jako znak wypelnienia ch Wy We \ Wy setiosflags(fmtflags f) Włącza flagi wymienione w f We \ Wy 11

manipulator przeznaczenie We \ Wy setprecision(int p) Ustala wartość dokładności Wy setw(int w) Definiuje szerokość pola jako w Wy showbase Włącza flagę showbase Wy showpoint Włącza flagę showpoint Wy showpos Włącza flagę showpos Wy skipws Włącza flagę skipws Wy unitbuf Włącza flagę unitbuf Wy uppercase Włącza flagę uppercase Wy ws Opuszcza puste znaki wiodące We Przykład: #include <iostream> #include <iomanip> using namespace std; int main() cout << hex << 100 << endl; cout << setfill(? ) << setw(10) << 2343.0; } wydruk: 64??????2343 12

Manipulatory występują w wyrażeniach złożonych i często okazują się bardziej przydatne dla zastosowania, niż składowe klasy ios. Jeśli manipulator nie pobiera argumenty (na przykład, endl, hex), nie występują nawiasy. Dzieje się tak dla tego, że jest to adres funkcji przekazywany do przeciążonego operatora <<. Manipulatory We \ Wy wpływają tylko na strumień, w wyrażenie dla którego są włączone. Na inne strumienie, otwarte w programie, nie wpływają. Przykład W11_1 13

Tworzenie własnego insertera przeciążenie operatora << Operator wyprowadzenia wstawia dane w strumień stąd i pochodzi nazwa inserter (insertion operator) ostream &operator << (ostream &stream, typ_klasy ob) //ciało funkcji return stream; } Operator << powinien być włączany w kolejką: stream << ob Operator << ma dwa operandy strumień i obiekt klasy, przy czym lewostronni operand to strumień, prawostronni obiekt klasy lub referencje do obiektu klasy ostream &operator << (ostream &stream, const typ_klasy &ob) Operator-funkcje nie może być składową klasy, dla którego jest tworzona, dla tego że włączanie w kolejkę stream << ob wymaga, że lewostronni operand powinien być strumieniem. 14

Wartość zwracana referencje do strumienia stream. To jest koniecznie dla tego,żeby można było włączać w wyrażenie stream << ob1 << ob2; Najczęściej przeciążona funkcje-operator << występuje jako funkcje zaprzyjaźniona do klasy, obiekt której ma wyprowadzić w strumień. To nadaje możliwość dostępu do ukrytych składowych klasy. Tworzenie własnego ekstraktora przeciążenie operatora >> istream &operator >> (istream &stream, typ_klasy &ob) //ciało extractora return stream; } Operator >> powinien być włączany w kolejką: stream >> ob dla tego zwraca referencje do strumienia stream. 15

Operator >> ma dwa operandy strumień i referencje do obiektu klasy, przy czym lewostronni operand to strumień, prawostronni referencje do obiektu klasy. Sprawa w tym, że przy wykonaniu wejścia wartości składowych klasy prawdopodobnie będą zmienione. Przykład: class mcoord protected: double x; double y; public: }; mcoord(double xx, double yy) x = xx; y = yy; } mcoord() x=0; y=0; } class node : public mcoord int numb; char str[512]; public: node(int nb, char *st, double xx, double yy); ~node() }.. friend ostream & operator << (ostream &stream, const node &ob); friend istream & operator >> (istream &stream, node &ob); }; 16

istream & operator >> (istream &stream, node &ob) /*========================================================== Ekstraktor przeciążenie operatora >> dla obiektów klasy node ===========================================================*/ stream >> ob.x >> ob.y >> ob.numb >> ob.str; return stream; } ostream & operator << (ostream &stream, const node &ob) /*========================================================== Inserter przeciążenie operatora << dla obiektów klasy node ===========================================================*/ } stream << ob.x << " " << ob.y << " " << ob.numb << " " << ob.str << endl; return stream; 17

Tworzenie własnych manipulatorów Pozwala konsolidować sekwencje kilku oddzielnych operacji wejściawyjścia w jeden manipulator Pozwala wielokrotnie powtarzalne operacji przy We\Wy zapakować w jeden manipulator, a dalej używać jego tyle razy, ile to jest potrzebne Istnieją dwa typy manipulatorów: o operujących na strumieniach wejściowych o operujących na strumieniach wyjściowych Każdą z tych grup można podzielić na manipulatory, pobierające argumenty, i manipulatory niepobierające argumenty. Tworzenie manipulatorów sparametryzowanych istotnie zależy od kompilatora. Dla tego rozważymy tworzenie manipulatorów niesparametryzowanych. Szkielet manipulatorów wyjścia: 18

ostream & nazwa_manipulatora(ostream &stream) //kod return stream; } Zwraca referencje do strumienia typu ostream. Wykorzystuje się jako element większego wyrażenia wyjścia (stream << << nazwa_manip <<..). Posiada jeden argument (referencje do strumienia, na którym operuje), przy wykorzystaniu nie jest używany żaden argument. ostream & manip_a(ostream &stream) stream.setf(ios::showbase); stream.setf(ios::hex ios::basefield); return stream; } int main() cout << 256 << " " << manip_a << 256 << endl; } system("pause"); return 0; 256 0x100 Для продолжения нажмите любую клавишу... 19

Szkielet manipulatorów wejścia: istream &nazwa_manipulatora(istream &stream) //kod return stream; } #include "stdafx.h" #include "windows.h" #include <iostream> using namespace std; istream & manip_b(istream &stream) MessageBeep(-1); cout << "wprowadź i wciśnij ENTER\n"; return stream; } //dzwięk int main() int i; cin >> manip_b >> i; } system("pause"); return 0; 20

Operacje Wejścia / Wyjścia, przeprowadzane na plikach Pliki dyskowe mają wielu unikalnych cech, dla tego w układzie We\Wy C++ pozostało tworzone klasy specjalne dla pracy z plikami: ofstream, ifstream, fstream (stor. 4) hierarchie klas. Nagłówek <fstream>. Dla zarządzania nizkopoziomowego strumieniami dla plików istnieje klasa szablonowa basic_filebuf basic_streambuf <> basic_filebuf <> (synonim filebuf) 21

Otwieranie i zamykanie pliku. Otwieranie pliku polega na połączeniu go ze strumieniem. Są trzy rodzaje strumieni: o wejściowe (obsługiwany przez klasę ifstream) o wyjściowy ( ofstream) o wejście\wyjście ( fstream) Otwieranie pliku powstaje przy wywołaniu konstruktora odpowiedniej klasy lub przy jawnym użyciu metody klasy open( ) Przykład W11_4 otwieranie pliku przy wywołaniu konstruktora klasy Metody open: void basic_ifstream::open( const char *_Filename, ios_base::openmode _Mode = ios_base::in, int _Prot = (int)ios_base::_openprot ); void basic_ofstream::open( const char *_Filename, ios_base::openmode _Mode = ios_base::out, int _Prot = (int)ios_base::_openprot ); void basic_fstream::open( const char *_Filename, ios_base::openmode _Mode = ios_base::in ios_base::out, int _Prot = (int)ios_base::_openprot ); 22

Tryb otwierania pliku zależy od wartości ios_base::openmode _Mode. typedef T3 openmode; static const openmode app, ate, binary, in, out, trunc; ios_base::app ios_base::ate ios_base::binary ios_base::in ios_base::out ios_base::trunc Przed każdym zapisem w plik wskaźnik pozycji pliku będzie przestawiony na koniec pliku (tryb dodawania w koniec pliku) Przy otwierani pliku wskaźnik pozycji będzie przestawiony na koniec pliku, przecież zapis \odczyt może być dokonywany w dowolnym miejscu pliku Tryb binarny. Domyślniepliki są otwarte w trybie tekstowym. Plik, otwarty w trybie tekstowym, widzi znaki formatowania i znaki specjalne. Plik, otwarty w trybie binarnym, nie widzi formatowania. Plik jest otwarty dla odczytu (extraction) Plik jest otwarty dla zapisu (insertion) Zawartość pliku istniejącego pozostaje zniszczona, plik w trakcie otwierania będzie ucięty do zerowej długości 23

basic_filebuf::open ios_base::in ios_base::out ios_base::out ios_base::trunc becomes "r" (open existing file for reading). becomes "w" (truncate existing file or create for writing). ios_base::out ios_base::app becomes "a" (open existing file for appending all writes) ios_base::in ios_base::out becomes "r+" (open existing file for reading and writing). ios_base::in ios_base::out becomes "w+"(truncate existing file or create for ios_base::trunc reading and writing). ios_base::in ios_base::out ios_base::app becomes "a+" (open existing file for reading and for appending all writes). _Prot - the default file opening protection. 24

Sprawdzenie poprawności otwarcia pliku. o W przypadku niepowodzenia strumień jest ustawiony na false: fstream iof( myfile.dat, ios_base::in ios_base::out); if(! iof) //plik nie pozostał otwarty } //OK o metoda bool basic_filebuf::is_open(): zwraca true, jeśli plik pozostał otwarty, false niepowodzenie. fstream iof( myfile.dat, ios_base::in ios_base::out); if(!iof.is_open()) //plik nie pozostał otwarty } //OK. Zamykanie plików: void basic_fstream :: close( ); 25

Niesformatowane i binarne operacje wejścia-wyjścia W funkcjach klasycznych We\Wy C\C++ pozostałe zrealizowane operacje na bajtach. Dla tego że sizeof(char) = 1 B, w prototypach tych funkcji jest używany typ char. Z wprowadzeniem Unicode (wchar_t) sytuacje się zmieniła. Ale w obrębie tego kursu będziemy i dalej posługiwali funkcjami klasycznymi. Pliki będziemy otwierać w trybie binarnym (ios_base::binary). Funkcje C++ Run-time library put, get dla plików binarnych powodują zapis i odczyt jednego bajta informacji: istream &get(char &ch); ostream &put(char ch); Przykład W11_5!!! 26

Funkcji C++ Run-time library read, write dla zapisu \ odczytu bloków basic_istream& read( char_type *_Str, streamsize _Count ); basic_ostream& write( const char_type *_Str, streamsize _Count ); Jeśli chodzi o plikach binarnych, to _Str jest wskaźnikiem do bufora pamięci rzutowany na typ char * lub const char *, a _Count podaje ilość bajtów, które trzeba zapisać \ przeczytać. Jeśli przy odczycie koniec pliku występuje wcześniej niż będzie przeczytane _Count bajtów, odczyt pozostaje przerwany, a buforze _Str znajduje się tyle bajtów, ile faktycznie pozostało przeczytane. Dla tego żeby wyjaśnić, ile bajtów pozostało przeczytane, istnieje funkcja streamsize basic_istream :: gcount( ) const; Dla wyładowania buforu systemowego We\Wy w plik, używamy basic_ostream& basic_ostream :: flush( ); Nie używamy fleszowanie pliku bez potrzeby zwalnia to istotnie działanie programu. Przy zamykaniu pliku powstaje automatyczne wyładowanie danych z bufora systemowego i ich zapis do pliku. 27

Dostęp swobodny (bezpośredni). W C++ plik ma 2 wskaźnika pozycji jeden określa pozycje pliku, gdzie nastąpi kolejna operacje wejścia, a drugi wyjścia. Dla przesunięcia wskaźników pozycji plików mamy 2 układy funkcji: xxxg() (get - odczyt), xxxp() (put zapis). Przesuwa wskaźnik pozycji pliku na wartość _Off odnośnie _Way : o _Way == ios_base::beg odnośnie początku pliku o _Way == ios_base::end odnośnie końca pliku o _Way == ios_base::cur odnośnie bieżącej pozycji basic_istream& basic_istream::seekg( off_type _Off, ios_base::seekdir _Way ); basic_ostream& basic_ostream:: seekp( off_type _Off, ios_base::seekdir _Way ); Ustawia wskaźnik pozycji pliku w pozycje, podaną przez _Pos: basic_istream& basic_istream::seekg( pos_type _Pos ); basic_ostream& basic_ostream:: seekp( pos_type _Pos ); Informuje, w której pozycji znajduje się wskaźnik pozycji pliku: pos_type basic_istream :: tellg( ); pos_type basic_ostream :: tellp( ); 28

Przykład: #include <iostream> #include <fstream> int main ( ) using namespace std; ifstream file; char c, c1; file.open( "basic_istream_seekg.txt" ); file.seekg(2); // chars to skip file >> c; cout << c << endl; Plik: basic_istream_seekg.txt: 0123456789 Output: 2 0 9 file.seekg( 0, ios_base::beg ); file >> c; cout << c << endl; } file.seekg( -1, ios_base::end ); file >> c1; cout << c1 << endl; 29

Sprawdzenie stanu wejścia \ wyjścia. Bieżący stan systemu We \ Wy jest przechowywany w obiekcie typu ios_base::iostate : typedef T2 iostate; static const iostate badbit, eofbit, failbit, goodbit; ios_base::goodbit ios_base::eofbit ios_base::failbit ios_base::badbit Żaden bit błędu nie był wykryty 1 EOF, 0 nie pozostał osiągnięty 1 wystąpił niekrytyczny błąd We \ Wy, 0 nie wystąpił 1 wystąpił krytyczny błąd We \ Wy, 0 nie wystąpił Funkcje ios_base::iostate basic_ios:: rdstate( ) const; zwraca obiekt typu iostate, zawierający te flagi bitowe. failbit = 1 na przykaład, przy wprowadzeniu int okazał się symbol, który nie może być konwertowany poprawnie na typ int ( Przykład IO_1) 30

Przykład: template <typename T> void checkfilestate(t &stream) /*====================================================== T == ifstream T == ofstream T == fstream =======================================================*/ ios_base::iostate st = stream.rdstate(); } if(st & ios_base::eofbit) cout << "EOF achieved\n"; else if(st & ios_base::failbit) cout << "nie fatalny blad I/O\n"; else if(st & ios_base::badbit) cout << "fatalny blad I/O\n"; Inny sposób sprawdzenia: bool basic_ios::bad( ) const; //true, jeśli flaga badbit jest ustawiona bool basic_ios::eof( ) const; //true, jeśli flaga eofbit jest ustawiona bool basic_ios::fail ( ) const; // true, jeśli flaga failbit jest ustawiona bool basic_ios::good ( ) const; // true, jeśli flaga goodbit jest ustawiona 31

wyzerowanie flag błędów: void basic_ios::clear( iostate _State = goodbit ); Jeśli jako argument jest podana flaga goodbit, wszystkie flagi pozostaną wyzerowane. Jeśli jako argument podać inną flagę, tylko ta flaga będzie wyzerowana. Przykład W16 jeden plik dwa strumieni Przykład L7 jeden plik jeden strumień (otwieranie plików, odczyt-zapis, testowanie odczytu-zapisu, wielokrotne powtarzanie, eksportowanie pliku do Excel i uruchomienie procesu Excel). 32