Kurt Nørmark
Institut for Datalogi, Aalborg Universitet
Sammendrag Forrige lektion Stikord Referencer Indhold | I denne lektion beskriver vi filbegrebet og de forskellige operationer på filer. Vi slutter af med en diskussion af hvordan structures can udskrives på filer og indlæses fra filer. |
Introduktion til filer |
Oversigt over filbegreber Slide Indhold Stikord Referencer |
|
|
|
Sekventielle filer Slide Indhold Stikord Referencer |
|
Begrebet sekventiel fil: En sekventiel fil læses altid i den rækkefølge den er skrevet. Rækkefølgen af enheder i en sekventiel fil afspejler direkte rækkefølgen af de udførte skriveoperationer på filen. |
|
Random access filer Slide Indhold Stikord Referencer |
|
Filer i C |
Strukturen FILE Slide Indhold Stikord Referencer |
|
|
|
Sekventielle filer i C Slide Indhold Stikord Referencer |
|
|
Filbuffering Slide Indhold Stikord Referencer |
|
Figur. En illustration af filbuffere mellem den ydre enhed og programmet |
|
Simpel skrivning og læsning af en fil Slide Indhold Stikord Referencer |
|
Program: Skrivning af tegn fra en tekststreng på en tekstfil. |
|
Program: Læsning af tegn fra en tekstfil til en tekststreng. |
|
|
Program: Et program der laver dobbelt linieafstand i en tekstfil - input og output filer via parametre til main. |
|
|
Standard input, output og error Slide Indhold Stikord Referencer |
|
|
|
|
Fil opening modes Slide Indhold Stikord Referencer |
|
Tabel. En tabel der beskriver betydningen af de forskellige opening modes af filer. |
|
|
Program: Tilføjelse af tegn til en tekstfil. |
|
Program: Læsning og skrivning af fil med r+ - hvert andet tegn i filen erstattes med 'X' - virker ikke... |
|
Program: Læsning og skrivning af fil med r+ - hvert andet tegn i filen erstattes med 'X' - virker!. |
|
Program: first-file efter at ovenstående program er kørt. |
|
Program: Standard output fra ovenstående program. |
|
|
Detaljer om fil opening modes Slide Indhold Stikord Referencer |
|
Tabel. En tabel der i størrel detalje beskriver betydningen af de forskellige opening modes af filer. |
|
|
Funktioner der arbejder på sekventielle filer Slide Indhold Stikord Referencer |
|
|
Opgave 13.3. Læsning af k ord fra fil | Skriv en funktion int getwords(FILE *ifp, int k, char *words) der, om muligt, læser k ord fra tekstfilen der er udpeget af pointeren ifp. Ordene skal læses over i tekststrengen words (som allokeres af den funktion, som kalder getwords). Hvis det ønskes kan ordene organiseres linievis i words, eller blot med 'white space' imellem ordene. Den programmerede funktion skal returnere det faktiske antal af læste ord (som kan være mindre end k). |
Opgave 13.3. En simpel grep funktion | grep er en Unix kommando der søger efter linjer i en tekstfil, som matcher en søgestreng. I denne opgave vil vi programmere en meget simpel variant af grep, som udskriver de tekstlinjer, i hvilke et bestemt søgeord forekommer. Vi ønsker at anvende det udviklede program således fra kommandolinjen: search programmering my-file.txt eller måske snarere: ./search programmering my-file.txt Dette skal udskrive alle de linjer i my-file.txt som indholder strengen "programmering". Programmet skal anvende programparametre, som forklaret på denne slide. |
Directories i C |
Directories i C Slide Indhold Stikord Referencer |
|
|
Program: Et list directory program - lånt fra Wikepedia. |
|
Program: Mulig oversættelse og kørsel af programmet på ls.c. |
|
Funktioner på random access filer Slide Indhold Stikord Referencer |
|
|
Program: Et program der læser en fil baglæns. |
|
Formateret output og input |
Formateret output - printf familien (1) Slide Indhold Stikord Referencer |
|
|
|
Formateret output - printf familien (2) Slide Indhold Stikord Referencer |
|
Figur. Nedbrydning af kontrolstrengen for %-#08.3hd. Denne figur er inspireret fra 'A C Reference Manual' af Harbison & Steele |
|
Formateret output - printf familien (3) Slide Indhold Stikord Referencer |
|
|
Program: Udskrivning af heltal: Illustration af *.* field width og precision . |
|
Program: Udskrivning af doubles: Illustration af *.* field width og precision . |
|
|
Formateret input - scanf familien (1) Slide Indhold Stikord Referencer |
|
|
|
Formateret input - scanf familien (2) Slide Indhold Stikord Referencer |
|
|
Program: Illustration af directives med almindelige tegn. |
|
Program: Illustration af brugen af scan width ved læsning af en streng. |
|
Program: Illustration af brugen af scan width ved læsning af en double. |
|
Formateret input - scanf familien (3) Slide Indhold Stikord Referencer |
|
|
Formateret input - scanf familien (4) Slide Indhold Stikord Referencer |
|
Program: Et program der læser ikke-blanke liner fra en fil og udskriver disse på standard output. |
|
Program: Et andet program der adskiller alfabetiske og numeriske afsnit i en tekst - læser fra stdin. |
|
Program: Et andet program der adskiller alfabetiske og numeriske afsnit i en tekst - læser fra en streng - virker ikke. |
|
Program: Et andet program der adskiller alfabetiske og numeriske afsnit i en tekst - læser fra en streng - virker. |
|
Program: Millies product codes - afleveringsopgave - PSPD8 opgave 1 side 490 - med sscanf. |
|
Program: Millies product codes - alternativ implementation. |
|
Program: Program output. |
|
Formateret input - scanf familien (5) Slide Indhold Stikord Referencer |
|
Program: Linje-opdelt input fil: Busplan. |
|
Program: Et program der læser to linjer fra en simpel busplan. |
|
Program: Output fra programmet. |
|
Program: Et alternativt program der læser to linjer fra en simpel busplan. |
|
Program: Output fra programmet. |
|
Program: Linje-opdelt input fil: TV-oversigt. |
|
Program: Et program der læser to linjer fra en simpel tv plan. |
|
Program: Program output. |
|
|
|
Input og output af structures |
Input/Output af structures (1) Slide Indhold Stikord Referencer |
|
|
Input/Output af structures (2) Slide Indhold Stikord Referencer |
|
Program: Programmet der udskriver bøger på en output fil. |
|
Program: Den skrevne fil. |
|
Program: Programmet der indlæses bøger fra en input fil. |
|
Program: Output fra programmet - på skærmen. |
|
Program: Header filen book-read-write.h. |
|
Program: Implementationen af biblioteket - book-read-write.c. |
|
Program: Compilering af programmerne. |
|
Opgave 13.4. Input og Output af structs | Vi vil antage at vi har en struct som beskriver data om en person, så som struct person { char *name; int age; char sex; }hvor sex er enten tegnet 'm' eller 'f'. I denne øvelse bliver du bedt om at programmere funktioner, som kan udskrive et antal personer på en fil, og som efterfølgende kan indlæse disse igen. Hvis det er hensigtsmæssigt, er det OK at allokere name som et char array: char name[MAX_NAME_SIZE]. Konkret, skal der skrives to funktionervoid print_person(struct person *p, FILE *ofp); person *read_person(FILE *ifp); Du kan vælge en tekst-baseret og linie-orienteret fremgangsmåde, som illustreret ved forelæsningen. Som et noget lettere alternativ kan du vælge at anvende en binær fremgangsmåde ved brug af fwrite og fread. Overvej hvad der skal til for at anvende fwrite og fread på struct person. |
Input/Output af structures (3) Slide Indhold Stikord Referencer |
|
|
|
Binær input/output med fread og fwrite Slide Indhold Stikord Referencer |
|
|
Eksempler: Binær input/output med fread og fwrite Slide Indhold Stikord Referencer |
|
Program: Skrivning af en struct til en binær fil. |
|
Program: Tilsvarende læsning af en struct fra en binær fil. |
|
Program: Output fra programmet - på skærmen. |
|
|
Program: Skrivning af en struct med et pointer felt til en binær fil. |
|
Program: Tilsvarende læsning af en struct fra en binær fil - virker ikke. |
|
Program: Output fra programmet - på skærmen. |
|
Opgaver Slide Indhold Stikord Referencer |
Opgave 13.6. Tynde matricer | En vilkårlig matrix kan generelt repræsenteres på en tekstfil, med én linje pr. række. Første linje kan angive antallet af rækker og søjler i matricen (altså to heltal). I denne opgave kalder vi dette for den generelle tekstfil repræsentation af vilkårlige matricer. En tynd matrix er et array af to dimensioner, hvor mange af elementerne er nul. I denne opgave vil vi skrive et program der undersøtter en speciel tekstfil repræsentation af tynde matricer på tekstfiler, som i visse tilfælde fylder mindre end den generelle repræsentation af matricer på tekstfiler. I den nye repræsentation skal den første linje af tekstfilen indeholde dimensionerne af matricen - to heltal - antal rækker og antal søjler. Hver af de efterfølgende linjer indholder tre tal: Rækkenummer, søjlenummer, og et tal fra matricen (som ikke er nul). Om nødvendigt kan man gøre sig antagelser om rækkefølgen af linjer i den specielle tekstfil repræsentation. Skriv først en funktion som læser en matrix fra den generelle repræsentation på en tekstfil, og som udskriver den specielle tynde repræsentation på en ny tekstfil. Skriv dernæst en funktion som løser det omvendte problem: Læsning af en tynd matrix fra en tekstfil og skrivning af en tilvarende matrix på generel form på en anden tekstfil. Som et eksempel svarer følgende generelle tekstfil repræsentation af matricen 4 3 0.0 0.0 1.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 3.0 0.0 til følgende specielle tekstfil repræsentation af matricen - som er en tynd matrix 4 3 1 3 1.000000 3 1 2.000000 4 2 3.000000 Denne opgave svarer til opgave 4 side 679 i 6. udgave af lærebogen |
Opgave 13.6. Læsning af personkartotek i komma-separeret tekstfil | Skriv et program der indlæser tekstfilen i et array af følgende struct: #define MAX_NAME_LGT 50 struct person{ char fornavn[MAX_NAME_LGT]; char efternavn[MAX_NAME_LGT]; char vejnavn[MAX_NAME_LGT]; int vejnummer; int postnummer; char bynavn[MAX_NAME_LGT]; }; Indholdet af tekstfilen findes også nederst i opgaven. Tekstfilen er linje-orienteret. Data om én person findes på én linje. Navne-delen, gade-delen og by-delen er adskilt af kommaer, og linjen er afsluttet med et punktum. Der optræder ikke cifre i fornavn efternavne, gadenavne eller bynavne. Hver person har ét fornavn og ét efternavn. Gadenavnet kan bestå af flere ord. Bynavnet består af netop et ord. Overvej omhyggeligt hvordan du læser bestanddelene af en linje. Det er måske nyttigt for dig at bruge scansets i din løsning, som et alternativ til %s . Vær forsigtig med at ikke at få indlæst et komma som en del af efternavnet. Vær også forsigtig med, at et vejnavn ikke ender med et 'space'. Sorter de indlæste data efter efternavn og udskriv de sorterede data på en anden fil. Filen skal have følgende simple linje-format: By: Efternavn Denne fil skal genereres med det givne input.
Her er input filen til programmet: Lars Jensen, Engtoften 23, 7182 Bredsten. Bo Olsen, Gammel Vestergade 56, 4261 Dalmose. Kurt Jensen, Haderslevvej 15, 8370 Hadsten. Birte Madsen, Universitetsvej 899, 9000 Aalborg. Kaj Moberg, Halevindingevej 2, 2670 Greve. Bo Rise, Hadsund Landvej Nord 56, 8900 Randers. Ebbe Rise, Hadsund Landvej Syd 58, 9520 Hobro. Kalle Rastrup, Under Broen 567, 2650 Hvidovre. Emil Rask, Over Broen 765, 2650 Glostrup. Jens Larsen, Finkevej 1, 6682 Hovborg. Lars Olsen, Gammel Vindingevej 2, 7560 Hjerm. Her er output filen fra programmet: Hadsten: Jensen Bredsten: Jensen Hovborg: Larsen Aalborg: Madsen Greve: Moberg Hjerm: Olsen Dalmose: Olsen Glostrup: Rask Hvidovre: Rastrup Randers: Rise Hobro: Rise |
Kapitel 13: Input/Output og Filer
Kursets hjemmeside Forfatteren's hjemmeside Om frembringelsen af disse sider Forrige lektion (top) Næste lektion (top) Forrige lektion (bund) Næste lektion (bund)
Genereret: 12. august 2021, 13:24:26