C++ Lektion Filhantering



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

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

C++ Lektion Tecken och teckenfält

TDIU01 - Programmering i C++, grundkurs

Enkla datatyper minne

C++ Slumptalsfunktioner + switch-satsen

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

TDIU01 - Programmering i C++, grundkurs

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

Kapitel 5. Strömmar. Utmatning

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

Introduktionslaboration

C++ - En introduktion

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

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

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

4. Standard-containers. Strömmar och filer

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

TDIU01 - Programmering i C++, grundkurs

TDIU01 - Programmering i C++, grundkurs

Föreläsning 13. In- och utmatning

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

Det finns många flaggor till g++,

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Introduktionslaboration

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

Deklarera en struct som kan användas för att representera en rät linje

Föreläsning 7: Filer

Övning 4. Arv och andra relationer

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

En kort text om programmering i C.

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

Datorövningar. Grunderna i C/C++

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

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

6 In- och utmatning, strömmar

Ordlistor, filhantering och ut på webben. Linda Mannila

Skizz till en enkel databas

TDIU01 - Programmering i C++, grundkurs

Högskolan Dalarna sid 1 av 5 Data-avdelningen Hans-Edy Mårtensson

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011,

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

Programmering B med Visual C

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

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

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

JAVAUTVECKLING LEKTION 7

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Tentamen i Programmering C, Fri, Kväll,

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

Innehållsförteckning. Exempel. Åtkomst & användarhandledning

Att använda pekare i. C-kod

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

Strömmar och strängar

TDDC76 - Programmering och Datastrukturer

Alla filer som bearbetar PHP script ska avslutas med ändelsen.php, exempelvis ska en indexsida till en hemsida heta index.php

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

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

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

C++ - En introduktion

TDDC76 - Programmering och Datastrukturer

Filer och structer Del 2

OBS! All teori i detta och följande dokument kompletteras med genomgångar på lektionerna. Så det är viktigt att närvara och göra egna anteckningar.

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

Programmering för språkteknologer II, HT2011. Rum

OOP Objekt-orienterad programmering

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

Avancerade Webbteknologier

KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: 8-13, den 18 februari 2012

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

Planering Programmering grundkurs HI1024 HT data

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

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

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

Föreläsning 3. Programmering, C och programmeringsmiljö

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Strukturdiagram. Styra. Algoritmer. Val

#include <stdio.h> #include <string.h>

*Pekarvärden *Pekarvariabler & *

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy cards. Slingor

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

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

Tommy Färnqvist, IDA, Linköpings universitet

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

F4. programmeringsteknik och Matlab

Planering Programmering grundkurs HI1024 HT TIDAA

Grundkurs i programmering, 6 hp (725G61) Dugga 1 tillfälle 3

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

JAVAUTVECKLING LEKTION 8

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

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

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Tentamen ges för: Tentamensdatum: Tid:

Föreläsning 3: Booleans, if, switch

TDIU01 Programmering i C++

String [] argv. Dagens Agenda. Mer om arrayer. Mer om arrayer forts. String [] argv. argv är variabelnamnet. Arrayer och Strängar fortsättning

[] Arrayer = Indexerad variabel

Tentamen på kursen DA7351, Programmering , kl Malmö högskola Teknik och samhälle. DA7351, Programmering

Objektorienterad Programmering (TDDC77)

TDIU01 - Datortenta (DAT2)

Första databastillämpningen

Introduktion C-programmering

Transkript:

C++ Lektion Filhantering Teori Vi är bekanta med ett antal objekt för läsning och skrivning på bildskärmen, nämligen cout och cin. De hanterar automatiskt om vi ska läsa eller skriva en "följd av bytes" (i C++ begreppet "ström"). För att komma åt dessa objekt inkluderade vi filen iostream. När det gäller filer behöver vi tillgång till klasserna ifstream(infilestream) och ofstream(outfilestream). För att få det inkluderar vi filen fstream. När vi arbetar med filer gör vi i princip som när vi skriver och läser mot skärmen. Vi kan bara göra en sak, läsa eller skriva, mot en och samma fil. Det här gör att vi måste deklarera en variabel som antingen "läsa från"-fil eller "skriva till"-fil. Man deklarerar filen, öppnar filen, arbetar mot filen och slutligen stänger man filen. Läsning från fil Vi skiljer på formaterad och oformaterad läsning. Den förra innebär att vi vet vad och hur data (informationen) ligger lagrad på filen medan den senare vet vi inget om. Strategin är då att för den formaterade använder vi inläsningsoperatorn >> och för den oformaterade använder vi speciella funktioner som t.ex. get och getline. Skriva till fil På motsvarande sätt skiljer vi på formaterad och oformaterad skrivning. Mer om filer Vi kommer enbart att använda oss av textfiler i den här kursen. Det innebär att informationen ligger lagrad som bytes som innehåller ASCII-koden för ett tecken. Informationen ligger lagrad som vi är vana att se den i en ordbehandlare, d.v.s. med en radstruktur. När vi kompilerar och länkar våra program vi skriver skapas en exekverbar exe-fil. Den kallas binärfil, vilket är en annan typ av fil. Vi har enbart tagit upp de två fallen att enbart läsa från eller skriva till en fil. Ofta kan det ju vara så att man vill ändra i en befintlig fil och hoppa fram och tillbaka i den. Det finns funktioner för att skapa denna direktaccess. Detta ligger utanför denna kurs. Denna kod läser tecken för tecken //strömmarna cin/cout //filströmmar main() int n=0; char tecken; ifstream infil("min_fil.txt"); while (infil.get(tecken)) cout.put(tecken); if (tecken == '\n') n++; cout<< \n\nfilen innehöll <<n<< rader\n\n ; //öppna filen som läsfil //läs in ett tecken, så länge det går bra genereras värdet true till villkoret //och skriv ut det på skärmen //stäng infilen Lägg till denna kod och du får ett program som kopierar en textfil tecken för tecken ofstream utfil("ny_fil.txt"); utfil.put(tecken); utfil.close(); //öppna filen som skrivfil //och skriv på nya texfilen jämför strömmarna cout/utfil //stäng nya utfilen 1 (5)

Till filhantering hör alltid felhantering, en filläsning/skrivning som inte fungerar ska ju inte krascha hela programmet. Felhantering kan göras på flera sätt vi tittar på ett enkelt sätt, vi använder oss av filströmmens namn som flagga (failbit true eller false), fungerar öppningen av filen sätts flaggan till true anars false. Vi bygger om koden ovan med felhantering if(!infil) // vi läser av flaggan cout << "filen kan ej läsas! " << endl; else if(!utfil) // vi läser av flaggan cout << "filen kan ej skrivas! " << endl; else // här kommer gamla koden som körs om inte if/elseif körts Vi tittar vidare på läsning och skrivning till textfil och läser/skriver nu hela meningar. Här får vi felhanteringen på köpet i inmatningssatsen ( while (infil.getline(klyscha,99)) ). //strömmarna cin/cout //filströmmar main() char klyscha[100]; //textsträng ifstream infil("klyschor.txt"); //öppna filen som läsfil while (infil.getline(klyscha,99)) //läs in en filrad till klyscha cout<<klyscha<<endl //och skriv ut den på skärmen //stäng infilen ofstream utfil("klyschor.txt"); //öppna samma fil som skrivfil, cout<<"mata in dina bästa klyschor, avsluta med CTRL+Z: "; while (cin.getline(klyscha,99)) utfil<<klyscha<<endl; //skriv till filen p.s.s. som för cout utfil.close(); //stäng utfilen där klyschor.txt från början har följande utseende: Det finns inga dåliga väder bara dåliga kläder Den som väntar på något gott väntar aldrig för länge Kan något gå fel så gör det det Längre steg och oftare Vi provkör. Förhoppningsvis funkar koden men Vi vill kanske att de nya klyschorna läggs till de gamla, det gör vi med koden ios::app (app=append) ofstream utfil("klyschor.txt", ios::app); Att göra: Börja med och se till att få exemplen i texten ovan att fungera Läs tecken för tecken från fil. Kopiera textfil tecken för tecken. Skriva och läsa meningar Studera noga bifogad exempelkod, ex1 ex2. Läs Läs avsnitten på webben. Öva Se nedan 2 (5)

Övningar Övning 1 Skriv ett program som läser in resultatet (från två prov) från en separat fil (resultat.txt). Ditt program ska beräkna medelvärdet på båda proven och skriva ut resultatet. Ditt program ska också beräkna totalpoängen för varje deltagare och skriva ut namn och totalpoäng. Filen resultat.txt ser ut enligt följande (som du skriver in och spar i samma mapp som ditt program): (Om du vill kan du lägga in på första raden, antalet elever, dvs hur många poster som kommer senare i filen!!) Kalle 12 24 Kajsa 14 19 Musse 9 28 Långben 1 37 Mimmi 21 22 Övning 2 Lägg till i ditt program så att det även skriver ut totalresultatet på en fil som heter total.txt. Övning 3 Skriv ett program som analyserar en C++-fil (.cpp-fil) och ser hur många rader filen består av, hur många -tecken, och -tecken som finns, samt hur många (-tecken och )-tecken och ;-tecken. Skriv ut resultatet snyggt på skärmen. Övning 4 Skriv ett program som läser in en text från terminalen och sparar texten i en ny textfil med namnet minfil.txt. Den nya textfilen ska ha samma radstruktur som det som skrivs in på terminalen. Dessutom ska alla små bokstäver som läses in översättas till stora. Övning 5 Man har sparat ett hemligt meddelande i en textfil med namnet hemlig.txt. För att ingen obehörig utan vidare ska kunna förstå meddelandet har det kodats. Man har översatt varje bokstav i meddelandet till någon annan bokstav med hjälp av en tabell ( kodningstabellen på en egen fil) : Kodbokstav: guwyrmqpsaeicäbönoåzlfhdkjxtv Klartext: abcdefghijklmnopqrstuvwxyzåäö Om t ex filen innehåller texten egiir ftäzgo bäåygq ei zalqb så betyder det kalle väntar onsdag kl tjugo. Skriv ett program som läser filen med det hemliga meddelandet och skriver ut det i klartext. Programmet ska börja med att läsa in kodningstabellen. Utöka ditt program så att du kan välja om du vill skapa en fil med hemlig kod eller läsa en fil med hemlig kod. Övning 6 Skriv ett personregister med minst dessa fält, efternamn, förnamn, adress, postadress, telefon. Registret ska jobba mot en flerdimensionell array. Registret ska vara menystyrt med följande funktioner. Registret ska ha felhantering. 1. Inläsning av post 2. Visning av poster 3. Sortering 4. Ändra i post 5. Ta bort post 6. Läsa från fil 7. Skriva på fil Tillägg: sortera på valfritt fält, starta från inifil som håller reda på senast använda register och andra inställningar. 3 (5)

Ex 1: // filform.cpp //** Formaterad inmatning ** //vi vet hur data ligger lagrat på filen, vi använder operatorn >> //t ex vill vi läsa följande fil testsiff.txt // ------------------------ // 3 // KALLE 43 // MUSSE 21 // LÅNGBEN 35 // ------------------------ #include <string> int r, rader; double summa=0, points; string namn; ifstream infil("testsiff.txt"); infil>>rader; cout<<rader<<endl; //Kan kommenteras bort när testningen är klar for (r=1;r<(rader+1);r++) infil >> namn >> points; summa=summa+points; cout << namn <<" "<< points<<endl; cout<<endl<<"medelpoängen var "<<summa/rader<<" poäng."<<endl; //Kan kommenteras bort cout<<"\n*** TACK FÖR IDAG! ***\n"<<endl; Ex2. // filoform.cpp //** Oformaterad inmatning ** //vi vet inte hur data ligger lagrat på filen,vi använder här funktionen get(c) där c är en //char-variabel, t ex vill vi läsa en cpp fil och undersöka några saker char infilnamn[30], c; int tecken=0,rader=0, vseagull=0, hseagull=0; cout<<"vilken cpp-fil ska vi analysera?\n"; //OBS! open-funktionen vill ha en textsträng av typen teckenarray //en string-variabel fungerar inte!! Tyvärr!! while (infil.get(c) ) //läser in nästa tecken i strömmen till c, //ger EOF om filslut påträffas, dvs värdet av eof läggs i c, (flaggan eofbit sätts) cout<<c; //För att se att det är rätt fil, kommenteras bort om man vill tecken++; if ( c=='\n' ) rader++; else if ( c=='' ) vseagull++; else if ( c=='' ) hseagull++; cout<<" Antal rader = "<<rader<<endl; cout<<" Antal vänstermåsar = "<<vseagull<<endl; cout<<" Antal högermåsar = "<<hseagull<<endl; cout<<"\n*** TACK FÖR IDAG! ***\n"<<endl; 4 (5)

Ex3: #include <stdlib.h> void formaterad(char infilnamn[]); void oformaterad(char infilnamn[]); int alternativ(int start); int start=1; while (start) start= alternativ(start); cout<<"*** TACK FÖR IDAG! ***"<<endl; int alternativ(int start) char infilnamn[30], val; cout<<endl<<"*******************************"<<endl; cout<<" Vad vill du göra med filen? "<<endl; cout<<" 1: Läsa in en formaterad fil."<<endl; cout<<" 2: Läsa in en oformaterad fil."<<endl; cout<<" 3: SLUTA"<<endl; cin>>val; switch(val) case '1': case '2': break; default: return start; cout<<" Ange infilnamn : "; formaterad(infilnamn); break; cout<<" Ange infilnamn : "; oformaterad(infilnamn); start=0; //** Formaterad inmatning ** // Se Ex1 //vi vet hur data ligger lagrat på filen //vi använder operatorn >> //t ex vill vi läsa följande fil testsiff.txt //------------------------ //3 //KALLE 43 //MUSSE 21 //LÅNGBEN 35 //------------------------ void formaterad(char infilnamn[]) char namn[20]; int r, rader; double points, summa=0; infil>>rader; //cout<<rader<<endl; for (r=1;r<(rader+1);r++) infil >> namn >> points; summa=summa+points; cout << namn <<" "<< points<<endl; cout<<endl<<"medelpoängen var "<<summa/(r-1)<<" poäng."<<endl; //** Oformaterad inmatning ** // Se Ex2 //vi vet inte hur data ligger lagrat på filen //vi använder här funktionen get(c) där c är en charvariabel //t ex vill vi läsa en cpp fil och undersöka några saker void oformaterad(char infilnamn[]) char c; int tecken=0,rader=0, vseagull=0, hseagull=0; while (infil.get(c) ) //läser in nästa tecken i strömmen till c, //ger EOF om filslut påträffas, dvs värdet av eof // läggs i c, (flaggan eofbit sätts) // cout<<c; tecken++; if ( c=='\n' ) rader++; else if ( c=='' ) vseagull++; else if ( c=='' ) hseagull++; cout<<" Antal tecken = "<<tecken<<endl; cout<<" Antal rader = "<<rader<<endl; cout<<" Antal vänstermåsar = "<<vseagull<<endl; cout<<" Antal högermåsar = "<<hseagull<<endl; 5 (5)