>> [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.