TDDB28 OH Föreläsning: C++ 1

Relevanta dokument
TDDC76 PoD OH Föreläsning C++ 1 C++

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

TDIU01 - Programmering i C++, grundkurs

TDIU01 - Programmering i C++, grundkurs

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

C++ - En introduktion

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Introduktionslaboration

TDDC76 - Programmering och Datastrukturer

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

Introduktionslaboration

TDIU01 - Programmering i C++, grundkurs

C++ - En introduktion

TDDC76 - Programmering och Datastrukturer

TDIU01 - Programmering i C++, grundkurs

TDIU01 - Programmering i C++, grundkurs

TDDC76 - Programmering och Datastrukturer

TDP004. Minne och pekare. Eric Elfving Institutionen för datavetenskap

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

1 Funktioner och procedurell abstraktion

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

Enkla datatyper minne

TDIU01 Programmering i C++

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Klassdeklaration. Metoddeklaration. Parameteröverföring

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

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

Operatoröverlagring. endast operatorsymboler definierade i C++ kan överlagras = += -= *= /= %= ^= &= = <<= >>= < > <= >= ==!= && > ->*, [ ] ( )

Minnestilldelning (allokering) och frigörande (avallokering) av minne

2D1387, Programsystemkonstruktion med C++ Johnny Bigert, Kursens hemsida:

Objektorienterad programmering Föreläsning 4

C++-programmets beståndsdelar

Byggstenar. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Grundläggande datatyper

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

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

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Data, typ, selektion, iteration

Översikt Introduktion DST 1. Nicholas Wickström. IDE, Högskolan i Halmstad. N. Wickström

Programmering A. Johan Eliasson

Innehåll. EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Viktiga skillnader mot Java

Repetition C-programmering

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

Föreläsning 3: Typomvandling, villkor och val, samt textsträngar

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

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

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

En villkorssats är den konstruktion som finns i C++ för att göra en selektion av två alternativa sekvenser. Formen för if satsen är

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Introduktion C-programmering

SMD 134 Objektorienterad programmering

F4. programmeringsteknik och Matlab

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Det finns många flaggor till g++,

Grunderna i C++ T A. Skapad av Matz Johansson BergströmLIMY

Imperativ programmering. Föreläsning 2

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

Variabler och konstanter

Del3 Klassanvändning, operatorer och pekare Ämnesområden denna föreläsning:

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

Programmering i C. Vad är C? Målsättning. Litteratur. Jämförelse med Java. Exempel : Ett program som skriver ut texten Hello, world

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

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

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

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

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

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

6.1 Kompilering och lite grundläggande information

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

1 Datorn som miniräknare. 1.1 Räkneoperationer. 1.2 Variabler

Objektorienterad Programmering (TDDC77)

Objektorienterad Programmering (TDDC77)

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

Språket Python - Del 1 Grundkurs i programmering med Python

Tommy Färnqvist, IDA, Linköpings universitet

Hantering av textsträngar och talsträngar. William Sandqvist

Lathund. C för inbyggda system

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Programmering i C++ EDA623 Objektorienterad programutveckling. EDA623 (Föreläsning 5) HT / 33

TDIU01 - Programmering i C++, grundkurs

C++ Lektion Tecken och teckenfält

C konstruerades i början på sjuttiotalet av Dennis Ritchie vid Bell Laboratories.

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

E02 "The Review" Föreläsning 2, HT2013 Grunderna, repetition. Johan Leitet. Kurs: 1dv403 Webbteknik I

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

Programmeringsteknik med C och Matlab

float Mindre rella tal ( floating point number ) double Rella tal/flyttal ( double precision floating point number )

Skizz till en enkel databas

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Parameteröverföring. Exempel. Exempel. Metodkropp

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

Kapitel 5. Strömmar. Utmatning

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

PROGRAMMERING 2 GRUNDLÄGGANDE SEMANTIK 4

C++ Slumptalsfunktioner + switch-satsen

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

TDIU01 - Datortenta (DAT2)

Funktionens deklaration

Innehåll. Pekare Syntax

OOP Objekt-orienterad programmering

grundläggande C++, funktioner m.m.

Transkript:

TDDB28 OH Föreläsning: C++ 1 C++ Ursprungligen baserat på C med inspiration från Simula 67 och Algol 68. Stora tillägg till C (ett litet, uttrycksorienterat, imperativt språk för systemprogrammering) klasser och dessas OO-relaterade aspekter (class) undantag hantering av exceptionella händelser (exception) mallar generella kodmallar för funktioner och klasser (template) namnrymder ett modulbegrepp (namespace) något striktare datatypning överlagring av funktionsnamn (overloading) strömbiblioteket för in- och utmatning övriga standardbiblioteket: string, vector, stack,... Kompilator med preprocessor. Standard 1997. TDDB28 OH Föreläsning: C++ 2 Ett första programexempel // Det klassiska C-programmet i C++-tappning #include <iostream> using namespace std; // inkluderingsdirektiv // öppna standardnamnrymden cout << "Hello, world" << endl; return 0; Översättningsmodell: källkod -> preprocessor -> kompilator -> länkare -> körbart program TDDB28 OH Föreläsning: C++ 3 Enkel in- och utmatning strömbiblioteket #include <iostream> #include <iomanip> using namespace std; int i; cout << "Skriv ett heltal < 1000: "; cin >> i; cout << "Det var " << setw(3) << i << endl; Strömbiblioteket kan hantera in- och utmatning av alla grundläggande datatyper. Standardfiler cin, cout, cerr och clog Funktioner för in- och utmatning, speciellt operatorerna >> och << (formaterande) Erbjuder olika möjligheter att formatera utskrifter manipulatorer

TDDB28 OH Föreläsning: C++ 4 Programstruktur Ett enkelt C++-program består av en eller flera funktioner. int max(int x, int y) return (x > y? x : y); int i, j; cout << "Skriv två heltal: "; cin >> i >> j; int m = max(i, j); cout << m << " var störst."; return 0; Flat struktur funktioner kan ej nästlas. Program kan delas upp på flera filer, typiskt inkluderingsfiler ( header files ) med datatypdefinitioner och funktionsdeklarationer (*.h) tillhörande implementeringfiler (*.cc, *.cpp, m.fl.) Om man använder klasser kan man göra en objektorienterad programstruktur, genom att skapa klassobjekt som samarbetar genom att anropa varandras medlemsfunktioner. TDDB28 OH Föreläsning: C++ 5 Uppdelning på filer file as module // Fil: max.h #ifndef MAX_H #define MAX_H int max(int, int); #endif // Fil: max.cc #include "max.h" int max(int x, int y) return (x > y? x : y); // Fil: test.cc #include <iostream> #include "max.h" using namespace std; int m = max(i, j); Ha alltid en inkluderingsgard i inkluderingsfiler. TDDB28 OH Föreläsning: C++ 6 Datatyper i C++ Dataobjekt variabler och konstanter används för att hantera värden. De deklareras med namn och en specifik datatyp: char c; // teckenvariabel c int i = 1; // heltalsvariabel i som initieras till 1 const double PI = 3.1415; // flyttalskonstant PI Två huvudkategorier av datatyper: Grundläggande datatyper ( fundamental types ) Sammansatta datatyper ( compound types )

TDDB28 OH Föreläsning: C++ 7 Variabel- och konstantdeklarationer const double PI = 3.1415; // konstant på filnivå void print_area(double r) // funktionsparameter const char text[] = "Arean = "; // lokal konstant cout << text << PI * r * r << endl; double radius; // lokal variabel cout << "Ge en cirkelradie: "; cin >> radius; print_area(radius); // parameteröverföring TDDB28 OH Föreläsning: C++ 8 Översikt grundläggande typer fundamental types arithmetic types void char integral types wchar_t enum integer types bool floating point types float double long double signed integer types signed char short int int long int unsigned integer types unsigned char unsigned short int unsigned int unsigned long int TDDB28 OH Föreläsning: C++ 9 Datatypning Typlikhet och typomvandling är viktiga aspekter i ett språk. De grundläggande datatyperna i C++ är distinkta typer. De flesta namngivna, sammansatta datatyper inkl. klasser är distinkta typer. Uttryck av en given typ kommer att automatiskt kunna omvandlas i många sammanhang: conversions kan leda till problem promotions säkra Uttrycklig typomvandling kan göras fritt (och på egen risk) static_cast<till-typ>(x) reinterpret_cast<till-typ>(x) dynamic_cast<till-typ>(x) mellan relaterade typer (t.ex. olika pekartyper) mellan ej relaterade typer (t.ex. heltal till pekare) inom en klasshierarki (t.ex. från basklass till subklass) const_cast<till-typ>(x) tar bort const (!)

TDDB28 OH Föreläsning: C++ 10 Uttryck och operatorer Möjligheterna att komponera uttryck är omfattande. Några enkla exempel x = 3.25 tilldelningsuttryck 2 * pi * r multiplikation, sammansatt uttryck -pi negation line[21] indexeringsuttryck name.length medlemsval sin(pi) funktionsanrop x < y relationsuttryck ::x räckviddsbestämning static_cast<int>(x) typomvandling TDDB28 OH Föreläsning: C++ 11 Sammansatta uttryck prioritet beräkningsordning Då sammansatta uttryck beräknas inverkar flera regler i språket. Alla operatorer är inordnade i en hierarki med 17-19 prioritetsnivåer En operator med högre prioritet har företräde jämfört med en operator med lägre prioritet a + b * c beräknas: a + (b * c) Då operatorerna i ett sammansatt uttryck har samma prioritet gäller den aktuella nivåns beräkningsriktning, associativitet (vänster->höger eller höger->vänster) a + b - c beräknas: (a + b) - c Parenteser kan införas för att ange en annan beräkningsordning. (a + b) * c Beräkningsordningen för operander är i de flesta fall ospecificerad, liksom beräkningsordningen för funktionsargument! TDDB28 OH Föreläsning: C++ 12 Satser Det finns ett flertal olika slags satser: deklarationssatser uttryckssatser sammansatt sats, blocksats selektionssatser repetitionssatser hoppsatser // sammansatt sats const double PI = 3.1415; // deklarationssatser int i, j = 0; i = j + 1; j++;... // uttryckssats

TDDB28 OH Föreläsning: C++ 13 Selektion, repetition och hopp Selektion (val) representeras av två satser if switch För repetition (iteration) finns tre satser for while do-while Hopp finns i fyra former goto return break continue Det finns ytterligare några former av satser. TDDB28 OH Föreläsning: C++ 14 If-satsen Villkorsstyrt val av alternativa programavsnitt. int x, y; cout << "Ge två heltal: "; cin >> x >> y; cout << "Största värdet var "; if (x > y) cout << x << endl; else cout << y << endl; Styrvillkoret mellan parenteserna beräknas först, true eller false. Om värdet är sant utförs satsen mellan if och else if-grenen. Om värde är falskt utförs satsen efter else, else-grenen. else-delen är valfri (används vid behov). TDDB28 OH Föreläsning: C++ 15 Blocksats om fler än en sats ska finnas där en sats kan förekomma if (top > 0) top = top - 1; return stack[top]; else cerr << "Stacken är tom" << endl; exit(1); Detta behov av blocksatsen gäller samtliga styrsatser!

TDDB28 OH Föreläsning: C++ 16 Switch-satsen Ett mångförgrenat val styrt av ett heltalsuttryck. char c; cout << "Välj j = JA, n = NEJ: "; cin >> c; switch (c) case j : case J : cout << "Du har valt JA"; break; case n : case N : cout << "Du har valt NEJ"; break; default: cout << "Fel val!"; break; Styruttrycket beräknas. Om det finns en case med samma värde fortsätter exekveringen efter denna case. Om ingen case passar utförs default. break avbryter exekveringen av switch, liksom om exekveringen når avslutande. Varning för fall-through! TDDB28 OH Föreläsning: C++ 17 While-satsen While-satsen är en förtestad, villkorsstyrd slinga int i = 0; int sum = 0; while (sum < MAX / 2) i = i + 1; sum = sum + i; cout << "summa = " << sum << ", i = " << i << endl; Styrvillkoret beräknas först. Om styruttrycket är sant utförs satsen/satsblocket, varefter styruttrycket åter beräknas. while-satsen avbryts då styruttrycket blir falskt. TDDB28 OH Föreläsning: C++ 18 Do-satsen Do-satsen (eller do-while) är en eftertestad, villkorsstyrd slinga. int x; do cout << "Skriv ett heltal: "; cin >> x; cout << "Du skrev " << x << endl; while (x > 0); Satsen/satsblocket mellan do och while utförs. Styruttrycket mellan parenteserna efter while beräknas. Om styruttrycket är falskt avbryts do-satsen och satsen efter utförs. Om styruttrycket är sant, upprepas från första punkten ovan.

TDDB28 OH Föreläsning: C++ 19 For-satsen For-satsen är en förtestad, villkorsstyrd slinga. int sum = 0; for (int i = 1; i <= 10; i++) sum = sum + i; cout << "Summan av 1, 2, 10 är " << sum << endl; Initieringssatsen beräknas variabeln i deklareras och nollställs. Avbrottsvillkoret beräknas om falskt avslutas for-satsen. Satsen/satserna som hör till for-satsen utförs. Sista uttrycket i for-satsens styrdel utförs i räknas upp med 1 varefter avbrottsvillkoret åter beräknas (andra punkten ovan). TDDB28 OH Föreläsning: C++ 20 Hoppsatser Det finns fyra former av hoppsatser i C++: goto innebär hopp till ett namngivet läge i programmet. return returnerar från funktion. enbart return för funktioner som returnerar void. return uttryck för funktioner som ska returnera ett objekt. break avbryter for, while och do-while, samt switch. continue medför att exekveringen av satsdelen i en for, while eller do-while avbryts men inte själva slingan nästa steg i repetitionen påbörjas. För att avbryta programkörning finns standardfunktionen void exit(int) från cstdlib. TDDB28 OH Föreläsning: C++ 21 Exempel på break och continue for (int i = 0; i < n; i++) if ( hoppa över resten av satserna men fortsätt med nästa steg hoppa till styruttrycket) continue; if ( avsluta for-satsen helt ) break; // Hit kommer man vid continue // Hit kommer man vid break

TDDB28 OH Föreläsning: C++ 22 Funktionsdefinition och funktionsdeklaration En funktionsdefinition: double mean(double x, double y) return ((x + y) / 2); Funktionsdeklarationer, prototyper: double mean(double x, double y); double mean(double, double); extern double mean(double, double); TDDB28 OH Föreläsning: C++ 23 Parameteröverföring Värdekopiering call by value int max(int x, int y) return (x > y? x : y); Referensöverföring call by reference void swap(int& x, int& y) const int old_x = x; x = y; y = old_x; (Även vanliga variabler kan vara av referenstyp) TDDB28 OH Föreläsning: C++ 24 Förvalda argument för funktionsparametrar Används om inget motsvarande argument ges i ett anrop. int increment(int value, int amount = 1) return value + amount; Anrop: cout << increment(5, 2) << endl; // 7 cout << increment(7) << endl; // 8

TDDB28 OH Föreläsning: C++ 25 Överlagring av funktionsnamn Flera funktioner kan ges samma namn. void print(int value); void print(double value); void print(const char* string); Kompilatorn väljer den som passar ett anrop bäst. TDDB28 OH Föreläsning: C++ 26 Sammansatta datatyper Sammansatta datatyper kan konstrueras på följande sätt (inte helt fullständigt). Fält ( array ) är indexerade datatyper bestående av objekt av samma typ. Funktioner har parametrar av olika typer och returnerar void (inget) eller ett objekt av en viss typ. Pekare till void (generell pekare) eller till objekt eller funktion av en viss typ. Referens till objekt eller funktion av en viss typ. Klass (class och struct) som består av objekt av olika typ, även funktioner. Union (union, speciell slags klasser). Uppräkningar (enum) Pekare till icke-statiska medlemmar. Dessa kan kombineras rekursivt för att konstruera komplexa datatyper och datastrukturer. TDDB28 OH Föreläsning: C++ 27 Uppräkningstyper enum En uppräkning har en värdemängd bestående av namngivna heltalskonstanter. enum Direction left, right, up, down ; För en uppräkning gäller att den är en distinkt typ, skild från alla andra typer. att dess namn kan användas som ett datatypsnamn. att den har en underliggande typ som är en heltalstyp. värdena i en uppräkning representeras standardmässigt med 0, 1, 2, kan också uttryckligen deklareras att representeras med andra värden.

TDDB28 OH Föreläsning: C++ 28 Uppräkning med explicit angivna underliggande värden: enum Colour Red = 1, Yellow, Blue = 4, Green = Yellow + Blue ; Värdet för en litteral eller ett objekt av uppräkningstyp kan omvandlas till heltal: Colour col = Red; // Deklaration och initiering int i = Yellow; // Tillåtet; Yellow omvandlas till 2 Men det finns ingen automatiskt omvandling från heltal till uppräkningsvärde: col = 5; // Typfel! Uttrycklig typomvandling kan dock göras: col = static_cast<color>(21); col = Colour(21); col = (Colour) 21; // senaste skriket // funktionsform // "cast" TDDB28 OH Föreläsning: C++ 29 Fältstrukturer [] Fält är sammansatta av element av samma datatyp. int vector[4] = 1, 2, 3, 4; // Initiering med aggregat double matrix[3][4]; // Tvådimensionellt fält matrix[2][3] = vector[1]; // Indexering av element I deklarationen anges storleken på fältet, ej intervall. Fältelement indexeras alltid från 0 och uppåt (int). Alla slags fält kan initieras med ett fältaggregat. har alltid statiska komponenter. behöver ej vara uttömmande avseende alla element. Använd gärna i stället vector: minnet ökas/minskas alltefter behovet högre abstraktionsnivå (djup tilldelning med = fungerar t.ex.) TDDB28 OH Föreläsning: C++ 30 Pekare * Pekarobjekt kan innehålla minnesadresser till andra objekt. int i = 4711; // Heltalsvariabel int* p = &i; // Pekare till heltal adressoperatorn Användning: cout << i << endl; // 4711 cout << p << " -> " << *p; // 0xeffff828 -> 4711 Med adressoperatorn & kan man bl.a. få adressen till en variabel, ett element i ett fält, en komponent i en post,... Avrefereringsoperatorn * är dess invers, avrefererar en pekare ger det objekt, den minnescell, som en pekare anger.

TDDB28 OH Föreläsning: C++ 31 Referens & int i = 4711; int& ir = i1; // Referens till heltal implicit adressberäkning En referens måste alltid bindas då den definieras kan sedan inte ändras. Möjlig användning (kanske inte så realistiskt): ir = 11147; cout << ir << "==" << i << endl; // I princip tilldelning av i // Implicit avreferering En form av alias. Främsta användning är som typ för funktionsparameter och funktionsreturvärde. TDDB28 OH Föreläsning: C++ 32 Poststrukturer struct Den grundläggande användningen av struct är att definiera posttyper. struct Person char name[20]; int age; ; Person p = "Per Post", 21 ; // Initiering med postaggregat Punktoperatorn används för att referera till komponenter: p.age = p.age + 1; cout << p.name << " är " << p.age << " år."; // Grattis på födelsedagen! Två användbara sammansatta datatyper med struct är fält och struct samt struct och pekare. TDDB28 OH Föreläsning: C++ 33 Länkade datastrukturer länkad lista: struct + pekare struct Person string name; int age; Person* next; ; Dynamisk minnestilldelning görs med operatorn new: Person* pp = new Person; Operatorn -> används för åtkomst av medlemmar: pp->name = "Per Post"; pp->age = 21; pp->next = 0; // (*pp).age // Tompekare (använd inte NULL) Minne återlämnas med operatorn delete: delete pp; // Pekaren pp oförändrad dock!

TDDB28 OH Föreläsning: C++ 34 typedef Ett sätt att definiera typnamn. struct Person string unsigned int Person* ; name; age; next; typedef Person* List; // För att slippa asterisken List head = 0; // Deklaration av personlista Det enkla namnet List har klara fördelar framför det sammansatta Person*. TDDB28 OH Föreläsning: C++ 35 Sätta in sist i lista void append(const string& name, int age, List& l) Person* pp = new Person; pp->name = name; pp->age = age; pp->next = 0; if (l == 0) // tom lista l = pp; return; // Det finns minst en nod, finn den sista noden i listan Person* p = l; while (p->next!= 0) p = p->next; p->next = pp; TDDB28 OH Föreläsning: C++ 36 Strömbiblioteket Ett klassbaserat bibliotek för att läsa och skriva strömmar. Strömtyper (klasser) inströmmar istream, ifstream utströmmar ostream, ofstream in- och utströmmar iostream, fstream strängströmmar istringstream, ostringstream datatyper för att deklarera strömvariabler som kan kopplas till filer för att läsa/skriva sådana Operationer för att öppna och stänga strömmar att läsa och skriva strömmar (text, binärt) att testa strömmars tillstånd (filslut, feltillstånd) manipulera textströmmar (in- och utmatningsformat, sätta in radslut, strängslut, etc.)

TDDB28 OH Föreläsning: C++ 37 Användning av strömbiblioteket Det finns flera inkluderingar som hör till strömbiblioteket, t.ex. #include <iostream> strömklasserna istream, ostream och iostream de fördefinierade standardströmmarna cin, cout, cerr och clog oparametriserade manipulatorer, t.ex. endl, noskipws, oct #include <fstream> strömklasserna ifstream, ofstream och fstream för att hantera filer som strömmar fstream inkluderer i sin tur iostream #include <sstream> strängströmsklasserna istringstream och ostringstream #include <iomanip> parametriserade manipulatorer, t.ex. setw(10), setprecision(2) TDDB28 OH Föreläsning: C++ 38 Skriv- och läsoperatorerna << och >> Kan användas på standardströmmarna, filströmmar och strängströmmar för formaterad in- och utmatning. cout << x; Kan användas för att skriva grundläggande datatyper och strängar på utströmmar. Omvandling från intern representation till textrepresentation. cin >> x; Kan användas för att läsa grundläggande datatyper och strängar från inströmmar. Läsning sker på fritt format inledande vita tecken ignoreras. Omvandling från text till interna representation. TDDB28 OH Föreläsning: C++ 39 Funktioner för att läsa och skriva tecken char c; is.get(c); läs nästa tecken (ingen förbiläsning av blanka) från inströmmen is till variabeln c is.putback(c); lägg tillbaka tecknet i variabeln c i inströmmen is c = is.peek(); hämta nästa tecken i inströmmen is utan att ta ut det is.ignore(255, \n ) läs förbi maximalt 255 tecken i inströmmen is eller till radslut om det inträffar dessförinnan os.put( A ); skriv tecknet A i utströmmen os

TDDB28 OH Föreläsning: C++ 40 Funktioner för att läsa och skriva strängar string s; getline(cin, s); C-strängar char buf[80]; is.read(buf, 80); läs 80 tecken från is och lagra i buf os.write(buf, 20); skriv de 20 första tecknen i buf på os is.getline(buf, 80); läs is till radslut, eller max 80 tecken (eventuella inledande vita tecken läses normalt förbi) is.getline(buf, 80, ); läs is till mellanrumstecken, dock max 80 tecken TDDB28 OH Föreläsning: C++ 41 Formatering Används för att ange önskat dataformat vid utskrifter. Några exempel: os.width(n); sätter fältvidden för nästa, men endast nästa, utskrift på utströmmen os till n teckens bredd os.fill(c); sätter utfyllnadstecknet till c för os (mellanrumstecken är standard) os.precision(p); sätter önskad precision (antalet decimaler för flyttal) till p för strömmen os För var och en av dessa finns en motsvarande parametriserad manipulator. TDDB28 OH Föreläsning: C++ 42 Manipulatorer Det finns två kategorier av manipulatorer. Utan parametriserade direkt tillgängliga genom inkludering av iostream Exempel: ws endl ends flush oct dec hex Parametriserade kräver att även iomanip inkluderas Exempel: setbase(b) setw(n) setfill(c) setprecision(p) Används med läs- och skrivsoperatorerna, t.ex.: cout << setw(4) << x << endl; Vissa manipulatorers effekt gäller endast för nästa strömoperation.

TDDB28 OH Föreläsning: C++ 43 Statusinformation för strömmar Operationer för att detektera feltillstånd och andra tillstånd hos strömmar.! s returnerar sant om strömmen s är i feltillstånd if (! cin) cerr << "Fel i cin" << endl; exit(1); s.eof() s.fail() s.bad() s.good() s.clear() sant om filslut inträffat för strömmen s sant om ett mindre allvarligt fel inträffat för strömmen s sant om ett allvarligt fel inträffat för strömmen s sant om inga fel inträffat för strömmen s återställer strömmen s till normaltillstånd (gör ej detta vid allvarliga fel) TDDB28 OH Föreläsning: C++ 44 Filströmmar Används för att läsa och skriva filer på sekundärminne. Filobjekt av typen ifstream kan enbart läsas Filobjekt av typen ofstream kan enbart skrivas Filobjekt av typen fstream kan både läsas och skrivas Operationer öppna filström stänga filström positionering i filström (tar vi inte upp nu) allmäna strömoperationer enligt tidigare, t.ex. insättnings- och uttagsoperatorerna. Det finns en del deklarationer som rör bl.a. filströmmar i inkluderingen <stream> TDDB28 OH Föreläsning: C++ 45 Öppna och stänga filströmmar Två möjligheter att öppna en fil. Öppna filen direkt i samband med att ett filströmobjekt deklareras. ifstream input("data.txt"); if (! input.good()) input.close(); cerr << "filen DATA.TXT kunde inte öppnas" << endl; exit(1); Deklarera först filströmmen och öppna sedan filen med operationen open() ifstream input; input.open("data.txt"); En filström stängs med operationen close() input.close();