>> SPEAKER: Så langt er det sannsynlig at de fleste av programmene dine
har vært litt flyktig.
Du kjører et program som Mario eller grådige.
Det gjør noe, det kanskje ber brukeren for litt informasjon,
skrive ut noen utgang til skjermen, men så når programmet er over,
det er egentlig ingen bevis der det ble noen gang kjørt i første omgang.
Jeg mener, sikkert, kanskje du har igjen det åpner i terminalvinduet,
men hvis du tømme skjermen din, er det egentlig ingen bevis for at det eksisterte.
Vi har ikke en måte å lagre vedvarende, informasjon
som eksisterer etter vår Programmet har stoppet,
eller vi ikke ha opp til dette punktet.
Heldigvis skjønt, gjør c gi oss muligheten
å gjøre dette ved å implementere noe som kalles
en fil, en struktur som i utgangspunktet representerer en fil som du ville doble
klikk på datamaskinen din, hvis du er vant til et grafisk brukergrensesnitt-miljø.
Vanligvis når du arbeider med c, er vi faktisk
kommer til å jobbe med pekere til files-- fil stars--
med unntak av en liten bit når vi snakker om et par
av funksjonene som arbeide med filen pekere.
Du trenger ikke å ha virkelig gravd for dypt inn i forståelse pekere
dem selv.
Det er en liten teeny bit hvor vi vil snakke om dem,
men generelt fil pekere og pekere, mens henger sammen,
er ikke akkurat det samme.
>> Nå hva mener jeg da Jeg sier vedvarende data?
Hva er vedvarende data?
Hvorfor bryr vi oss om det?
Si for eksempel at du kjører et program
eller du har omskrevet en program som er et spill,
og du ønsker å holde styr av alle brukerens bevegelser
slik at kanskje hvis noe går galt, du kan lese filen etter kampen.
Det er hva vi mener når vi snakke om vedvarende data.
>> I løpet av publiseringen Programmet er en fil laget.
Og når programmet har stoppet,
at filen finnes fortsatt på systemet.
Og vi kan se på det og undersøke det.
Og slik at programmet ville være satt til har laget noen vedvarende data,
data finnes etter at programmet har kjørt ferdig.
>> Nå er alle disse funksjonene som fungerer med å opprette filer og manipulere
dem på forskjellige måter bor i standard io.h,
som er en header fil som du har sannsynligvis vært pund
inkludert på toppen av ganske sett alle programmene dine
fordi den inneholder en av de fleste nyttige funksjoner for oss,
printf, som også lar bor i standard io.h.
Så du trenger ikke å hamre inkludere noen ekstra filer trolig
for å jobbe med arkiv pekere.
>> Nå hver enkelt fil pekeren funksjon, eller hver enkelt fil I / O, input output
funksjon, godtar som en av sine parametere eller innganger
en fil pointer-- unntatt for en, fopen, som
er det du bruker for å hente fila pekeren i første omgang.
Men etter at du har åpnet fil og du får fil pekere,
du kan deretter sende dem som argumenter til de ulike funksjonene
vi kommer til å snakke om dag, så vel som mange andre,
slik at du kan arbeide med filer.
>> Så det er seks pen felles grunnleggende seg
at vi skal snakke om i dag.
fopen og dens følges funksjon fclose, fgetc
og dens følges funksjon fputc, og fread og dens følges funksjon,
fwrite.
Så la oss komme rett inn i den.
>> fopen-- hva gjør den?
Vel, det åpner en fil, og det gir deg en fil peker til den,
slik at du kan deretter bruke den filpeker som et argument
til noen av de andre filen I / O funksjoner.
Den viktigste tingen å huske med fopen
er at etter at du har åpnet fil eller gjort en samtale som den her,
du må sjekke for å være sikker at pekeren at du kom tilbake
ikke er lik til null.
Hvis du ikke har sett videoen på pekere, dette kan ikke være fornuftig.
Men hvis du prøver og dereference en nullpeker tilbakekalling,
programmet vil trolig lide en segmentering [uhørbart].
Vi ønsker å sørge for at vi fikk en legitim peker tilbake.
Det store flertallet av tiden vi vil har fått en legitim peker tilbake
og det vil ikke være et problem.
>> Så hvordan gjør vi en oppfordring til fopen?
Det ser ganske mye som dette.
File stjerners ptr-- PTR være en generisk navn på filen pointer-- fopen
og vi passerer i to ting, et filnavn og en operasjon vi ønsker å gjennomføre.
Så vi kan ha en samtale som ser ut som dette-- fil stjerners ptr en lik fopen
file1.txt.
Og den operasjonen jeg har valgt er r.
>> Så hva tror du r er her?
Hva er den slags ting vi kan være i stand til å gjøre for å filer?
Så r er driften som vi velge når vi vil lese en fil.
Så ville vi i utgangspunktet når vi ringe som dette
være å få oss en filpeker slik at vi da kunne lese informasjon
fra file1.txt.
>> På samme måte kan vi åpne filen 2.txt for skriving og slik at vi kan passere ptr2,
filpekeren jeg har laget her, som et argument til en funksjon som
skriver informasjon til en fil.
Og lignende til å skrive, det er også muligheten til å legge til, en.
Forskjellen mellom skriving og tilføye
er at når du skriver til en fil, Hvis du vil ringe til fopen for skriving
og at filen allerede finnes, det er kommer til å overskrive hele filen.
Det kommer til å starte helt i begynnelsen,
slette all informasjon som allerede er der.
>> Mens hvis du åpner den for å føye til, det vil gå til slutten av filen
hvis det er allerede tekst i den eller informasjon i den,
og det vil da starte skriver derfra.
Så du vil ikke miste noen av informasjon du har gjort før.
Enten du ønsker å skrive eller legge slags avhenger av situasjonen.
Men du vil sikkert vet hva riktig drift er når den tid kommer.
Så det er fopen.
>> Hva om fclose?
Vel, ganske enkelt, fclose bare godtar filen pekeren.
Og som du kanskje forventer, det stenger denne filen.
Og når vi har stengt en fil, kan vi ikke utføre noe mer fil I / O-funksjoner,
leser eller skriver, på denne filen.
Vi må re-åpne fil en annen gang i rekkefølge
å fortsette å arbeide med den ved hjelp av I / O funksjoner.
Så fclose midler vi er ferdige arbeider med denne filen.
Og alt vi trenger å passere i er navnet på en fil pekeren.
Så på et par glir siden, vi fopened fil en prikk tekst for lesing
og vi tildelt som filpeker til ptr1.
Nå har vi bestemt oss vi er ferdig med å lese fra filen.
Vi trenger ikke å gjøre noe mer med det.
Vi kan bare fclose ptr1.
Og på samme måte, kunne vi fclose de andre.
Greit.
Så det er åpning og lukking.
De er de to grunnleggende starter operasjoner.
>> Nå ønsker vi å faktisk gjøre noen interessante ting,
og den første funksjonen som vi vil se som vil gjøre det på er fgetc--
fil får en karakter.
Det er det fgetc generelt ville oversette til.
Sitt mål i livet er å lese neste tegn,
eller om dette er din aller første samtalen til fgetc
for en bestemt fil, det første tegnet.
Men så etter det, du får den neste,
allerede neste karakter av denne filen, og lagrer den i en karakter variabel.
Som vi har gjort her, char ch lik fgetc,
pass i navnet til en fil pekeren.
Igjen, det er veldig viktig her å huske
at for å få denne operasjonen lykkes,
filpekeren selv må har blitt åpnet for lesing.
Vi kan ikke lese en karakter fra en fil peker på at vi åpnet for skriving.
Så det er en av de begrensninger av fopen, ikke sant?
Vi må begrense oss til kun å utføre
en operasjon med én fil pekeren.
Hvis vi ønsket å lese og skrive fra den samme filen,
vi ville ha åpent to separate fil pekere til samme file--
en for lesing, en for skriving.
>> Så igjen, den eneste grunnen Jeg tar det opp nå er
fordi hvis vi kommer til å ringe til fgetc at filpeker må har
blitt åpnet for lesing.
Og så ganske enkelt, alt vi trenger å gjøre
er pass i navnet på filen pekeren.
Så char ch tilsvarer fgetc ptr1.
>> Det kommer til å få oss neste character--
eller igjen, hvis dette er den første gang vi har gjort denne samtalen,
den første character-- av hva filen er pekt på av ptr1.
Husker at det var fil en prikk tekst.
Det vil bli det første tegnet på at og vi vil lagre den i variabelen lm.
Ganske grei.
Så vi har bare sett på tre funksjoner og allerede vi
kan gjøre noe ganske ryddig.
>> Så hvis vi tar denne evnen for å få en karakter
og vi sløyfe it-- så vi fortsette å få karakterer
fra en fil over og over og over-- nå vi
kan lese hver eneste karakter av en fil.
Og hvis vi skriver ut hver karakter umiddelbart etter at vi leser det,
Vi har nå lest fra en fil og trykt innholdet til skjermen.
Vi har effektivt sammenkjedet at filen på skjermen.
Og det er hva Linux-kommandoen katt gjør.
>> Hvis du skriver katt i filnavnet, det vil skrive ut hele innholdet
av filen i terminalvinduet.
Og så denne lille sløyfen her, bare tre linjer med kode,
men det effektivt dupliserer Linux-kommando katt.
Så dette syntaks kanskje ser litt rart,
men her er hva som skjer her.
Mens ch lik fgetc, er ikke ptr lik EOF-- det er en hel munnfull,
men la oss bryte det ned bare så det er tydelig på syntaksen.
Jeg har konsolidert det av hensyn til plass,
selv om det er litt syntaktisk vanskelig.
>> Så denne delen i grønt til høyre nå, hva er det du gjør?
Vel, det er bare vår fgetc samtale, ikke sant?
Vi har sett det før.
Det er å skaffe én tegn fra filen.
Da vi sammenligner det karakter mot EOF.
EOF er en spesiell verdi som er definert i standarden io.h, som
er enden av fil karakter.
Så i utgangspunktet hva som kommer til å skje er denne sløyfen vil lese en karakter,
sammenligne det å EOF, den slutten av filen karakter.
Hvis de ikke samsvarer, slik at vi ikke har kommet til slutten av filen,
vi trykker det tegnet ut.
Deretter vil vi gå tilbake til begynnelsen av sløyfen på nytt.
Vi vil få en karakter, sjekk mot EOF, skrive det ut, og så videre
og så videre og så videre, viderekobling på den måten
før vi har nådd slutten av filen.
Og så etter det punktet, vil vi ha trykt
ut hele innholdet av filen.
Så igjen, vi har bare sett fopen, fclose, og fgetc
og allerede kan vi duplisere en Linux terminal kommando.
>> Som jeg sa i begynnelsen, vi hadde fgetc og fputc,
og fputc var ledsager funksjon av fgetc.
Og så, som du kan forestille deg, det er skrivetilsvarende.
Det tillater oss å skrive en enkelt tegn i en fil.
>> Igjen, det forbeholdet er, bare som det var med fgetc, filen
at vi skriver til må har vært åpnet for skriving eller for å legge til.
Hvis vi prøver og bruke fputc på en fil at vi har åpnet for lesing,
vi kommer til å lide litt av en feil.
Men samtalen er ganske enkel.
fputc kapital A ptr2, alle som kommer til å gjøre, er det
kommer til å skrive brevet inn i A til fil 2 dot
tekst, som var navn fil som vi åpnet og tildelt
pekeren til ptr2.
Så vi kommer til å skrive en kapital A til fil 2 dot tekst.
Og vi skal skrive et utrops peke til fil 3 dot
tekst, som ble pekt på av ptr3.
Så igjen, ganske grei her.
>> Men nå kan vi gjøre en annen ting.
Vi har dette eksemplet vi var bare å gå over
om å være i stand til å gjenskape katten Linux-kommandoen, den som skriver ut
til skjermen.
Vel, nå som vi har muligheten å lese tegn fra filer
og skrive tegn til filer, hvorfor ikke vi bare erstatte det
ringe til printf med en oppfordring til fputc.
>> Og nå har vi duplisert cp, en svært grunnleggende Linux-kommandoen
som vi snakket om veien lang siden i linux kommandoer video.
Vi har effektivt duplisert at akkurat her.
Vi leser en karakter og da er vi skriver det tegnet til en annen fil.
Lesing fra én fil, skriving til en annen, om og om igjen
og om igjen til vi treffer EOF.
Vi har fått til slutten av fil vi prøver å kopiere fra.
Og etter at vi har skrevet alle av karakterene vi trenger til filen
at vi skriver til.
Så dette er cp, Linux kopi kommando.
>> Helt i begynnelsen av denne videoen, hadde jeg det forbeholdet
at vi ville snakke Litt om pekere.
Her er spesifikt hvor vi er skal snakke om pekere
i tillegg til å sende inn tips.
Så denne funksjonen ser litt skummelt.
Det har flere parametere.
Det er mye som skjer her.
Det er mye forskjellig farger og tekster.
Men egentlig, det er bare det generisk versjon av fgetc
som tillater oss å få noen mengde informasjon.
Det kan være litt ineffektiv hvis vi er få tegn ett om gangen,
itera gjennom filen ett tegn om gangen.
Ville det ikke være bedre å få 100 på en gang, eller 500 om gangen?
>> Vel, fread og dens følges funksjon fwrite, som vi vil snakke om
i et sekund, tillate oss å gjøre nettopp det.
Vi kan lese en vilkårlig mengde av informasjon fra en fil
og vi lagrer den et sted midlertidig.
I stedet for å være i stand til bare passer det i en enkelt variabel,
vi trenger å lagre den i en matrise.
Og så, vi passere i fire argumenter for å fread-- en peker
til stedet der vi er kommer til å lagre informasjon,
hvor stor hver informasjonsenhet vil være, hvor mange enheter av informasjon
vi ønsker å erverve, og fra hvilken fil vi ønsker å få dem.
Trolig best illustrert med et eksempel her.
Så la oss si at vi erklærer en rekke 10 heltall.
Vi har nettopp erklært på stable vilkårlig int arr 10.
Så det er ganske grei.
Nå hva vi gjør skjønt er frecall er vi leser størrelsen på int
times 10 byte med informasjon.
Størrelsen på int vesen four-- det er størrelsen av et heltall i c.
>> Så det vi gjør er at vi leser 40 bytes verdt av informasjon
fra filen peker til ptr.
Og vi lagrer dem 40 bytes sted
hvor vi har satt til side 40 bytes verdt minne.
Heldigvis har vi allerede gjort det etter erklære arr, som matrise der.
Som er i stand holde 10 fire-byte enheter.
Så totalt, kan det holde 40 bytes verdt av informasjon.
Og vi nå leser 40 bytes av informasjon fra filen,
og vi lagre den i arr.
>> Husker fra videoen på pekere som navnet på en matrise, som for eksempel arr,
er egentlig bare en peker til sin første element.
Så når vi passerer i arr der, vi er, faktisk, som passerer i en peker.
>> Tilsvarende kan vi gjøre dette-- vi gjør ikke nødvendigvis
trenger å redde vår buffer på stakken.
Vi kunne også dynamisk tildele en buffer som dette, bruker malloc.
Husk at når vi dynamisk allokere minne,
vi sparer den på haug, ikke bunken.
Men det er fortsatt en buffer.
>> Det fortsatt, i dette tilfellet, er holder 640 byte med informasjon
fordi en dobbel tar opp åtte byte.
Og vi ber for 80 av dem.
Vi ønsker å ha plass å holde 80 dobles.
Så 80 ganger 8 er 640 bytes informasjon.
Og at samtalen til fread er samle 640 byte med informasjon
fra filen peker til PTR og lagre det nå i arr2.
>> Nå kan vi også behandle fread akkurat som en oppfordring til fgetc.
I dette tilfellet, vi bare prøver å får ett tegn fra filen.
Og vi trenger ikke en matrise for å holde et tegn.
Vi kan bare lagre den i et tegn variabel.
>> Fangsten, skjønt, er at når vi bare har en variabel,
vi trenger å passere i Adressen til den variable
fordi tilbakekalling at første argumentet til fread
er en peker til plasseringen og minne hvor vi ønsker å lagre informasjonen.
Igjen, navnet på en matrise er en peker.
Så vi trenger ikke å gjøre tegnet array.
Men c, tegnet c her, er ikke en matrise.
Det er bare en variabel.
Og så må vi passere en tegnet c for å indikere
at det er den adressen der vi ønsker lagre dette en byte av informasjon,
dette ett tegn på at vi samler fra ptr.
Fwrite-- Jeg vil gå gjennom dette litt mer
quickly-- er ganske mye eksakt tilsvarer fread
bortsett fra det er for skriving i stedet for å lese, bare
som other-- vi har hatt åpent og tett, få en karakter,
skrive et tegn.
Nå er det få vilkårlig Mengden av informasjon,
rett vilkårlig mengde informasjon.
Så akkurat som før, kan vi har en rekke 10 heltall
hvor vi allerede har informasjon som er lagret, kanskje.
>> Det var trolig noen linjer med kode som skal gå mellom disse to
hvor jeg fyller arr med noe meningsfylt.
Jeg fyller den med 10 forskjellige heltall.
Og i stedet, hva jeg er gjør er å skrive fra arr
og samle informasjon fra arr.
Og jeg tar denne informasjonen og la ballen inn i filen.
>> Så i stedet for at det er fra filen til buffer,
vi nå går fra buffer til filen.
Så det er bare det motsatte.
Så igjen, akkurat som før, kan vi har også en haug mengde minne
at vi har dynamisk tildelt og lese fra at
og skriver at til filen.
>> Og vi har også en enkelt variabel stand til å holde en byte
av informasjon, slik som et tegn.
Men igjen, vi trenger å passere i adressen til den variable
når vi ønsker å lese fra den.
Så vi kan skrive ned informasjonen finner vi på denne adressen
til filen pekeren, PTR.
>> Det finnes massevis av andre stor fil I / O-funksjoner
som gjør ulike ting i tillegg de vi har snakket om i dag.
Et par av de du kan finne nyttig
er fgets og fputs, som er tilsvar
av fgetc og fputc men for lesing en enkelt streng fra en fil.
I stedet for en enkelt karakter, det vil lese en hel streng.
fprintf, som i utgangspunktet gjør deg å bruke printf å skrive til fil.
Så akkurat som du kan gjøre variabel substitusjon hjelp
den plassholdere prosent i og prosent d, og så videre, med printf
du kan tilsvarende ta printf streng og print noe
sånn til en fil.
>> fseek-- hvis du har en DVD-spiller er analogien jeg vanligvis bruker her--
er liksom som bruker spole tilbake og spole fremover
knappene for å flytte rundt filmen.
På samme måte kan du flytte rundt på filen.
En av de tingene inne at filstrukturen
at c skaper for deg er en indikator av hvor du er i filen.
Er du helt på begynner, i byte null?
Er du på byte 100, 1000 byte, og så videre?
Du kan bruke fseek å vilkårlig flytte som indikator fremover eller bakover.
>> Og ftell, igjen ligner på en DVD-spiller,
er som en liten klokke som forteller deg hvor mange minutter og sekunder
er i en bestemt film.
Tilsvarende forteller ftell deg hvordan mange bytes du er i filen.
feof er en annen versjon til å oppdage om du har
kommet til slutten av filen.
Og ferror er en funksjon som du kan bruke
å oppdage om noe har gått galt arbeidsmiljø med en fil.
Igjen, dette er bare skrape overflaten.
Det er fremdeles mye mer fil I / O funksjoner i standard io.h.
Men dette vil trolig få deg begynte å jobbe med arkiv pekere.
Jeg er Doug Lloyd.
Dette er CS50.