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

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

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

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

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

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

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

Programowanie Obiektowe i C++

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

Wejście wyjście strumieniowe

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

Wstęp do programowania obiektowego

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

Język C++ wykład VIII

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

Pliki wykład 2. Dorota Pylak

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

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

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

Pliki wykład 2. Dorota Pylak

Wykład :37 PP2_W9

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

Programowanie w językach

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

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

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

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

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

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

Operatory na rzecz typu TString

4. Wyrzuć wyjątek jeśli zmienna ist nie istnieje bloki: try, catch i wyrzucanie wyjątku

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

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

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 20 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32

Pliki wykład. Dorota Pylak

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

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

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

Podstawy Programowania

Projektowanie klas c.d. Projektowanie klas przykład

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

Pliki wykład. Dorota Pylak

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

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

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

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

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

Strumienie standardowe C

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

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

Język C++ zajęcia nr 2

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

Część 4 życie programu

TEMAT : KLASY DZIEDZICZENIE

Programowanie i struktury danych

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

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

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Programowanie komputerowe. Zajęcia 5

dr inż. Jarosław Forenc

> C++ typy wyliczeniowe, struktury, unie, konwersje napis <-> liczba, formatowanie wyjścia

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

Programowanie obiektowe

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2015

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

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

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

VII. Ciągi znaków łańcuchy

Programowanie obiektowe

Język C++ zajęcia nr 1

Wstęp do programowania. Wykład 1

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

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Programowanie - wykład 4

Podstawy programowania w C++

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

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

INFORMATYKA Studia Niestacjonarne Elektrotechnika

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

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

Programowanie komputerowe. Zajęcia 1

Struktury, unie, formatowanie, wskaźniki

Zadania z podstaw programowania obiektowego

۰ Elementem jednostkowym takiego pliku jest bajt. ۰ Format pliku binarnego: [bajty pliku][eof]

Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Wstęp do programowania. Dariusz Wardecki, wyk. X

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

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

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

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

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Laboratorium 1. Programowanie II - Kierunek Informatyka. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

Wyjątki (exceptions)

Programowanie Obiektowew języku C++ Zadania L4

Referencje. Programowanie w C/C++ Zasady zaliczeń. Referencje. Zasady zaliczeń. Zasady zaliczeń. Informacje organizacyjne: Krzysztof Trojanowski

PARADYGMATY PROGRAMOWANIA Wykład 3

Transkrypt:

Referencje Informacje organizacyjne: Wykład: środy, 13:15 14:45 Strona główna www z komunikatami dla ZPO: http://troja.uksw.edu.pl/category/zpo2017/ Zaawansowane Programowanie Obiektowe E-mail: k.trojanowski@uksw.edu.pl maile zbiorowe i anonimowe są ignorowane (konieczne jest imię i nazwisko) 1 2 Zasady zaliczenia ZPO Zasady zaliczenia zajęć laboratoryjnych 1. Trzeba zaliczyć zajęcia laboratoryjne (ćwiczenia) ZPO. 2. Potem można próbować zaliczyć wykład ZPO (podejść do egzaminu). Nigdy w odwrotnej kolejności. Jest 7 zajęć w semestrze. Na każdych zajęciach można uzyskać 0, 1, 2,.., 9 lub 10 pkt. Na zajęciach zawsze ustalony jest minimalny zestaw zadań do realizacji. Wykonanie tego zestawu w całości gwarantuje co najmniej 6 pkt. 3 4 Zasady zaliczenia zajęć laboratoryjnych Zasady zaliczenia zajęć laboratoryjnych Oprócz zadań zestawu minimalnego podawane są na zajęciach jeszcze inne zadania, za które można zdobyć pozostałe dwa punkty. Można mieć tylko 2 razy 0 pkt. za udział w zajęciach. Jeżeli przydarzy się to 3 razy, jedne zajęcia można odrobić na koniec semestru. Odrobienie polega na samodzielnym wykonaniu na ostatnich zajęciach dodatkowego zadania, którego zakres dotyczy całego materiału, niezależnie od tego, które zajęcia zostały zaliczone na zero i są odrabiane. Warunkiem koniecznym zaliczenia całego semestru zajęć laboratoryjnych jest spełnienie łącznie następujących dwóch wymagań: (1) zebranie co najmniej połowy ze wszystkich możliwych do uzyskania punktów, (2) ewentualnie niezaliczenie nie więcej niż dwóch zajęć w semestrze. 5 6 1

Zasady zaliczenia wykładów Zasady zaliczenia wykładów Wykład kończy się egzaminem pisemnym. Do egzaminu dopuszczone zostaną tylko te osoby, które wcześniej otrzymają zaliczenie z ćwiczeń. Należy je uzyskać przed rozpoczęciem sesji egzaminacyjnej. Przewidywane są dwa terminy egzaminu. Zestaw egzaminacyjny będzie zawierał pytania z teorii programowania obiektowego oraz dobrych praktyk programistycznych. Na egzaminie nie będzie natomiast wymagane napisanie kodu programu. Może być jednak wymagane poprawne zinterpretowanie kodu podanego w materiale egzaminacyjnym (pytania w rodzaju: "dlaczego ten program nie zostanie skompilowany? - znajdź błąd", lub "co pojawi się w oknie konsoli po wykonaniu tego programu?". 7 8 Strumienie Dane wejściowe pobierane wierszami: int_type get( ); basic_istream& get( char_type& _Ch ); basic_istream& get(char_type *_Str, streamsize _Count); basic_istream& get( char_type *_Str, streamsize _Count, char_type _Delim ); Przerywa swoje działanie zaraz po znalezieniu ogranicznika, ale tego ogranicznika już nie pobiera ze strumienia. char c[10]; c[0] = cin.get( ); // pobiera jeden element cin.get( c[1] ); // pobiera jeden element cin.get( &c[2],3 );// pobiera do napotkania znaku \n, ale max. 3 cin.get( &c[4], 4, '7' );// pobiera do napotkania znaku 7, ale max. 4 10 Dane wejściowe pobierane wierszami: basic_istream& getline( char_type *_Str, streamsize _Count ); basic_istream& getline( char_type *_Str, streamsize _Count, char_type _Delim ); Przerywa swoje działanie zaraz po znalezieniu ogranicznika, którego pobiera ze strumienia. int main( ) char c[10]; // pobiera max. 3 elementy do napotkania 2 cin.getline( &c[0], 5, '2' ); Dane wejściowe pobierane wierszami: Funkcja globalna getline() z pliku nagłówkowego <string> wprowadza dane ze strumienia do obiektu typu string. Wczytuje do napotkania ogranicznika, znaku końca pliku, lub gdy liczba wczytanych znaków przekroczy is.max_str : int main() string s1; cout << wprowadź tekst (uzyj <spacja> jako znaku końca): "; getline(cin,s1, ' '); cout << Wprowadziłeś: " << s1 << endl;; 11 12 2

const int SZ = 100; // rozmiar bufora char buf[sz]; ifstream in("test1.txt"); ofstream ou("test2.txt", ios::app); while(in.getline(buf, SZ)) // uwaga: getline usuwa \n char* cp = buf; while(*cp!= ':') ++cp; *cp = 0; cp += 2; cout << cp << endl; ou << cp << ":" << buf << endl; Test1.txt: Iksiński:00 Kowalski:01 Nowak:02 Okno terminala: 0 1 2 Co zawiera Test2.txt? basic_istream& ignore( streamsize _Count = 1, int_type _Delim = traits_type::eof( ) ); pomija określoną liczbę znaków w strumieniu wejściowym, lub nieokreśloną aż do wystąpienia określonego znaku: char bufor[10]; cout << Napisz 'abcdef': "; cin.ignore( 5, 'c' ); cin >> bufor; cout << bufor; Wyjście: def 13 14 int_type peek( ); zwraca jeden znak ze strumienia (w postaci zmiennej typu int, aby mógł to być również znak EOF). Znak pozostaje w strumieniu i będzie pierwszym znakiem wczytanym przy następnej operacji czytania char c[10], c2; cout << Napisz 'abcde': "; c2 = cin.peek( ); cin.getline( &c[0], 9 ); cout << c2 << " " << c << endl; basic_istream& putback( char_type _Ch ); wstawia znak _Ch do strumienia; będzie on pierwszym znakiem wczytanym przez następną operację czytania. Zwraca odnośnik do strumienia na rzecz którego została wywołana. Nie do każdego strumienia i nie zawsze można wstawić znak char c[10], c2, c3; c2 = cin.get( ); // użytkownik nacisnął klawisz q c3 = cin.get( ); // użytkownik nacisnął klawisz w cin.putback( c2 ); cin.getline( &c[0], 9 ); Wyjście: Napisz 'abcde': abcde a abcde Wyjście: qw q 15 16 basic_istream& unget( ); wstawia ostatnio przeczytany znak z powrotem do strumienia; będzie on pierwszym znakiem wczytanym przez następną operację czytania. Zwraca odnośnik do strumienia na rzecz którego został wywołany. char c[10], c2; Przykład: cout << "Wpisuj linie tekstu. Zakończ znakiem końca pliku\n << "(Ctr-Z w Windows, Ctr-D w Linuksie). Komentarze\n << "od \'//\' do końca linii będą pomijane\n\n"; char c; while ( cin.get(c) ) if ( c == '/' ) cout << Napisz 'abc': "; if ( cin.peek() == '/') // sprawdź, czy następny to też slash c2 = cin.get( ); cin.unget( ); cin.ignore(1024,'\n'); // pomiń 1024 znaki lub do końca linii cin.getline( &c[0], 9 ); cout << endl; continue; Wyjście: Napisz abc : abc cout << c; abc 17 18 3

Działania na flagach stanu: Zerowanie flagi błędu: void clear( iostate _State=goodbit ); 1. zeruje flagi błędu (wywołanie bez argumentu) i 2. ewentualnie ustawia niektóre z nich podane w argumencie wywołania. Działania na flagach stanu: iostate rdstate( ) const; odczytuje stan bitów dla flag void TestFlags( ios& x ) cout << ( x.rdstate() & ios::badbit ) << ' '; cout << ( x.rdstate() & ios::failbit ) << ' '; cout << ( x.rdstate() & ios::eofbit ) << endl; cout << endl; int main( ) ofstream ofx( "test.txt" ); ofx.clear( ); TestFlags( ofx ); ofx.clear( ios::badbit ios::failbit ios::eofbit ); TestFlags( ofx ); Wyjście: 0 0 0 19 1 4 2 20 basic_ostream<elem, Traits> *tie( ) const; basic_ostream<elem, Traits> *tie( basic_ostream<e, T> *_Str ); gwarantuje kolejność wykonywania operacji na strumieniach Pierwsza metoda zwraca wskaźnik wiązania dla strumienia, druga umieszcza wskaźnik do strumienia w swoim polu wskaźnika wiązania. W ten sposób gwarantuje, że działania na powiązanym drugim strumieniu nie rozpoczną się, zanim w pełni nie zostaną zakończone działania na pierwszym. int i; cin.tie( &cout ); cout << Wprowadź liczbę:"; cin >> i; Przykład jest sztuczny, ponieważ domyślnie strumienie cin i cout są powiązane Metoda operator konwersji na wskaźnik: operator void*() const wywołuje na rzecz strumienia metodę good() Przykład: int i; while (mystream >> i) // tu działa operator void*() cout << i << endl 1. wykonuje mystream >> i i zwraca referencję do mystream 2. mystream jest niejawnie konwertowany do void*, który daje wartość nullptr, jeżeli operacja się nie powiodła, lub non-null w przeciwnym przypadku 21 22 Metoda operator konwersji na bool bool operator!( ) const; wywołuje na rzecz strumienia metodę fail(): if (!mystream) // wykonaj obsługę tej sytuacji Strumienie Manipulatory bezargumentowe 23 4

Własne manipulatory bezargumentowe Tworzymy je jako funkcje globalne 1. z dokładnie jednym parametrem, który musi być typu referencja do strumienia ; 2. wartością zwracaną musi być ten sam odnośnik. ostream& mój_manip(ostream& strum) // tutaj nasz kod działający na strumieniu return strum; ios_base::fmtflags flagi_domyslne; ostream& naukowy(ostream& str) flagi_domyslne = str.flags(); str.setf(ios::showpos ios::showpoint); str.setf(ios::scientific, ios::floatfield); str.precision(12); return str; ostream& normalny(ostream& str) str.flags(flagi_domyslne); return str; ostream& przec(ostream& str) return str << ", "; int main(int argc, char *argv[]) double x = 123.456; cout << naukowy << x << przec << normalny << x << endl; Taki manipulator można wstawiać do strumienia kaskadowo wraz z innymi argumentami czy manipulatorami dzięki temu, że zwraca referencję do strumienia, na rzecz którego został wywołany. 25 26 Własne manipulatory bezargumentowe We wszystkich przypadkach w poprzednim przykładzie parametr wywołania funkcji definiującej manipulator ma typ ostream& To daje elastyczność: nigdzie nie jest powiedziane, że to musi być cout może to być dowolny strumień reprezentowany obiektem ostream lub obiektem dowolnej klasy dziedziczącej po ostream (np. fstream, etc.) Strumienie (efektory) 27 Aby używać predefiniowanych manipulatorów argumentowych: #include <iomanip> setw(int szer) (set width) ustawia szerokość pola wydruku dla najbliższej operacji na strumieniu. Działa jak opisana wcześniej metoda width(int), ale nie zwraca liczby, tylko odniesienie do strumienia. W ten sposób określana jest minimalna szerokość pola: jeśli wyprowadzana liczba zajmuje więcej znaków, to odpowiednie pole wydruku zostanie zwiększone setfill(int znak) ustawia znak, którym będą wypełniane puste miejsca jeśli szerokość pola wydruku jest większa niż liczba wyprowadzanych znaków (domyślnie jest to znak odstępu) Aby używać predefiniowanych manipulatorów argumentowych: #include <iomanip> setprecision(int prec) - ustawia precyzję jak metoda precision, ale nie jest zwracana poprzednia wartość, tylko odniesienie do strumienia setbase(int baza) - wypisuje liczby całkowite używając podstawy baza (8, 10 lub 16) 29 30 5

Aby używać predefiniowanych manipulatorów argumentowych: #include <iomanip> Uniwersalny manipulator do działania na poszczególnych flagach setiosflags(long flag) ustawia flagę formatowania tak jak jednoargumentowa metoda setf, czyli,,or uje'' argument flag z flagą stanu formatowania; resetiosflags(long flag) odpowiednik metody unsetf. Przykład: int j = 10; cout << j << endl; cout << hex; cout << j << endl; cout << resetiosflags(ios_base::hex); // cout.unsetf( ios_base::hex ); cout << setiosflags(ios_base::oct); // cout.setf( ios_base::oct ); cout << j << endl; Wyjście: 10 a 12 31 32 Własne manipulatory z argumentami Aby utworzyć własne manipulatory z argumentami używamy techniki tworzenia efektorów. Efektor to para: 1. Prosta klasa posiadająca pole oraz konstruktor, który pobiera parametr będący argumentem wywołania manipulatora, oraz 2. Przeciążona funkcja operator<< do wstawienia odpowiednich danych do strumienia. Efektor przykład: 1. Prosta klasa posiadająca pole oraz konstruktor: class Fixw string str; // pole do przechowania podanej wartości public: Fixw(const string& s, int width) : str(s, 0, width) ; friend ostream& operator<<(ostream& os, const Fixw& fw); ; 2. Przeciążona funkcja, korzystająca ze zdefiniowanej klasy: ostream& operator<<(ostream& os, const Fixw& fw) return os << fw.str; 33 34 Efektor przykład: class Fixw string str; public: Fixw(const string& s, int width) : str(s, 0, width) friend ostream& operator<<(ostream& os, const Fixw& fw); ; ostream& operator<<(ostream& os, const Fixw& fw) return os << fw.str; Wykorzystujemy tu konstruktor klasy string : string ( const string& str, size_t pos, size_t n = npos ); Wykorzystanie przykładowego efektora: cout << Fixw(string, i) << endl; za pomocą wywołania konstruktora Fixw tworzony jest obiekt tymczasowy, który jest przekazywany do globalnej funkcji operator<< Obiekt tymczasowy typu Fixw pozostaje w pamięci aż do zakończenia instrukcji. zawartość obiektu inicjalizujemy łańcuchem tekstowym z którego bierzemy fragment zaczynający się od pozycji pos i o długości n 35 36 6

Efektor inny przykład: typedef unsigned long ulong; class Bin ulong n; public: Bin(ulong nn) n = nn; friend ostream& operator<<(ostream& os, const Bin& b); ; friend ostream& operator<<(ostream& os, const Bin& b) const ulong ULMAX = numeric_limits<ulong>::max(); ulong bit = ~(ULMAX >> 1); // ustawiamy najwyższy bit while(bit) os << (b.n & bit? '1' : '0'); bit >>= 1; Wykorzystanie przykładowego efektora: ostringstream s; s << Bin(0x76543210UL); ~(ULMAX >> 1) daje wartość unsigned long z ustawionym najstarszym bitem. Wartość ta jest przesuwana w prawo w kolejnych iteracjach pętli while. Efektor Bin wykorzystuje fakt, że przesunięcie liczby bez znaku w prawo wstawia zera na starsze bity. return os; ; 37 38 UWAGA! Tyle informacji wystarczy, żeby wykonać zadania dotyczące dostępu do plików za pomocą strumieni, jakie będą realizowane na ćwiczeniach. 39 7