4. Standard-containers. Strömmar och filer

Relevanta dokument
Programmering i C++ EDA623 Strömmar och filer. EDA623 (Föreläsning 9) HT / 19

Innehåll. Pekare. Datatyper Pekare, Arrayer och Referenser. Pekare Syntax. Pekare Syntax, operatorer. 4. Standard-containers. Pekare och arrayer

Innehåll. 1 Algoritmer. 2 Strömmar och filer. 3 Iteratorer. 1 Söka, räkna. 2 Jämföra, genomlöpa. 3 Generera nya data. 4 Kopiera och flytta element

Innehåll. Klasserna vector och deque

Programmering i C++ EDA623 Containerklasser och algoritmbibliotek. EDA623 (Föreläsning 10) HT / 33

TDIU01 - Programmering i C++, grundkurs

TDIU01 (725G67) - Programmering i C++, grundkurs

C++ - En introduktion

Del6 Strömmar Ämnesområden denna föreläsning:

Kapitel 5. Strömmar. Utmatning

Innehåll. 1 Deklarationer, scope och livstid. 2 Användardefinierade typer. 4 Operatoröverlagring. 5 In- och utmatning. 6 namnrymder (namespace)

Föreläsning 4: Filer och strömmar

Innehåll. Exceptionella händelser (exceptions, undantag ) Felhantering Tre nivåer av felhantering: Nivå 2: exceptions (eller returvärde)

6 In- och utmatning, strömmar

Innehåll. Parametriserade typer. Klassmallar. Klassmallen Vektor Konstructor med std::initializer_list. Klassmallen Vektor Medlemsfunktioner

TDDC76 - Programmering och Datastrukturer

C++ - En introduktion

Innehåll. 1 Deklarationer, scope och livstid. 2 Användardefinierade typer. 4 In- och utmatning. 5 Operatoröverlagring. 6 namnrymder (namespace)

Innehåll. 1 Funktionsmalllar. 2 Klassmallar. struct Name { string s; //... }; const Name & minimum ( const Name & a, const Name & b) { if(a.s < b.

Strömmar och strängar

TDIU01 - Datortenta (DAT2)

TDIU01 - Programmering i C++, grundkurs

Algoritmbiblioteket (STL) Designstrategi Generiska algoritmer som fungerar på godtyckliga samlingsdatatyper, vilka har iteratorer.

TDIU01 - Programmering i C++, grundkurs

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Administration. EDAf30: Programmering i C++, 7.5 hp Obligatoriska moment

Avrundning och manipulatorer

Användning av typeid. Operatorerna typeid och. Filen typeinfo.h måste inkluderas. typeid

Introduktionslaboration

Innehåll. 1 volatile. 2 Kuriositeter. 3 Klasser och arv. 4 Råd och tumregler. 5 Mer om standard-containers. Trigraphs

Innehåll. Datatyper Pekare, Arrayer och Referenser. Pekare. Pekare Syntax. Pekare Syntax, operatorerna * och & 5. Pekare och arrayer. Algoritmer.

2D1387, Programsystemkonstruktion med C++ 01/02 1

TDIU01 Programmering i C++

TDIU01 - Programmering i C++, grundkurs

Programmering i C++ EDAF hp. EDAF30 (Föreläsning 2) HT / 18

LÖSNINGSFÖRSLAG TILL Tentamen i objektorienterad programmering i C++ I

Tentamen EDAF30 Programmering i C++

Innehåll. Användardefinierade typer. Användardefinierade typer Kategorier. Konstruktorer. Konstruktorer Två sätt att skriva initiering av medlemmar

Standard Template Library STL. Behållarklasser

C++ Lektion Filhantering

TDIU01 - Programmering i C++, grundkurs

Tecken. char. char ch = A ; sizeof(char) = 1 byte (ej 16-bitars tecken som i Java) char namn[]= "Nils"; // längd = 5 bytes

Föreläsning 1: Momstabellen i C++

Introduktionslaboration

Introduktion till streams

Innehåll. Pekaren this Självreferens. Klasser Resurshantering, representation. Överlagring av operatorer. Överlagring av operatorer

TDIU01 - Datortenta (DAT2)

Innehåll. 1 Funktionsmallar. 2 Pekare och konstanter. 3 Typomvandlingar. struct Name { string s; //... };

Innehåll. Pekare Exempel

DD2387 Programsystemkonstruktion med C++ Tentamen 2

Programmering i C++ EDA623 Mallar. EDA623 (Föreläsning 12) HT / 29

Innehåll. Pekare Exempel

Övning från förra gången: readword

Intro till standardbiblioteket. Eric Elfving

FÖRSLAG TILL LÖSNING AV Tentamen i Objektorienterad programmering C++ I

TDIU01 - Programmering i C++, grundkurs

Programsystemkonstruktion med C++: Övning 2. Karl Palmskog september 2010

Filhantering. Grunderna i filhantering. Uppbyggnad av filer. Data hierarkin. Filpekaren. Positionering i filer

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Inlämningsuppgift, EDAF30, 2016

Innehåll. Konstruktorer vid arv Regler för basklassens konstruktor. Konstruktorer vid arv. Konstruktorer vid arv. Konstruktorer vid arv

ÖREBRO UNIVERSITET. Lösningarna till tentamensuppgifterna sätts ut på kurssidan på nätet i dag kl 13.

Innehåll. Resurshantering. Resource handles. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 6. Resurshantering

Tommy Färnqvist, IDA, Linköpings universitet

Tentamen EDAF30 Programmering i C++

Innehåll. Pekare Syntax

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (casting) Implicita Typomvandlingar

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT / 42

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

TDIU20 - Objektorienterad programmering i c++ - föreläsning 4

Programmering i C++ EDA623 Mer om klasser. EDA623 (Föreläsning 6) HT / 26

TDDC76 - Programmering och Datastrukturer

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

C++ Lektion Tecken och teckenfält

Inlämningsuppgift, EDAF30, 2018

Övningsuppgifter. TDIU04 Programmering i C++, standardbibliotek. Innehåll. Vt Lektion Lektion Lektion Lektion 4...

Strängar. Strängar (forts.)

TDIU20 - Objektorienterad programmering i c++ - föreläsning 3

Enkla datatyper minne

Tentamen i Objektorienterad Programmering 5p, Au, D, Fri, Pr,

Programmering i C++ EDA623 Typer. EDA623 (Föreläsning 4) HT / 33

2D1387 Programsystemkonstruktion med C++ Laboration 1: Grundläggande C++ 31 augusti 2005

Tentamen EDAF30 Programmering i C++

Funktionens deklaration

Imperativ programmering (Fö 1 2) C++ Ett första programexempel. Enkel in- och utmatning strömbiblioteket

Innehåll. Resource handles. Resurshantering. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 7. Resurshantering, Felhantering

Innehåll. 1 Kort om dynamisk polymorfism. 2 Arv i C++ 3 Multipelt arv. 4 Något om statisk polymorfism. class Container {

1 Texthantering. 1.1 Typen char. Exempel, skriv ut alfabetet

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Kapitel 4 - Mallar. Kapitel 4. Introduktion till mallar STL. 2D1387 Programsystemkonstruktion med C++ 1

Kapitel 4. Funktionsmallar. Mallar. Introduktion till mallar STL

Kapitel 4. Funktionsmallar. Mallar. Introduktion till mallar STL

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (type casts) Explicita, namngivna typomvandlingar (C++-11)

Föreläsning 3-4 Innehåll

Tentamen EDAF30 Programmering i C++

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Enklast att skriva variabelnamn utan ; innehåll och variabelnamn skrivs ut

Pekare. Pekare. Varför använder vi pekare? Vad är en pekare? Pekare. Deklaration/initiering av pekare

Transkript:

EDAF30 Programmering i C++ 4. Standard-containers. Strömmar och filer Sven Gestegård Robertz Datavetenskap, LTH 2017

Innehåll 1 Containers Sekvenser Iteratorer Avbildningar och mängder 2 Strömmar och filer Ström-klasser Filer 4. Standard-containers. Strömmar och filer 2/1

Läsanvisningar Referenser till relaterade avsnitt i Lippman Sekvenser 3.3, 9.1, 9.2, 9.3.1 9.3.3 Iteratorer 3.4, 9.2.1 Associativa containers 11.1 11.3.2 Strömmar och filer Kapitel 8 Formatterad I/O 17.5.1 Oformatterad I/O 17.5.2 4. Standard-containers. Strömmar och filer 3/34

Containerklasser Klassificering Sekvenser (homogena) vector<t> deque<t> list<t> Associativa containers (finns även unordered) map<k,v>, multimap<k,v> set<t>, multiset<t> Heterogena sekvenser (inte containers ) tuple<t1, T2,...> pair<t1,t2> Containers 4. Standard-containers. Strömmar och filer 4/34

Klasserna vector och deque Operationer i klassen vector v. clear (), v. size (), v. empty () v. push_back (), v. pop_back () v. front (), v. back (), v.at(i), v[i] v. assign (), v. insert (), v. emplace () v. resize (), v. reserve () Ytterligare operationer i klassen deque d. push_front (), d. pop_front () Containers : Sekvenser 4. Standard-containers. Strömmar och filer 5/34

Klasserna vector och deque Konstruktorer och funktionen assign Konstruktor och assign finns i tre varianter: fill: n stycken element med samma värde initializer list void assign ( size_type n, const value_type & val ); void assign ( initializer_list < value_type > il ); range: kopierar objekten i intervallet [first, last) (d v s från first till last, exkl last ) template <class InputIterator > void assign ( InputIterator first, InputIterator last ); Containers : Sekvenser 4. Standard-containers. Strömmar och filer 6/34

Klasserna vector och deque Medlemsfunktionen assign, exempel vector <int > v; int a[]{0,1,2,3,4,5,6,7,8,9}; v. assign (3,1); print_seq (v); v. assign ({11,13,15,17}); print_seq (v); length = 4: [11][13][15][17] v. assign (a, a+5 ); print_seq (v); std :: deque <int > d; d. assign (v. begin (), v. end () ); print_seq (d); length = 3: [1][1][1] length = 5: [0][1][2][3][4] length = 5: [0][1][2][3][4] Exempel på iteratorer Containers : Sekvenser 4. Standard-containers. Strömmar och filer 7/34

Klasserna vector och deque Medlemsfunktioner push och pop push lägger till ett element, storleken ökar pop tar bort ett element, storleken minskar *_back opererar på slutet, finns i båda void push_back ( const value_type & val ); // copy void pop_back (); bara i deque: *_front void push_front ( const value_type & val ); // copy void pop_front (); Containers : Sekvenser 4. Standard-containers. Strömmar och filer 8/34

Iteratorer Iterator Pekarliknande variabel som används för att genomlöpa en struktur (datasamling) Exempel vector <double > v (4); vector <double >:: iterator it; for ( it=v. begin (); it!= v. end (); ++ it) *it = 0; for ( auto it=v. begin (); it!= v. end (); ++ it) // med auto (C ++11) *it = 0; for ( double &e : v) // Ekvivalent i C ++11 e = 0; Containers : Iteratorer 4. Standard-containers. Strömmar och filer 9/34

Iteratorer Funktioner som returnerar iteratorer och som finns i alla containerklasser + klassen string begin() end() rbegin() rend() ger en iterator som pekar på det första elementet ger en iterator som pekar på ett tänkt element efter det sista elementet ger en reverserad iterator som pekar på det sista elementet ger en reverserad iterator som pekar på ett tänkt element före det första elementet samt: cbegin () rcbegin () cend () rcend () Containers : Iteratorer 4. Standard-containers. Strömmar och filer 10/34

Iteratorer Operationer på en sekvens med iteratorer som parametrar (iteratorintervallet [i,j) betecknar intervallet från och med i till och med positionen före j) sekv<typ> s(i,j); konstruktor, s initeras med [i,j) s.assign(i,j); s = elementen i intervallet [i,j)... s.insert(p,e); sätter in värdet e i positionen (iterator) p s.insert(p,n,e); sätter in n stycken e i positionen p s.insert(p,i,j); sätter in elementen i [i,j) i pos. p s.erase(p); s.erase(p,p2); tar bort elementet i position p från s tar bort elementen i [p,p2)från s Containers : Iteratorer 4. Standard-containers. Strömmar och filer 11/34

Iteratorer Exempel: vector::assign, vector::insert och vector::erase int a[] {1,2,3,4}; vector <int > v; v. assign (a, a +4); print_seq (v); length = 4: [1][2][3][4] v. insert (v. begin ()+2, 3, 9); print_seq (v); length = 7: [1][2][9][9][9][3][4] v. erase (v. begin ()+5); print_seq (v); length = 6: [1][2][9][9][9][4] v. erase (v. begin (),v. begin ()+2); print_seq (v); length = 4: [9][9][9][4] Containers : Iteratorer 4. Standard-containers. Strömmar och filer 12/34

Avbildningar och mängder Associativa containers Tabeller med söknycklar t.ex. telefonlista med 2 kolumner (namn, telnr) där namnet utgör söknyckel Implementering i form av standardklasser map<nyckel,värde> multimap<nyckel,värde> set<nyckel> multiset<nyckel> Varje nyckel förekommer precis en gång En nyckel kan förekomma mer än en gång Varje nyckel förekommer precis en gång En nyckel kan förekomma mer än en gång set är i princip en map utan värden. Containers : Avbildningar och mängder 4. Standard-containers. Strömmar och filer 13/34

Avbildningar och mängder <set>: std::set void test_set () { std :: set <int > ints {1,3,7}; ints. insert (5); for ( auto x : ints ) { cout << x << " "; } cout << endl ; auto has_one = ints. find (1); } if( has_one!= ints. end ()){ cout << " one is in the set \n"; } else { cout << " one is not in the set \n"; } 1 3 5 7 one is in the set Eller if( ints. count (1)) Containers : Avbildningar och mängder 4. Standard-containers. Strömmar och filer 14/34

Avbildningar och mängder <map>: std::map map <string, int > msi ; msi. insert ( make_pair (" Kalle ", 1)); msi. emplace (" Lisa ", 2); msi [" Kim "]= 5; for ( auto & a: msi ) { cout << a. first << " : " << a. second << endl ; } cout << " Lisa --> " << msi. at(" Lisa ") << endl ; cout << " Hasse --> " << msi [" Hasse "] << endl ; auto nisse = msi. find (" Nisse "); if( nisse!= msi. end ()) { cout << " Nisse : " << nisse -> second << endl ; } else { cout << " Nisse not found \n"; } Kalle : 1 Kim : 5 Lisa : 2 Lisa --> 2 Hasse --> 0 Nisse not found Containers : Avbildningar och mängder 4. Standard-containers. Strömmar och filer 15/34

Avbildningar och mängder En std::set är i princip en std::map utan värden Operationer på std::map insert, emplace, [], at, find, count, erase, clear, size, empty, lower_bound, upper_bound, equal_range Operationer på std::set insert, find, count, erase, clear, size, empty, lower_bound, upper_bound, equal_range Containers : Avbildningar och mängder 4. Standard-containers. Strömmar och filer 16/34

Strömmar och filer Innehåll Klassen ios Läsning av strömmar Utskrift av strömmar Koppling av filer till strömmar Direktaccess Strömmar och filer 4. Standard-containers. Strömmar och filer 17/34

Klassen ios Ström (stream) = Följd av tecken (bytes) Grundläggande klass för strömmar: ios Klassträd för strömmar ifstream istream ios iostream iostrm fstream ostream ofstream Strömmar och filer : Ström-klasser 4. Standard-containers. Strömmar och filer 18/34

Klassen ios Fördefinierade strömmar deklarerade i <iostream>: cin, cout, cerr, och clog Klasser deklarerade i inkluderingsfilen: <fstream>: ifstream, ofstream, fstream Strömmar och filer : Ström-klasser 4. Standard-containers. Strömmar och filer 19/34

Läsning av strömmar Strömmar från klassen istream eller från subklass till denna Oformaterad inmatning: Läser data från strömmen utan att konvertera till annat format Görs via medlemsfunktioner Formaterad inmatning: Data från strömmen görs om till annat format (enligt typen på variablen som ska tilldelas) Görs med operatorn >> Strömmar och filer : Ström-klasser 4. Standard-containers. Strömmar och filer 20/34

Formaterad inmatning Manipulatorer vid inmatning: setw(n) Max-antalet tecken i inläsningssträngen ws Hoppa fram till nästa icke-vita tecken skipws Hoppa över inl. vita tecken vid anv av >> noskipws Hoppa ej över inl. vita tecken vid anv av >> dec Tolka följande heltal som decimalt oct Tolka följande heltal som oktalt hex Tolka följande heltal som hexadecimalt boolalpha Indata för bool på formen false / true noboolalpha Indata för bool på formen 0 / 1 Strömmar och filer : Ström-klasser 4. Standard-containers. Strömmar och filer 21/34

Formaterad inmatning Formaterad inmatning med >> och manipulatorer # include <iomanip > int i, j, k; cout " Ange tre heltal : " cin >> oct >> i >> hex >> j >> k; cout << i << " " << j << " " << k << endl ; // In - och utmatning Ange tre heltal : 12 34 56 10 52 56 Strömmar och filer : Ström-klasser 4. Standard-containers. Strömmar och filer 22/34

Oformaterad inmatning Oformaterad inmatning med medlemsfunktioner int get() get(char& c) getline(char* s, n, t) get(char* s, n, t) read(char* s, n) gcount() ignore(n, t) peek() putback(c) unget() Läser in och returnerar nästa tecken Läser in tecken till c Läser n tecken till s med t som radseparator Som getline men sep. t läses ej Läser in n st tecken till s Anger antalet tecken vid senaste inläsn. Hoppar över max n st tecken eller till första t Returnerar nästa tecken (som förblir oläst) Lägger tillbaka c i strömmen Lägger tillbaka senast lästa tecken Strömmar och filer : Ström-klasser 4. Standard-containers. Strömmar och filer 23/34

Klassen ios Statusflaggor Flaggor definierade i ios, vilka beskriver en ströms tillstånd: failbit eofbit badbit Senaste operationen misslyckades Ett filslut påträffades vid senaste operationen Ett allvarligare fel av intern art har inträffat Strömmar och filer : Ström-klasser 4. Standard-containers. Strömmar och filer 24/34

Klassen ios Statusflaggor Medlemsfunktioner i klassen ios: void clear(); bool good(); bool fail(); bool eof(); bool bad(); bool operator!(); Slår av alla tillståndsflaggorna Ger true om alla flaggor false Ger true om failbit el. badbit satt Ger true om eofbit är satt Ger true om badbit är satt Ger resultatet fail() cast av en stream s till bool ger!s.fail() Strömmar och filer : Ström-klasser 4. Standard-containers. Strömmar och filer 25/34

Klassen ios Inläsning tecken för tecken OBS! istream::eof() sätts när man har försökt läsa EOF. När eof sätts tilldelar inte get(char& c) ut-parametern c men int get() returnerar EOF (== -1) Strömmar och filer : Ström-klasser 4. Standard-containers. Strömmar och filer 26/34

Utskrift till strömmar Formaterad utmatning med << cout << uppercase << " hej svejs " << endl ; ger utskriften hej svejs cout << scientific << 123456789.0 << endl ; cout << uppercase << scientific << 123456789.0 << endl ; ger utskriften 1.234568 e+08 1.234568 E+08 Strömmar och filer : Ström-klasser 4. Standard-containers. Strömmar och filer 27/34

Utskrift till strömmar Manipulatorer vid utmatning: setw(n) setfill(c) setprecision(n) boolalpha endl flush setbase(n) hex oct dec uppercase fixed scientific Sätter minimalt antal positioner Anger tecken för utfyllnad (padding) Sätter antalet decimaler (om fixed) eller antalet sign. siffror (om scientific) bool på formen false / true Lägger in radslut i strömmen Tömmer utskriftsbufferten setbase(16), setbase(8) osv Utskrift som hexadecimalt tal Utskrift som oktalt tal Utskrift som decimalt tal Ger stort E vid flyttalsutskrift Utskrift med fixnotation Utskrift med flytnotation Strömmar och filer : Ström-klasser 4. Standard-containers. Strömmar och filer 28/34

Utskrift till strömmar Oformaterad utmatning med medlemsfunktioner put(char c) write(const char* s, streamsize n) flush() Skriv ut tecknet c till strömmen Skriv ut n tecken från s Töm utskriftsbufferten Strömmar och filer : Ström-klasser 4. Standard-containers. Strömmar och filer 29/34

Koppling av filer till strömmar Öppnande av fil för läsning ifstream infil (" infilen. txt "); // Alt. ifstream infil ; infil. open (" infilen. txt "); Öppnande av fil för skrivning ofstream utfil (" utfilen. txt "); // Alt. ofstream utfil ; utfil. open (" utfilen. txt "); Strömmar och filer : Filer 4. Standard-containers. Strömmar och filer 30/34

Koppling av filer till strömmar Stängning av fil infil. close (); utfil. close (); Ofta behövs inte close användas eftersom destruktorerna för ifstream och ofstream automatiskt anropas då den associerade strömmen destrueras Strömmar och filer : Filer 4. Standard-containers. Strömmar och filer 31/34

Koppling av filer till strömmar Kopiering av fil # include <iostream > # include <fstream > using namespace std ; main ( int argc, char * argv []) { if ( argc!= 3) { cout << " Syntax : " << argv [0] << " from_file to_file " << endl ; } char c; ifstream f1( argv [1], ios :: binary ); // Bin ä rfil ofstream f2( argv [2], ios :: binary ); } while (f1.get (c )){ f2.put (c); } Strömmar och filer : Filer 4. Standard-containers. Strömmar och filer 32/34

Koppling av filer till strömmar Filflaggor i klassen ios in out app trunc ate binary Filen skall existera och vara läsbar. Om filen existerar skall den skrivas över. Om filen inte finns skall en ny skrivbar fil skapas. Om filen existerar skall skrivning läggas till i slutet. Om filen inte finns skall en ny skrivbar fil skapas. Om filen redan finns skall den skrivas över Efter öppning flyttas filpekaren till slutet av filen Filen skall hanteras som en binärfil Kombination av flaggor med operator (bitvis eller) ofstream filen (" fil. dat ",ios :: trunc ios :: binary ); Strömmar och filer : Filer 4. Standard-containers. Strömmar och filer 33/34

<stringstream> : strängar som strömmar std :: stringstream ss; ss << " Hello, string!\ n"; std :: cout << ss.str (); ss. str (" Brave new string "); while (ss) { std :: string s; ss >> s; std :: cout << s << std :: endl ; } Hello, string! Brave new string Hämta/ändra innehållet i strängen med string stringstream::str() const; void stringstream::str (const string& s); Tips: Använd stringstream för att enkelt experimentera med strömmar, eller skriva tester utan konsoll-i/o. Strömmar och filer : Filer 4. Standard-containers. Strömmar och filer 34/34