[Musikk spilles] ZAMYLA CHAN: La oss takle gjenopprette. Recover er nok min favoritt PSett, og i hovedsak fordi jeg tror det er virkelig, virkelig kult. I utgangspunktet får du et minne kort fil der bildene har blitt slettet. Men hva du skal gjøre er å gjenopprette dem alle. OK. Så det er veldig spennende, men kanskje en Litt skremmende, fordi du er gitt en tom C-fil og du må fylle det i. OK, så la oss bryte dette i håndterbare deler. Det er lurt å åpne minnekort fil. Det virker enkelt nok. Deretter finne begynnelsen av et JPG-bilde. Alle filene på dette minnet kortet kommer til å være JPG. Deretter, når du finner i begynnelsen, du kommer til å åpne en ny JPG, at er liksom lage en JPG, og skrive 512 byte om gangen til en ny JPG er funnet, og avslutte programmet, en gang du detektere slutten av filen. Så første skritt første er å åpne minnekort filen. Men du vet dette allerede, og det er en fil I / O-funksjon som kommer til å vise seg svært nyttig. OK. Så hva er JPG? Fordi vi trenger til begynnelsen det. Vel, JPG, akkurat som punktmatriser er bare sekvenser av bytes. Heldigvis begynner med enten hver JPG 0xff, 0xd8, 0xff, 0xE0, en sekvens av byte, eller en annen sekvens av bytes. Så de fire byte indikere starten på en JPG. Ingen andre enn de to kombinasjoner av fire byte. Og heldigvis for oss, en annen at vi kan dra nytte av er at hver JPG lagres side ved side på minnekortet. Jeg har representert strukturen i en minnekort skjematisk på denne skyv her. Her, hvert kvadrat, hver rektangel, representerer 512 bytes, og det begynner med en grå i at vi ikke virkelig har en JPG. Men da vi endelig traff en blokk med en stjerne. Det betyr at de fire første byte ut av de 512 er en av de to starter sekvenser av et JPG. Og vi går derfra, og deretter en gang ett JPG ender, den neste begynner. Vi trenger aldri noe mer grå plass i mellom. Men hvordan gjør vi faktisk leser dette, og lese 512 bytes, slik at vi kan gjøre sammenligningen utgangspunktet? Vel, la oss gå tilbake til fread, som tar i struct som skal inneholde byte som du leser. Så du kommer til å sette de i det - størrelse, antall, og deretter inpointer at du leser fra. Nå ønsker vi å lese 512 om gangen, og vi ønsker å lagre denne i en buffer, Jeg kommer til å kalle det. I utgangspunktet skal vi holde på de 512 bytes og gjøre ting med det, ikke sant? Vi er enten kommer til å sammenligne den første fire byte, eller vi kommer til å lese den i, OK? Så da datapekeren vil da tjene som en buffer, og den inpointer, vel, det er bare å gå å være minnekortet. Tilbake til vår minnekort skjematisk. Vi kommer til å lese 512 bytes om gangen, lagring av hver 512-byte blokker inn i en buffer, som holder dem ut mot buffer, de 512 bytes, før vi vet nøyaktig hva du skal gjøre dem. Så begynnelsen er ikke noe, så vi vil lese buffer, sammenligne det, og vi trenger ikke å gjøre noe med det. Og da vi endelig traff en stjerne blokkere, noe som betyr at vi har funnet vår første JPG. Så bufferen nå holder byte fra at JPG. Neste gang 512 bytes, fordi de er ikke en stjerneblokk har også vist en del av det JPG. Og JPG er kontinuerlig derfra på i, før vi treffer den neste JPG. Og så buffer deretter holder 512 byte for at JPG, og så videre, og så videre. OK. Så når du treffer den første stjerne blokk, den første JPG, hvordan gjør du faktisk, vel, åpne den? La oss lage en ny JPG. Filnavnene for en JPG skal være i formatet, nummer, antall, number.jpg, ved at de er navngitt i i hvilken rekkefølge de blir funnet, starter på 0. Så den første JPG at du finn vil bli 000.jpg. Så, sannsynligvis en god ide å holde styr av hvor mange JPGs du har funnet så langt. Så det er filnavnet. Men hvordan gjør du faktisk gjør det? Vel, skal vi bruke en funksjon kalt sprintf. Litt lik printf, hvor du kan bruke plassholdere for strykere, bortsett fra i dette tilfellet vil sprintf skrive fila ut i den aktuelle katalog, ikke inn i terminalen. OK. Så her ser vi at vi har tittel, en char array som vil lagre resulterende strengen, og vi passerer i Tittelen på selve strengen med en plassholder, akkurat som vi har lært å gjøre med printf. Men denne koden som jeg har her vil gi 2.jpg, ikke 002.jpg. Så jeg skal overlate til deg å finne ut hvordan du endre plassholderen for å gjøre riktig navn. OK. Så når du har sprintf'd så du kan åpne denne filen, fordi den finnes i katalogen, med fopen, ved hjelp av tittel, og deretter det modus du vil å åpne denne filen i. Så nå som vi har åpnet en ny JPG-fil, nå kan vi skrive 512 bytes på en tid, inntil en ny JPG er funnet. Så la oss ta en titt på syntaksen til fwrite. Jeg vet at jeg viser dette lysbildet et mye, men jeg vil bare være sikker på at dere ikke blir for forvirret, fordi Jeg vet at det er veldig lett å blande opp den første og den siste argument, spesielt. Men husk at du skriver fra buffer i de ut fil bildene. Nå som du vet hvordan det skrive 512 byte inn i JPG-fil som du har opprettet, vel, ønsker vi å stoppe at prosess når vi har nådd slutten av våre kort, fordi det ikke vil være noen flere bilder for å bli funnet. Så la oss gå tilbake til fread enda en gang, jeg lover. fread returnerer hvor mange elementer av størrelse, størrelse, var klar i vellykket. Ideelt sett er dette kommer til å bli hva du passerer inn for tall, ikke sant? Fordi du prøver å lese nummer av elementene i størrelse, størrelse. Men hvis fread er ikke i stand til å lese det antall elementer, så det vil returnere uansett hvor mange det ble lest. Nå, er en viktig ting å merke seg at hvis du bruker en annen fil I / O funksjon som fgetc, vil det også gå tilbake hvor mange elementer det ble lest. Hva er nyttig om denne funksjonen er at hvis du bruker funksjoner på innsiden av en tilstand, vil det starte seg selv mens bestemmelse av den tilstand, som er bare veldig nyttig. Så hvis du har dette forhold, sier, hvis fread buffer, sizeof DOG, 2, pekeren, lik lik en, som betyr at jeg har lyst til å lese 2 hunder på den tiden. Men hvis fread returnerer ett i stedet for to som forventes, det betyr at det er to hunder igjen i min fil, men snarere en. Men hvis det returnerer 2, så jeg har fortsatt disse to hunder inne av min buffer. Så nå som gir deg en følelse av hvordan du check for slutten av filen, men la oss gå gjennom nå logikken. Hvordan gjør vi faktisk sette alle av disse elementene sammen? Når vi treffer vår første JPG, siden vi vet at JPG er lagret contiguously, vi skal skrive før vi kommer til enden av kortet filen. Men vi ønsker ikke å skrive noe før da. Så det er viktig, ikke bare at vi er på starten på en ny JPG, men om Vi har allerede funnet en JPG eller ikke. Hvis det er starten på en ny JPG, vil vi ønsker å lukke våre nåværende JPG-fil hvis Vi har én åpen og åpen en ny en til å skrive inn. Hvis det ikke er starten på den nye JPG, skjønt, vil vi beholde den samme JPG-fil åpne og skrive inn det. Vi skal skrive vår buffer inn i hvilken som helst JPG-fil vi har åpent, forutsatt at vi har en åpen, selvfølgelig. Hvis vi ikke har funnet vår første JPG ennå har vi ikke skrive noe. Og denne prosessen fortsetter til du kommer til enden av kortet filen. Og til slutt, vil du ønsker å gjøre sikker på at du fclose noen filer som du har fopened. Når du er komfortabel med konsepter, ta en titt på noen pseudo, som jeg har tatt med her. Først ønsker du å åpne kortfilen, og deretter gjenta følgende prosess til du har nådd enden av kortet. Du ønsker å lese 512 bytes inn i en buffer. Bruke som buffer, vil du ønsker å sjekke enten du er i starten av en ny JPG eller ikke. Og svaret på det spørsmålet vil påvirke din filbehandling - hvilke filer du åpner, som de du lukker. Da har du allerede funnet et JPG? Hvor har du vært å holde styr på det? Deretter, avhengig av det, vil du enten skrive inn den aktuelle JPG at du har åpent, eller ikke skrive det i det hele tatt, fordi du ikke har funnet en JPG ennå. Til slutt, når du har nådd slutten av filen, vil du ønsker å stenge ethvert gjenværende filer som du har åpne. Vi ønsker å være ryddig her. Og med det, har du gjenopprettet alle de manglende filer fra dette minnet kort, som er en ganske utrolig prestasjon. Så klapp deg selv på ryggen. Men, det er enda en del å den PSett, som er den konkurransen. Du vil finne at alle bildene at du har gjenopprettet er faktisk bilder av CS50 ansatte. Så hvis du er på campus eller sted nær, så kan du ta bilder med de ansatte, og den delen som har de fleste bildene med ansatte fra sine gjenopprettede filer vil få en fantastisk premie. Med det, så du er ferdig gjenvinn PSett. Mitt navn er Zamyla, og dette er CS50.