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

Podobne dokumenty
Programowanie Obiektowe i C++

Pliki wykład 2. Dorota Pylak

Pliki wykład 2. Dorota Pylak

Wejście wyjście strumieniowe

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

Język C++ wykład VIII

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

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

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

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

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

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

Programowanie w językach

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

Pliki wykład. Dorota Pylak

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

Pliki wykład. Dorota Pylak

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

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

Wykład :37 PP2_W9

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

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

Programowanie i struktury danych

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

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

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

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

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

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

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

Część 4 życie programu

Podstawy Programowania

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

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

Język C++ zajęcia nr 1

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

TEMAT : KLASY DZIEDZICZENIE

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

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

Zajęcia nr 5 Algorytmy i wskaźniki. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

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

Programowanie Procedurale. Pliki w języku C++

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

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

po ostatnim dopisaniu na standardowe wyjście (cout) powinien zostać wyprowadzony komunikat "Skonczylem";

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

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

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

Funkcje zawarte w bibliotece < io.h >

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Funkcje zawarte w bibliotece < io.h >

Programowanie obiektowe

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

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)

Programowanie Obiektowe i C++

Podstawy programowania w C++

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

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

Projektowanie klas c.d. Projektowanie klas przykład

Strumienie standardowe C

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

Programowanie komputerowe. Zajęcia 1

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

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

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

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

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

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

Język C++ wykład VI. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VI. dr Jarosław Mederski.

Wzorce funkcji (szablony)

Zaawansowane programowanie w języku C++ Biblioteka standardowa

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Biblioteka standardowa - operacje wejścia/wyjścia

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

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

Wyjątki (exceptions)

Rzutowanie i konwersje

Wstęp do programowania. Wykład 1

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2015

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Pytania sprawdzające wiedzę z programowania C++

1 Strumienie. 2 Pliki. 2.1 Zapis do pliku tekstowego. Programowanie w j zyku C - Adam Krechowicz, Daniel Kaczmarski

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

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

I - Microsoft Visual Studio C++

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

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

dr inż. Jarosław Forenc

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

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

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

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

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

Podstawy programowania w języku C i C++

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

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Transkrypt:

Wejście-wyjście Nie jest elementem języka C++ Niezbyt istotne dla użytkownika, ważne dla języka: jest mocny, skoro da się w nim wyrazić nowe pojęcia; łatwiej przenieść go na nową platformę jest mniejszy. Standardowa biblioteka we-wy iostream. Operacje we-wy wykonuje się na strumieniach. Strumienie Strumienie są ciągami znaków. Operacje we-wy polegają na przekształcaniu obiektów na ciągi znaków i vice versa. Zaleta strumieni: wygodne i jednolite traktowanie typów wbudowanych i zdefiniowanych przez użytkownika. Wyjście Standardowe strumienie: cout i cerr. cout odpowiada stdout z C a cerr stderr. Ponadto: clog (jak cerr, ale buforowany) Wszystkie mają swoje odmiany dla Unicode: wcout,... Operator «ostream& operator<<(ostream&, T) T może być (i często jest) typem referencyjnym. typ wyniku umożliwia skróty takie jak: cout << "i=" << i << \n ; 59

zamiast cout<<"i="; cout<<i; cout<< \n ; Operatory << i >> wiążą w lewo. Priorytet << jest niższy niż operacji arytmetycznych. Dzięki temu można napisać np. cout << "a*x+b"= << a*x+b ; Są jednak operatory o jeszcze niższych priorytetach: cout << "x^y z=" << x^y z ; // Błąd! cout << "x^y z=" << (x^y z) ; // Tak! Operator «W treści operatora należy jako wynik przekazać strumień będący parametrem operatora. Ponieważ pierwszy argument pochodzi z klasy ostream, nie można go zdefiniować jako metodę klasy T, lecz tylko jako funkcję. Zwykle powinna to być funkcja zaprzyjaźniona z klasą T. Zamiast operatora << można dla znaków używać funkcji put, np. Przykład cout.put( A ) zaś dla napisów funkcji write. class Zespolone double re,im ; public: friend ostream& operator<<(ostream& os, Zespolone& z); ostream& operator<<(ostream& os, Zespolone& z) os<< ( z.re<<, <<z.im<<")"; return os ;; // Bardzo ważne! 60

Klasa ostream W uproszczeniu: class ostream: public virtual ios //... public: ostream& operator<<(char); ostream& operator<<(const char*); ostream& operator<<(int); //... ostream& operator<<(ostream& (*pf)(ostream &); ostream& put(char); ostream& write(const char *); ostream& flush() ; ; Wejście Standardowy strumień cin. Operator >> istream& operator>>(istream&, T) zwykle implementujemy go tak: istream& operator>>(istream& is, T& zmienna) // pomiń białe znaki: spacja, tab, nowa linia... // wczytaj tekstową reprezentację T na zmienną return is ; Uwaga: pamiętajmy, że strumienie wyjściowe mają typ ostream, a wejściowe istream. Istnieje również typ mieszany iostream. Czy udało się odczytać? Zapis if(s>>zmienna)... 61

jest poprawny i oznacza sprawdzenie, czy wczytanie zmiennej się powiodło. Taki zapis jest możliwy dzięki operatorowi konwersji typu istream do int. Przykład: main() int i; while(cin>>i) cout<<i ; Metody get Zamiast operatora >> możemy użyć jednej z metod get: char buf[100]; cin >> buf; // Tu grozi nam wyjście poza tablicę cin.get(buf,100); // Tu jesteśmy bezpieczni class istream : public virtual ios //... istream& get(char* s, int n, char delim= \n ); istream& get(char c); cin>>c pomija białe znaki, cin.get(c) nie. cin>>buf wczyta tylko do pierwszego białego znaku, cin.get(buf) do pierwszego wystąpienia delim (domyślnie koniec linii). Funkcje pomocnicze Nagłówek ctype.h zawiera użyteczne funkcje klasyfikacji znaków, np. isspace(char) czy biały znak isalpha czy litera isdigit czy cyfra...i wiele innych Metoda putback(char) pozwala na wstawienie znaku z powrotem do strumienia (ale ostrożnie). Metoda peek() pozwala na podejrzenie następnego znaku, bez jego pobierania. 62

Stany strumienia Z każdym strumieniem związany jest jego stan. Klasa podstawowa strumieni ios definiuje metody testowania stanu, np. Bity stanu int eof() ; // napotkano koniec strumienia int good(); // operacja się udała int fail(); // operacja się nie udała int bad() ; // strumień jest do niczego W rzeczywistości stan strumienia jest reprezentowany przez ciąg bitów, które można ustawiać, zerować i testować: int s = cin.rdstate(); // odczytaj bity stanu if(s & ios::goodbit) // operacja się udała else if (s & ios::failbit) // niedobrze else if (s & ios::badbit) // pacjent nie przeżył cin.clear(ios::badbit) // wbrew nazwie ustawia badbit Przykład istream& operator>>(istream& s, Zespolona& z) double re=0,im=0; char c = 0; s << c; if(c== ( ) s>>re>>c; if(c==, ) s>>im>>c; if(c!= ) ) s.clear(ios::badbit); else s.putback(c);s>>re; if(s) z=zespolona(re,im); return s; 63

Formatowanie Klasa ios zawiera operacje służące do określania sposobu wypisywania danych, np. int width(int w); określa minimalną szerokość pola, na którym będzie wypisywany następny element, np. cout << ( ; cout.width(4); cout << 12 << ) ; Spowoduje wypisanie 12 w polu szerokości 4: ( 12) Uwaga: width dotyczy tylko jednej, następnej operacji. Domyślnie jest 0, czyli (tylko) tyle znaków ile potrzeba. Manipulatory Manipulatory są pojedynczymi elementami wstawianymi do strumieia, wpływającymi na realizację wyjścia. Poznaliśmy już manipulator endl: cout << "Kaczka dziwaczka" << endl ; Powoduje on przejście do nowej linii i opróżnienie bufora, czyli cout << \n ; cout.flush() ; Zamiast width można żyć manipulatora: cout << ( << setw(4) << 12 << ) ; 64

Implementacja manipulatorów Dzięki przeciążaniu, tworzenie własnych manipulatorów nie jest trudne: ostream& flush(ostream&); class Flushtype ; // potrzebujemy nowego typu ostream& operator<<(ostream& os, Flushtype) return flush(os) ; Flushtype FLUSH; Teraz możemy wymuszać opróżnienie bufora przez wysłanie FLUSH: cout << x << FLUSH << y << FLUSH; Lepsza implementacja Powyższą metodę można uogólnić na wszystkie funkcje takiego typu jak flush: typedef ostream& (*manip)(ostream&); czyli manip jest wskaźnikiem do funkcji o zarówno argumencie jak i wyniku typu ostream& ostream& operator<<(ostream& os, manip f) return f(os) ; Teraz śmiało możemy napisać cout << flush ; W rzeczywistości klasa ostream ma już odpowiednie metody. Strumienie i pliki Mechanizmu strumieni można używać dla wejścia wyjścia plikowego. Należy w tym celu włączyć nagłówek <fstream> Plik otwiera się dla wyjścia przez utworzenie obiektu klasy ofstream z nazwą pliku jako argumentem. Podobnie dla wejścia, tyle, że używamy ifstream. W obu wypadkach warto sprawdzić stan strumienia, y przekonać, że udało się otworzyć plik. 65

Przykład int main(int argc, char* argv[]) ifstream skad(argv[1]); if!(skad) cerr << "Blad:..."; ofstream dokad(argv[2]); if!(dokad) cerr << "Blad:..."; char ch; while(skad.get(ch)) dokad.put(ch); if(!skad.eof() dokad.bad()) cerr << "Blad:..."; Zamykanie strumieni Strumień związany z plikiem powinien być na końcu zamknięty. Zwykle nie musimy się o to martwić - załatwia to destruktor strumienia. Jeśli jednak potrzeba zamknąć strumień przed końcem jego zasięgu, można to uczynić metodą close() Oczywiście zamkniętego strumienia nie można już używać. Jeszcze o napisach Do tej pory do przechowywania napisów używaliśmy tablic. Wadą tablic jest ich stały rozmiar Mechanizm klas pozwla na lepsze rozwiązania. Biblioteka standardowa C++ zawiera klasę string, implementującą ciągi składające się ze zmiennej liczby znaków. By jej używać, należy włączyć nagłówek <string> 66

Konstruowanie napisów string x0; // pusty napis string x2( a ); // "a" string x3( a,5); // "aaaaa" string x4("abcde");// "abcde" string x4("abcdef",5);// "abcde" string x6(x5); // "abcde" string x7(x5,1); // "bcde" string x8(x5,0,3); // "abc" Wycinanie x0[1] // drugi znak x0 x0.substr() // kopia całości x0.substr(pos) // od pozycji pos x0.substr(pos,n) // max n znaków od pozycji pos x0.remove(pos) // usuń od pozycji pos x0.remove(pos,n) // max n znaków od pozycji pos Sklejanie string stringone("hello"); string stringtwo("world"); stringone += " " + stringtwo; stringone = "hello"; stringone.append(" world"); string stringthree("hello"); // doklej " world": stringthree.append(stringone, 5, 6); cout << stringthree << endl; Porównywanie i wyszukiwanie x0 == x1 x0 < x1 // Można używać relacji 67

x0.find(c) // znajdź znak x0.find(s) // znajdź napis x0.find(s,m,n) // znajdź w wyznaczonym fragmencie x0.rfind(...) // to co find, tylko od tyłu Oczywiście napisy współpracują ze strumieniami: string x; cin >> x; cout << x; getline(cin,x0); // Dlaczego nie cin.getline()? 68