TDIU01 - Programmering i C++, grundkurs

Relevanta dokument
TDIU01 - Programmering i C++, grundkurs

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

C++ - En introduktion

TDIU01 - Programmering i C++, grundkurs

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

TDIU01 - Programmering i C++, grundkurs

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

TDDC76 - Programmering och Datastrukturer

TDDC76 - Programmering och Datastrukturer

TDIU01 - Datortenta (DAT2)

TDDC76 - Programmering och Datastrukturer

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

TDIU01 - Programmering i C++, grundkurs

TDIU01 - Programmering i C++, grundkurs

C++ - En introduktion

Introduktionslaboration

Kapitel 5. Strömmar. Utmatning

Introduktionslaboration

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

4. Standard-containers. Strömmar och filer

TDIU01 Programmering i C++

Programmeringsteknik med C och Matlab

TDIU01 - Datortenta (DAT2)

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

Strömmar och strängar

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

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

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

C++ Lektion Filhantering

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

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

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

Enkla datatyper minne

Föreläsning 3: Vector och struct

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

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

C++ Objektorientering - Klasser. Eric Elfving

En ström är en klass som representerar en bytesekvens med data. I C++ finns flera typer av strömmar, men de går alla al använda på samma säl.

C++ Objektorientering - Klasser. Eric Elfving Institutionen för datavetenskap

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

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

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

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

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

Uttryck, satser och strömhantering

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

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

Objektorienterad Programmering (TDDC77)

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

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

6 In- och utmatning, strömmar

Pekare och arrayer. Indexering och avreferering

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

Generell (template) programmering. Effektiv C++ Slutliga tips Genomgång av gammal tenta. Daniel Aarno Allt som fungerar som x ÄR x

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

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

TDDC76 - Programmering och Datastrukturer

Recap Mera om nya typer Kort Fält. Programmering. Sommarkurs Verónica Gaspes. IDE-sektionen.

Tentamen i. för D1 m fl, även distanskursen. fredag 13 januari 2012

Dagens föreläsning. Specialtecken. Mer om printf. Formateringssträngar. Mer om scanf. Programmeringsteknik för Ingenjörer VT05

Objektorienterad Programmering (TDDC77)

Lite mer om Javas stöd för fält. Programmering. Exempel: vad är det största talet? hh.se/db2004. Fält samt Input/Output

Strängar. Strängar (forts.)

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

Typkonvertering. Java versus C

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

Skizz till en enkel databas

Nedan skapar vi klassen Person innehållande datamedlemmar för förnamn, efternamn, ålder, längd och vikt:

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

Tentamen i. för D1 m fl, även distanskursen. lördag 19 januari 2013

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

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

Tentamen EDAF30 Programmering i C++

Tillämpad programmering

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

Innehåll. Pekare Syntax

TDDC76 - Programmering och Datastrukturer

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

Hej Då, Karel! Programmering. Vårt första Javaprogram. hh.se/db2004. Java. Grundtyper, variabler och arrayer

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

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

C-programmering, föreläsning 2 Jesper Wilhelmsson

Inledande programmering med C# (1DV402) 27+15=42 1 (22)

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

Tentamen i. för D1 m fl, även distanskursen. lördag 26 februari 2011

Intro till standardbiblioteket. Eric Elfving

1 Klasser och objektorientering Vad är objektorientering?

Lite om reella tal. Programmering. I java. Om operatorers associativitet och prioritet

Sammanfattning. Listor. List-manipulering. Matris. /home/lindahlm/activity-phd/teaching/11dd1310/exercise3/exercise3.py September 13, 20111

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

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Introduktion till algoritmer - L0 - Grunder i C++ Matematikgymnasiet, Läsåret L0 - Grunder i C++

Tillämpad programmering

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

Instuderingsfrågor, del D

Tentamen C++-programmering

Tentamen EDAF30 Programmering i C++

Grundläggande programmering med C# 7,5 högskolepoäng

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

Föreläsning 13. In- och utmatning

Transkript:

TDIU01 - Programmering i C++, grundkurs Strömmar, externa filer och kommandoradsargument Eric Elfving Institutionen för datavetenskap 7 oktober 2015

Översikt 2/32 Strömmar Kommandoradsargument Jämförelseoperatorer Creative Commons 40

Strömmar 3/32 En ström är en kanal där tecken kan skickas från en enhet till en annan Vi har redan använt två strömmar, standard inmatningsström (cin) där tecken skickas från tangentbordet till vårt program och standard utmatningsström (cout) där tecken skickas från vårt program till skrämen Båda dessa strömmar är buffrade, dvs operativsystemet mellanlagrar allt som skrivs till dessa strömmar i en intern buffer som tillhör vårt program Creative Commons 40

cin & cout 4/32 cin och cout är buffrade Creative Commons 40

cerr 5/32 Det finns en annan vanlig ström i C++ (och terminalen), cerr cerr, eller felströmmen är en obuffrad variant av cout Om man skriver felmeddelanden till cerr istället för cout garanteras utskriften Kodexempel 1 Creative Commons 40

cerr 6/32 Felmeddelanden kan även hanteras på ett speciellt sätt av terminalen Följande kommando skriver all vanlig utskrift till filen utdatalog och felmeddelanden till filen errorlog BASH: aout > utdatalog 2> errorlog Creative Commons 40

Felflaggor 7/32 Om något går fel vid inläsning eller utskrift sätts en felflagga för strömmen Följande felflaggor finns för alla strömmar: Felflagga Beskrivning Funktioner för att kontrollera status good() eof() fail() bad() goodbit Inget fel true false false false eofbit Filslut (ctrl-d) false true false false failbit Logiskt fel false false true false badbit Annat fel false false true true Med funktionen clear() kan man ta bort alla felflaggor Creative Commons 40

Filströmmar 8/32 En filström är en ström som kan kopplas till en extern textfil på hårddisken för att låta oss läsa eller skriva från denna fil istället för att kommunicera med användaren Det finns tre typer av filströmmar: fstream Du bestämmer hur filen ska hanteras ifstream Filen öppnas för läsning, du får en inläsningsström ofstream Filen öppnas för skrivning, du får en utmatningsström Creative Commons 40

Filströmmar 9/32 Filer kan öppnas på två sätt, vid initiering och med funktionen open: #include <fstream> // för att komma åt filströmmar #include <iostream> using namespace std; int main() ifstream in_file "indatatxt"; ofstream out_file; cout << "Vart ska resultatet hamna? Filnamn: "; string filename; cin >> filename; out_fileopen(filename); // copy contents of indatatxt to the given file: char c; while (in_fileget(c)) out_file << c; Creative Commons 40

Filströmmar 10/32 Filmoder En filmod beskriver hur filen ska öppnas, nedan visas de vanligaste: Filmod Betydelse ios::in Inläsning, börjar från början av filen ios::out Utskrift, innehåll trunkeras och start i början av filen ios::app Utskrift, skriver till slutet av filen Om man har en fstream måste man kombinera out och app för att skriva till slutet: "ios::out ios::app" Man väljer filmod när man öppnar filen: ofstream ofs"filnamn", ios::app; Creative Commons 40

Filströmmar 11/32 Precis som med pekare är det viktigt att återlämna de resurser vi använder För filer betyder det att vi bör stänga öppnade filer när vi är klara med dem Det görs med funktionen close Creative Commons 40

Filströmmar 12/32 int main() ifstream ifs "indatatxt"; if (!ifs) //kallar på ifsfail() cerr << "Couldn't open input file"; return 1; ofstream ofs "outputtxt"; if (!ofs) cerr << "Couldn't open output file!"; ifsclose(); return 2; // do some processing ifsclose(); ofsclose(); Creative Commons 40

Strängströmmar 13/32 En strängström liknar en filström men är kopplad till en sträng istället för en fil Används ofta för att konvertera mellan olika datatyper: #include <sstream> using namespace std; int string_to_int(const string & str) stringstream sst; sst << str; int d; sst >> d; return d; string to_string(int d) stringstream sst; sst << d; return sststr(); //Ta fram den bakomliggande strängen Creative Commons 40

Strängströmmar 14/32 Det finns tre varianter, stringstream, istringstream och ostringstream Med stringstream kan man både läsa och skriva istringstream går bara att läsa ifrån och ostringstream går bara att skriva till #include <sstream> using namespace std; int string_to_int(const string & str) istringstream iss str; //initiera med strängen str int d; iss >> d; return d; string int_to_string(int d) ostringstream oss; oss << d; return ossstr(); Creative Commons 40

Inläsningsströmmar 15/32 När vi läser från en inmatningsström tolkas tecknen som finns i strömmen enligt datatypen på variabeln där vi vill lagra resultatet av inläsningen Om något går fel vid den tolkningen sätts failbit Om något går fel vid inläsningen eller om något annat är fel sätts badbit Man kan använda namnet istream som ett samlingsnamn på alla inmatningsströmmar (cin, ifstream, istringstream) Creative Commons 40

Utmatningsströmmar 16/32 När vi skriver till en utmatningsström konverteras värdet på det vi skriver ut till en sekvens av tecken Man kan använda namnet ostream som ett samlingsnamn på alla utmatningsströmmar (cout, cerr, ofstream, ostringstream) Creative Commons 40

Exempel 17/32 struct Book string title; string author; int pages; ; void print(const Book & b) cout << bauthor << ": " << btitle << " (" << bpages << " pages)" << endl; int main() Book b "C++ direkt", "Skansholm", 657; print(b); Creative Commons 40

Exempel 18/32 struct Book string title; string author; int pages; ; void print(const Book & b) cout << bauthor << ": " << btitle << " (" << bpages << " pages)" << endl; int main() Book b "C++ direkt", "Skansholm", 657; print(b); Creative Commons 40

Exempel 19/32 void print(const Book & b) cout << bauthor << ": " << btitle << " (" << bpages << " pages)" << endl; void print(const Book & b, ofstream & f) f << bauthor << ": " << btitle << " (" << bpages << " pages)" << endl; int main() Book b "C++ direkt", "Skansholm", 657; ofstream output"filnamntxt"; print(b, output); Creative Commons 40

Exempel 20/32 void print(const Book & b) cout << bauthor << ": " << btitle << " (" << bpages << " pages)" << endl; void print(const Book & b, ofstream & f) f << bauthor << ": " << btitle << " (" << bpages << " pages)" << endl; int main() Book b "C++ direkt", "Skansholm", 657; ofstream output"filnamntxt"; print(b, output); Creative Commons 40

Exempel 21/32 void print(const Book & b) cout << bauthor << ": " << btitle << " (" << bpages << " pages)" << endl; void print(const Book & b, ostream & f) f << bauthor << ": " << btitle << " (" << bpages << " pages)" << endl; int main() Book b "C++ direkt", "Skansholm", 657; ofstream output"filnamntxt"; print(b, output); Creative Commons 40

Exempel 22/32 void print(const Book & b, ostream & f = std::cout) f << bauthor << ": " << btitle << " (" << bpages << " pages)" << endl; int main() Book b "C++ direkt", "Skansholm", 657; ofstream output"filnamntxt"; print(b,output); print(b); // prints to standard output Creative Commons 40

Kommandoradsargument 23/32 Terminalen har ett inbyggt sätt att skicka data till vårt program redan vid programstart kallat kommandoradsargument Man startar sitt program med dess namn följt av argumenten som ska skickas Vi har använt kommandoradsargument ganska mycket redan: g++ -o program filcc betyder ``starta programmet g++ och skicka argumenten -o, program och filcc Creative Commons 40

Kommandoradsargument 24/32 De flesta språk har mekanismer för att komma åt dessa argument C++ använder sig av mekanismer ärvda från C För att komma åt argumenten ändrar man sitt funktionshuvud för main till int main(int argc, char* argv[]) argc (argument count) kommer sättas till antal argument (inklusive programnamnet) argv (argument vector) blir ett fält av c-strängar innehåller argumenten Creative Commons 40

Fält 25/32 Ett fält är en sekvensiell datastruktur liknande vector men har en fast storlek som den inte känner till I grunden är det av en pekare till första elementet Med deklarationen int arr[4] får vi ett fält som kan lagra fyra heltal Namnet arr fungerar som en pekare till första elementet i fältet arr[i] tolkas som *(arr + i) (eller hoppa i heltal framåt i minnet från position arr) Creative Commons 40

c-strängar 26/32 En c-sträng är föregångaren till string och är i grunden ett fält av tecken Eftersom den inte känner till sin egen storlek avslutas fältet med tecknet '\0' (char0) av konvention Eftersom c-strängar i grunden är pekare fungerar INTE de vanliga jämförelseoperatorerna på dessa Man måste använda speciella funktioner istället (finns i <cstring>) Creative Commons 40

Kommandoradsargument 27/32 Antag att vi har följande program kompilerat till namnet print_args: int main(int argc, char* argv[]) for (int arg=1; arg <argc; ++arg) cout << "Argument #" << arg << ": " << argv[arg] << endl; Programkörning: zaza10$ print_args Över 100 studenter! Argument #1: Över Argument #2: 100 Argument #3: studenter! Creative Commons 40

Creative Commons 40 Kommandoradsargument 28/32 argv: 0 1 2 3 's' 't' 'u' 'd' 'e' 'n' 't' 'e' 'r' '!' '\0' '1' '0' '0' '\0' 'Ö' 'v' 'e' 'r' '\0' 'p' 'r' 'i' 'n' 't' '_' 'a' 'r' 'g' 's' '\0'

Jämförelseoperatorer 29/32 Vi kan skapa funktioner för att jämföra egna posttyper Antingen skapar vi en vanlig funktion eller så överlagrar vi en (binär) jämförelseoperator Vi kan överlagra alla inbyggda operatorer, dock inte skapa egna Får användas på labben, men inget krav Mer övning kommer i senare kurser Creative Commons 40

Jämförelseoperatorer 30/32 struct Book string title; string author; int pages; ; bool operator<(const Book & lhs, const Book & rhs) return lhsauthor < rhsauthor (lhsauthor == rhsauthor && lhstitle < rhstitle); Creative Commons 40

Jämförelseoperatorer 31/32 Följande uttryck: if ( b1 < b2 ) Byts ut mot detta anrop av kompilatorn: if ( operator<(b1,b2) ) Creative Commons 40

wwwliuse