Grunderna i filhantering Filhantering Filer kan användas för permanent lagring av data Hårddisk, disketter, CD-R/W, band Variabler och arrayer Försvinner när du avslutar programmet Sparas i datorns arbetsminne (internminne) DAVA07/08 JE,MG,MG,PS 2 DAVA07/08 JE,MG,MG,PS Uppbyggnad av filer Data hierarkin 3 DAVA07/08 JE,MG,MG,PS 4 DAVA07/08 JE,MG,MG,PS Positionering i filer I en fil börjar man alltid att räkna från 0 Aktuell position hålls ordning på mha en filpekare Filpekaren Filpekaren är ett antal bytes sett från början av filen (offset)! Värdet ändras automatiskt när man läser eller skriver i filen Men först måste man... 5 DAVA07/08 JE,MG,MG,PS 6 DAVA07/08 JE,MG,MG,PS, 1
Öppna en fil (1) Koppla samman filvariabeln (internt i minnet) med den fysiska filen Öppnar en kommunikationskanal för läsning, skrivning eller båda Öppna en fil (2) Varje fil som är öppen har en filpekare När en fil öppnas sätts filpekaren (om inget annat nämns) automatiskt till att peka först i filen 7 DAVA07/08 JE,MG,MG,PS 8 DAVA07/08 JE,MG,MG,PS Skapa eller tömma filen Filpekaren hamnar först i filen Start = EOF Skrivning till filen Värdet skrivs till filpekarens aktuella position Filpekaren flyttar sig efter skrivningen 9 DAVA07/08 JE,MG,MG,PS 10 DAVA07/08 JE,MG,MG,PS Flytta på filpekaren Ex. Flytta filpekaren till första positionen i filen (återställer filpekaren) Läsning från filen Filpekaren läser värdet från sin aktuella position och flyttar sedan fram ett steg 11 DAVA07/08 JE,MG,MG,PS 12 DAVA07/08 JE,MG,MG,PS, 2
Jämförelse filer och arrayer Både arrayer och filer börjar från 0 Arrayer kan vi direkt tilldela/avläsa ett element via ett index, i en fil måste man flytta filpekaren Arrayer har en fast angiven storlek, en fil har ingen största storlek förutom den som sätts av minnet Båda kan lagra godtyckliga datatyper Filhantering i C++ Hur fungerar det i C++? Ingen struktur: bara en sekvens av bytes som slutar med en EOF-flagga.Programmeraren måste strukturera upp filen så att den matchar När en fil öppnas skapas en variabel och en kommunikationskanal associeras med variabeln. 13 DAVA07/08 JE,MG,MG,PS 14 DAVA07/08 JE,MG,MG,PS Pseudo-kod för filhantering Pseudo-kod för filhantering Skapa filvariabel Öppna filen Koppla ihop filvariabeln med den fysiska filen för att få en kommunikationskanal Ange om filen skall vara läsbar/skrivbar eller båda Kontrollera om filen gick att öppna Läs/skriv till filen Stäng filen Bibliotek Vilka bibliotek behövs? Header-biblioteken <iostream> och <fstream> 15 DAVA07/08 JE,MG,MG,PS 16 DAVA07/08 JE,MG,MG,PS Biblioteket Fstream Biblioteket <fstream> innehåller deklarationer för att kunna skapa variabler av Öppna en fil för enbart läsning ifstream: för läsning från en fil ofstream: för skrivning till en fil fstream: för läsning och skrivning till en fil 17 DAVA07/08 JE,MG,MG,PS 18 DAVA07/08 JE,MG,MG,PS, 3
Öppna en fil för enbart skrivning ios::app Alternativ vid skrivning ios::ate ios::out ios::trunc 19 DAVA07/08 JE,MG,MG,PS 20 DAVA07/08 JE,MG,MG,PS Öppna för läsning och skrivning Representation av data i C++ Sparas antingen binärt ios::binary anges vid öppning för läsning/skrivning eller via ASCII-kodning 21 DAVA07/08 JE,MG,MG,PS 22 DAVA07/08 JE,MG,MG,PS Kontrollera om filen öppnades Det kan hända att öppningen av en fil misslyckas, därför bör man alltid testa! Skrivning med << operatorn (1) Som i cout fast till filvariabeln istället 23 DAVA07/08 JE,MG,MG,PS 24 DAVA07/08 JE,MG,MG,PS, 4
Skrivning med << operatorn (2) Skrivning med << operatorn (3) 25 DAVA07/08 JE,MG,MG,PS 26 DAVA07/08 JE,MG,MG,PS Skrivning med write (1) Skriver alltid ned en fast storlek (oavsett om hela utrymmet är utnyttjat eller inte) Skrivning med write (2) 27 DAVA07/08 JE,MG,MG,PS 28 DAVA07/08 JE,MG,MG,PS Läsning från filer Kompletterande mot skrivningen >> read(reinterpret_cast<char *> (&p), sizeof(person)) Sekvensiella filer vs. direktfiler Två typer av filer Sekventiella filer Lagras ofta efter en ordning angiven av ett nyckelvärde Använder oftast << och >> för att skriva och läsa Direktfiler Alla strukturer måste ha samma längd! read och write används 0 2 0 0 3 0 0 4 0 0 5 0 0 byte offsets b y tes 29 DAVA07/08 JE,MG,MG,PS 30 DAVA07/08 JE,MG,MG,PS, 5
Positionera filpekaren (1) Positionera för läsning / flytta läspekaren seekg(long int) ios::beg, ios::cur, ios::end //Flytta 7 bytes framåt från filens början infile.seekg(7); //infile.seekg(7, ios::beg); //Flytta fram 3 bytes från aktuell filposition infile.seekg(3, ios::cur); //Flytta filpekaren 2 steg från filens slut infile.seekg(2, ios::end); Positionera filpekaren (2) Positionera för skrivning / flytta skrivpekaren seekp(long int) Samma som för seekg fast för skrivning Hämta aktuell filposition för läspekaren tellg() Hämta aktuell filposition för skrivpekaren tellp() Tjuvkika på nästa tecken utan att flytta filpekaren peek() Kolla om filpekaren står på EOF-flaggan eof() 31 DAVA07/08 JE,MG,MG,PS 32 DAVA07/08 JE,MG,MG,PS Stängning av filen Till sist: Det är god ton (och ökar prestandan) att explicit stänga filen så fort du är färdig med den close() Vidare information om filhantering För större exempel och mer detaljer, se kapitel 14 i Deitel & Deitel 33 DAVA07/08 JE,MG,MG,PS 34 DAVA07/08 JE,MG,MG,PS, 6