Föreläsning 7: Filer

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

Föreläsning 4: Poster

Introduktion till MATLAB, med utgångspunkt från Ada

Föreläsning 6: Introduktion av listor

Föreläsning 5: Introduktion av pekare

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

Tentamen Grundläggande programmering

Exempel på ett litet Ada-program

Föreläsnings 9 - Exceptions, I/O

Sockets: server. with Ada.Command_Line; use Ada.Command_Line; with Ada.Exceptions; use Ada.Exceptions; with Ada.Text_IO; use Ada.

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

5 Grundläggande in- och utmatning

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

Standardfilerna Input och Output. Filer... Filer... vanlig utbyggnad för ökad dynamik. Filer... filtyper

kl Tentaupplägg

TDDE10 TDDE11, 725G90. Gemensam kurswebsida på:

Standardfilerna Input och Output

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 1 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Uppgift 1 ( Betyg 3 uppgift )

kl Tentaupplägg

Programmeringsteknisk översiktskurs för yrkeshögskoleprogram

Paket (2) nautisk_mil : constant Float := * foot; ångström : constant Float := 10.0E-10; mile : constant Float := 5280.

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

Filer. DA2001 (Föreläsning 16) Datalogi 1 Hösten / 19

Filer och structer Del 2

Programmeringsteknik med C och Matlab

Tentaupplägg denna gång

Ordlistor, filhantering och ut på webben. Linda Mannila

Objektorienterad Programmering (TDDC77)

Tentamen i Grundläggande Programvaruutveckling, TDA548

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Datalogi, grundkurs 1. Lösningsförslag till tentamen

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 0: Introduktion av Ada

Enkla datatyper minne

Föreläsning 6: Metoder och fält (arrays)

Datalogi, grundkurs 1

PC-teknik, 5 p LABORATION FILHANTERING

kl Tentaupplägg

Kontinuerliga listor. Fält (listor) Kontinuerliga listor... Kontinuerliga listor...

KOMPLETTERANDE HEMTENTAMEN TDDB53

Tentamen i Grundläggande Programvaruutveckling, TDA548

kl Tentaupplägg

729G04 Programmering och diskret matematik. Föreläsning 7

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

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Exempelduggan. Luffarschack. Koda spel

TDIU01 - Programmering i C++, grundkurs

kl Tentaupplägg

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

//Använd main som ett "handtag" för att hålla ihop programmet. //Själva programmet finns i övriga klasser.

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Skolan för Datavetenskap och kommunikation PROGRAMMERINGSTEKNIK FÖRELÄSNING 18

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

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

Översikt. Skriva och läsa data. Kontrollflöde. Två sorters loopar. For-loop. For-loop

F4. programmeringsteknik och Matlab

Planering Programmering grundkurs HI1024 HT TIDAA

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Objektorienterad programmering D2

Språkkonventioner och redigering av tal.

Uppgift 1 ( Betyg 3 uppgift )

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Föreläsning 1 Datastrukturer (DAT037)

Datastrukturer. föreläsning 3. Stacks 1

Föreläsning 5 Programmeringsteknik DD1310. Modulen doctest. Exempel. Doctest Dictionary Filhantering

Uppgift 1 (grundläggande konstruktioner)

Schemaunderlag för Programmering, grundkurs (TDDB18)

Föreläsning 14. Filhantering

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

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Föreläsning 2. Täcker material från lektion 1, 2, 3 och 4:

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

Du skall naturligtvis visa körexempel med output där det behövs i din rapport!

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

TDDC74 Lab 04 Muterbara strukturer, omgivningar

JAVAUTVECKLING LEKTION 4

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

Tentamen PC-teknik 5 p

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

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

TENTA: TDDD11 & TDDC68. Tillåtna hjälpmedel. Starta Emacs, terminal och tentakommunikationsfönster. Skicka in frågor och uppgifter

Outline. I Vi kan lätt göra samma sak för fyra variabler... I Hur gör vi för 400 inlästa värden? I Ofta behöver man flera likadana variabler

Snabbguide Visma Compact API Copyright Visma Spcs AB

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

kl Tentaupplägg

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

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Den klassiska programmodellen. Introduktion till programmering D0009E. Föreläsning 11: Filer och undantag. Filsystem. Interaktiva program.

Planering Programmering grundkurs HI1024 HT data

Tentamen i Programmering

Välkomna till DIT012 IPGO. Tyvärr en bug i Google Docs: Sidnummer stämmer inte alltid. Alla anteckningar börjar på sidan 1.

Prova på-laboration i Ada

Uppgift 1a (Aktiekurser utan poster)

Föreläsning 2, vecka 8: Repetition

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

[] Arrayer = Indexerad variabel

Översikt över Visual Basic

Transkript:

Genomgånget på FÖ: Föreläsning 7: Filer Undantag: Liten mall för undantag ("exceptions") och vad man har det till. Dock inte med betoning på allt, men det väsentliga är upptaget. Filer: P. Open(filvar, mode, filnamn); kraschar om filen ej finns! mode = In_File, Out_File eller Append_File filvar : File_Type; P. Create(filvar, mode, filnamn); se Open (med undantag att det ej kraschar!) P. Close(filvar); P. Delete(filvar); filen måste vara öppen! P. Reset(filvar); ej tagit upp denna, men det fixar ni. P. Get(filvar, X); P. Get_Line(filvar, Str, X); P. Skip_Line(filvar); som för tangentbord (endast textfiler). P. Put(filvar, X); P. Put_Line(filvar, Str); P. New_Line(filvar); som för skärm (endast textfiler). F. End_Of_File(filvar) return Boolean; gäller för alla typer av filer. utan filvar => tangentbord. F. End_Of_Line(filvar) return Boolean; endast textfiler. utan filvar => tangentbord. kraschar om filslut utan radslut (om ej tom fil förstås).

Följande exempel visat: with Ada.Text_IO; use Ada.Text_IO; procedure Copy_File is Original : File_Type; Copy : File_Type; Ch : Character; Open(Original, In_File, "A.TXT"); Create(Copy, Out_File, "B.TXT"); while not End_Of_File(Original) loop while not End_Of_Line(Original) loop Get(Original, Ch); Put(Copy, Ch); Skip_Line(Original); New_Line(Copy); Close(Copy); end Copy_File; Jag talade kort om vad man använde filer till, men jag tror att det är bra att ta det en gång till. Säg något i stil med att man vill kunna köra programmet och sen avsluta det och sen nästa gång vill man kunna fortsätta från den plats man slutade (d.v.s. man vill inte mata in alla data igen). Övning på lektion Detta lektionsmaterial är omfattande. Räkna inte med att hinna med allt som står utan låt det ta den tid det tar. Man bör hinna med två uppgifter. Den tredje kan man ju alltid lämna som hemuppgift. :-) Uppgift 1: Antag att vi inte har tillgång till "Append_File" i den kompilator som finns. Hur gör vi om vi vill utföra en "Append" iallafall? Vi har tillgång till allt utom just "Append_File". Detta problem är bra till att diskutera hur man löser problem (d.v.s. det som kursen går ut på). Man kan här ta upp saker som att man kan "använda brain storming", "tänka på svenska", "post-itlappar", "stegvis förfining", "skjuta problem framför sig" m.m. Vi kan börja med att skriva ett huvudprogram som visar vad det är vi vill komma fram till.

with Ada.Text_IO; use Ada.Text_IO; procedure Xxx is Vi borde skriva: Open(Data_File, Append_File, "A.TXT"); men vi har ju kompilatorbugg för att få fram något bra exempel att arbeta med på lektion. : ) OBS! Append_File fungerar utmärkt i Gnat. Append(Data_File, "A.TXT"); Put_Line(Data_File, "Lite extra text..."); Studenterna kan ju få hjälpa till med vilken datatyp som skall användas m.m., men det är nog bra att få fram budskapet vad uppgiften går ut på (det brukar finnas en del funderingar på vad det är annars). Vi skall alltså skapa oss en 'Append' som ser till att filen kan skrivas på och att de data som redan låg på filen inte försvinner. Bra att veta att "Out_File" innebär att filens innehåll "raderas". Det går inte att öppna för läsning och läsa från början till slut och sen tro att det bara är att fortsätta skriva. Det brukar bli en del diskussion om hur man skall göra och det får det väl bli. Försök att vara öppen och skriv upp det de säger så kanske man till slut kan få en lista på bra saker som skall göras. Då någon kommit på att det går att kopiera filen till en ny fil och sen kopiera tillbaka den för att sen lämna den öppen för vidare skrivning har vi kommit fram till lösningen. Det är inte tillåtet att spara alla data i ett fält eller annat (filer kan vara alldeles för stora). Vi antecknar vad som måste göras (inte alls säkert att förslagen kommer i den rätta ordningen, men vi styr lite så blir det bra): 1) Öppna originalfilen (vi kallar den A) för läsning. 2) Skapa en ny fil (vi kallar den B) för skrivning. 3) Kopiera A -> B. 4) Stäng A och B. 5) Öppna B för läsning. 6) Öppna A för skrivning. 7) Kopiera B -> A. 8) Ta bort B. 9) KLART! Översätt detta till kod! Det borde inte vara så svårt. :-)

procedure Append(File : in out File_Type; Filename : String) is Temp : File_Type; Open(File, In_File, Filename); Open(Temp, Out_File, "TMP.TMP"); Copy(File, Temp); Close(Temp); Close(File); Open(Temp, In_File, "TMP.TMP"); Open(File, Out_File, Filename); Copy(Temp, File); Delete(Temp); end Append; Vi behöver en extra procedur som kopierar (om vi inte var klantiga när vi skrev "Append"). procedure Copy(Original, Copy : in File_Type) is Item : Character; while not End_Of_File(Original) loop while not End_Of_Line(Original) loop Get(Original, Item); Put(Copy, Item); Skip_Line(Original); New_Line(Copy); end Copy; Denna borde de klara som en dans då vi redan haft den på FÖ. Observera att parametern har endast "in". Detta gäller generellt för filer om man inte ändrar status (d.v.s. öppnar eller stänger). Se i "Append": parametern har "in out" för att vi skall öppna den för skrivning från huvudprogrammets vy. Vad händer om vi istället skall lägga till data i en binär heltalsfil? Vi börjar med huvudprogrammet. with Ada.Sequential_IO; procedure Xxx is package Integer_IO is new Ada.Sequential_IO(Integer); use Integer_IO; Append(Data_File, "A.INT"); Write(Data_File, 42); Talet 42 skrivs på filen.

I "Append" händer inget alls (algoritmen helt ok alltså). Dock händer det lite i "Copy". procedure Copy(Original, Copy : in File_Type) is Item : Integer; Måste stämma med filtypen! while not End_Of_File(Original) loop Read(Original, Item); Write(Copy, Item); end Copy; Observera att det inte finns några operationer "End_Of_Line", "New_Line" och "Skip_Line" på binära filer och att "Get"/"Put" heter "Read"/"Write" istället. Uppgift 2: Läs in de två sista talen från en fil, summera dessa och skriv sedan ut summan i slutet av samma fil. Om det inte existerar några tal eller bara finns ett tal på filen ska programmet se till att filen innehåller de två talen 1 och 1 istället. Vi kan anta att det alltid finns en fil i första problemet. Det problem som finns är alltså att räkna antalet tal som finns och bara lagra de två sista hela tiden. Vi antar att det är en binär heltalsfil för att öva mer på detta.

with Ada.Sequential_IO; procedure Xxx is package Integer_IO is new Ada.Sequential_IO(Integer); use Integer_IO; type Integer_Array is array (1..2) of Integer; Last_Numbers : Integer_Array; No_Of_Numbers : Integer := 0; Open(Data_File, In_File, "TAL.INT"); while not End_Of_File(Data_File) loop if No_Of_Numbers < 2 then No_Of_Numbers := No_Of_Numbers + 1; Last_Numbers(1) := Last_Numbers(2); Read(Original, Last_Numbers(2)); if (No_Of_Numbers = 2) then Open(Original, Append_File, "TAL.INT"); Write(Original, Sum(Last_Numbers)); else Open(Original, Out_File, "TAL.INT"); Man kan hänvisa funktionen "Sum" till tidigare anteckningar (vi tog väl upp något sådant på lektionen om fält). Uppgift 3: Samma problem som i uppgift 2, men om filen inte existerar ska programmet skapa filen och skriva ut de två talen (1 och 1) på den. Ja, nu behövs det felhantering med undantag ("exceptions") om man skall lösa detta problem. Enda ändringen blir i detta fall att vi vill fånga felet som kan uppstå för att filen inte existerar och detta kan vi göra i slutet av programmet.

procedure Xxx is package Integer_IO is new Ada.Sequential_IO(Integer); use Integer_IO; type Integer_Array is array (1..2) of Integer; Last_Numbers : Integer_Array; No_Of_Numbers : Integer := 0; Open(Data_File, In_File, "TAL.INT"); while not End_Of_File(Data_File) loop if No_Of_Numbers < 2 then No_Of_Numbers := No_Of_Numbers + 1; Last_Numbers(1) := Last_Numbers(2); Read(Original, Last_Numbers(2)); if (No_Of_Numbers = 2) then Open(Original, Append_File, "TAL.INT"); Write(Original, Sum(Last_Numbers)); else Open(Original, Out_File, "TAL.INT"); exception when Name_Error => Create(Data_File, Out_File, "TAL.INT");