[Musikgengivelse] ZAMYLA CHAN: Lad os tage fat på fode igen. Recover er nok min favorit PSET, og især fordi jeg synes det er virkelig, virkelig cool. Dybest set, får du en hukommelse kartotek, hvor billeder er blevet slettet. Men hvad du vil gøre, er at inddrive dem alle. OK. Så det er virkelig spændende, men måske en lidt skræmmende, fordi du er givet en tom C-fil og du nødt til at fylde det i. OK, så lad os bryde denne i håndterbare dele. Du ønsker at åbne hukommelseskort fil. Det virker simpelt nok. Derefter finde begyndelsen en JPG-billede. Alle filer på denne hukommelse kort vil være jpgs. Så, når du finde begyndelsen, du kommer til at åbne en ny JPG, at er, ligesom, oprette en JPG, og skriv 512 byte ad gangen, indtil en ny JPG er fundet, og afslutning af programmet, når du detektere slutningen af ​​filen. Så første skridt først er at åbne hukommelseskortet fil. Men du kender det allerede, og der er en fil I / O-funktion, der kommer til vise sig meget nyttig. OK. Så hvad er jpgs? Fordi vi har brug for til starten. Nå, jpgs, ligesom bit kort, er blot sekvenser af byte. Heldigvis starter hver JPG med enten 0xFF, 0xd8, 0xff, 0xE0, én sekvens af bytes, eller en anden sekvens af bytes. Så disse fire bytes angiver starten på en JPG. Andre end de to kombinationer Ingen fire byte. Og heldigvis for os, et andet faktum, at vi kan drage fordel af, at hver JPG lagres side-by-side på hukommelseskortet. Jeg har repræsenteret strukturen af ​​en hukommelseskort skematisk på denne glide her. Her hvert kvadrat, hver rektangel, repræsenterer 512 bytes, og det starter med en grå i, at vi ikke virkelig har en JPG. Men derefter vi endelig ramt en blok med en stjerne. Det betyder, at de første fire bytes ud af de 512 er en af ​​de to start sekvenser af en JPG. Og vi går derfra, og derefter en gang en JPG slutter, den næste begynder. Vi behøver ikke engang nogen mere grå mellemrum imellem. Men hvordan får vi faktisk læst dette, og læse 512 bytes, så vi kan gøre sammenligningen første omgang? Nå, lad os gå tilbage til fread, som tager i struct, der indeholder bytes, du læser. Så du kommer til at sætte dem, der - størrelse, antal og derefter inpointer at du læser fra. Nu ønsker vi at læse 512 ad gangen, og vi ønsker at gemme dette i en buffer, Jeg har tænkt mig at kalde det. Dybest set, vil vi holde på de 512 byte og gøre ting med det, ikke? Vi enten kommer til at sammenligne den første fire bytes, eller vi kommer til at læse det på, okay? Så datapositionsgiveren vil så fungere som din buffer, og inpointer, godt, det er bare at gå at være dit hukommelseskort. Tilbage til vores hukommelseskort skematiske. Vi kommer til at læse 512 bytes ad gangen, lagring hver 512-byte blok ind i en buffer, holder fast dem buffer, de 512 bytes, indtil vi ved præcis hvad de skal gøre dem. Så begyndelsen er ikke noget, så vi vil læse den buffer, sammenligne det, og vi behøver ikke at gøre noget med det. Og så har vi endelig ramt en stjerne blok, hvilket betyder, at vi har fundet vores første JPG. Så bufferen nu holder bytes fra JPG. Næste gang 512 bytes, fordi de er ikke en stjerne-blok, er også del af denne JPG. Og jpgs er kontinuerlige derfra ind, indtil vi ramte den næste JPG. Og så buffer så besidder 512 bytes for at JPG og så videre, og så videre. OK. Så når du rammer den første stjerne blok, den første JPG, hvordan gør du faktisk, ja, åbner den? Lad os lave en ny JPG. Filnavne for en JPG kommer til at være i formatet, tal, tal, number.jpg, i, at de er navngivet i den rækkefølge, hvori de findes, starter ved 0. Så den første JPG, du find blive 000.jpg. Så nok en god idé at holde styr hvor mange jpgs du har fundet indtil videre. Så det er filnavnet. Men hvordan kan du faktisk gøre det? Nå, vi kommer til at bruge en funktion kaldet sprintf. En lille smule ligner printf, hvor kan du bruge pladsholdere for strygere, undtagen i dette tilfælde, vil sprintf udskrive filen ud i den aktuelle mappe, ikke i terminalen. OK. Så her ser vi, at vi har titel, en char array, der gemmer resulterende streng, og vi passerer i titel faktiske strengen med en pladsholder, ligesom vi har lærte at gøre med printf. Men denne kode, som jeg har her vil give 2.jpg ikke 002.jpg. Så jeg vil overlade til dig at finde ud af, hvordan ændre pladsholder for at gøre korrekte navn. OK. Så når du har sprintf'd så kan du åbner filen, fordi det findes i dit bibliotek med fopen, ved hjælp af titel, og derefter den tilstand, du ønsker for at åbne filen i. Så nu, at vi har åbnet en ny JPG-fil, nu kan vi skrive 512 bytes på en gang, indtil en ny JPG er fundet. Så lad os tage endnu et kig på syntaksen i fwrite. Jeg ved, at jeg viser dette dias en meget, men jeg vil bare sørge for, at du fyre ikke får alt for forvirret, fordi Jeg ved, at det er meget nemt at blande det første og det sidste argument i særdeleshed. Men husk, at du skriver fra din buffer ind i de out file billeder. Nu, at du ved, hvordan skrive 512 bytes ind i din JPG-fil, som du har skabt, ja, vi ønsker at stoppe det proces, når vi har nået slutningen af vores kort, fordi der ikke vil være flere billeder, der skal findes. Så lad os gå tilbage til fread en gang mere, det lover jeg. fread returnerer hvor mange elementer af størrelse, størrelse, var klar i med succes. Ideelt set vil dette være, hvad du passerer på for nummer, right? Fordi du forsøger at læse nummer af elementer af størrelse, størrelse. Men hvis fread ikke er i stand til at læse, at række elementer, så det vil vende tilbage uanset nummer det læses med succes. Nu, en vigtig ting at bemærke er at hvis du bruger en anden fil I / O funktion som fgetc, vil det også vende tilbage hvor mange varer det læste med succes. Hvad er nyttigt om denne funktion er at hvis du bruger funktioner inde i en tilstand, vil det udføre sig selv, mens bestemmelse af denne betingelse, som er bare virkelig nyttige. Så hvis du har dette forhold, siger, hvis fread buffer, sizeof DOG, 2, pointer, lig er lig med 1, at betyder, at jeg gerne vil læse 2 hunde på det tidspunkt. Men hvis fread returnerer 1 i stedet for 2 som forventet, det betyder, at der er 2 hunde tilbage i min fil, men snarere 1.. Men hvis det returnerer 2, da jeg stadig har disse 2 hunde inde i min buffer. Så nu, der giver dig en fornemmelse af, hvordan kontrollere, om slutningen af ​​filen, men lad os gå igennem nu logikken. Hvordan kan vi faktisk stykke alle af disse elementer sammen? Når vi ramt vores første JPG, eftersom vi ved, at jpgs gemmes contiguously, vil vi skrive, indtil vi når enden af ​​kortet fil. Men vi ønsker ikke at skrive noget indtil da. Så det betyder noget, ikke blot, at vi er på starten på en ny JPG, men om vi har allerede fundet et JPG eller ej. Hvis det er starten på en ny JPG, vi får ønsker at lukke vores aktuelle JPG fil, hvis vi har en åben og åben en ny til at skrive ind. Hvis det ikke er starten på den nye JPG, selv, vil vi holde den samme JPG-fil åbne og skrive ind. Vi skriver vores buffer ind i alt efter JPG-fil vi har åbent, forudsat at vi har en åben, selvfølgelig. Hvis vi ikke har fundet vores første JPG endnu, vi ikke skrive noget. Og denne proces fortsætter, indtil du nå enden af ​​kortet fil. Og endelig, vil du ønsker at gøre sikker på, at du fclose enhver filer, du har fopened. Når du er fortrolig med den koncepter, tage et kig på nogle pseudokode, som jeg har medtaget her. Først, du ønsker at åbne kortet fil, og derefter gentage følgende proces indtil du har nået enden af ​​kortet. Du ønsker at læse 512 bytes i en buffer. Ved hjælp af denne buffer, vil du ønsker at kontrollere uanset om du er i starten af ​​en ny JPG eller ej. Og svaret på dette spørgsmål vil påvirke din filhåndtering - hvilke filer, du åbner, hvilket dem lukker du. Så har du allerede fundet en JPG? Hvordan har du været at holde styr på det? Derefter afhængigt af dette, vil du enten skrive i det aktuelle JPG du har åbne, eller ikke skrive det på alle, fordi du ikke har fundet en JPG endnu. Endelig, når du har nået slutningen af filen, vil du ønsker at lukke enhver resterende filer, du har åbne. Vi ønsker at være pæn her. Og med det, du har genvundet alle de manglende filer fra at hukommelsen kort, hvilket er en temmelig fantastisk præstation. Så klappe dig selv på ryggen. Men der er endnu et element til den PSET, hvilket er konkurrencen. Du vil opdage, at alle de billeder at du har genvundet faktisk billeder af CS50 personale. Så hvis du er på campus eller andet sted nær, så kan du tage billeder med personalet, og det afsnit, der har den de fleste billeder med ansatte fra deres gendannede filer vil få en awesome præmie. Med det, så har du færdig den genvinde PSET. Mit navn er Zamyla, og det er CS50.