>> [MUSIK SPELA]
>> ZAMYLA CHAN: Låt oss ta itu med återhämta sig.
Recover är nog min favorit PSET, och främst för att jag tycker det är
riktigt, riktigt coolt.
I grund och botten, du får ett minne kort fil där
bilder har raderats.
Men vad du ska göra är att återvinna dem alla.
>> OK.
Så det är verkligen spännande, men kanske lite skrämmande, eftersom du är
ges en tom C-fil och du måste fylla den i.
OK, så låt oss bryta detta i hanterbara delar.
Du vill öppna minneskort fil.
Det verkar enkelt nog.
Sedan, gå till början av en JPG-bild.
Alla filer på detta minne kort kommer att vara JPG.
Sedan, när du hittar början, du kommer att öppna en ny JPG, att
är, liksom, skapa en JPG, och skriva 512 byte i taget tills en ny JPG är
hittats, och att programmet har avslutats, när du upptäcker slutet på filen.
>> Så första stegen först är att öppna minneskortet filen.
Men du vet detta redan, och det finns en fil I / O-funktion som kommer att
vara mycket användbar.
OK.
Så vad är jpgs?
Därför att vi måste början den.
Tja, jpgs, precis som bitmappar, är bara sekvenser av byte.
Lyckligtvis varje JPG börjar med antingen 0xff, 0xd8, 0xff, 0xe0, en sekvens
av byte, eller en annan bytesekvensen.
>> Så de fyra byte anger början på en JPG.
Annat än dessa två kombinationer Inga av fyra byte.
Och lyckligtvis för oss, en annan att vi kan dra nytta av är att varje
JPG lagras sida vid sida på minneskortet.
Jag har representerat strukturen i en minneskort schematiskt på detta
Skjut här.
Här, varje torg, varje rektangel, representerar 512 byte, och det börjar
med en grå i att vi inte verkligen har en JPG.
>> Men så till slut slog vi ett block med en stjärna.
Det innebär att de första fyra bytes ut av dem 512 är en av de som två
börjar sekvenser av en JPG.
Och vi går därifrån, och sedan en gång en JPG slutar, nästa börjar.
Vi behöver aldrig mer grått utrymme i-mellan.
>> Men hur vi faktiskt läser detta, och läs 512 byte så att vi kan göra
jämförelsen första hand?
Nåväl, låt oss gå tillbaka till fread, vilket tar i struct som kommer att innehålla
de byte som du läser.
Så du kommer att sätta de i det -
storlek, antal, och sedan inpointer att du läser från.
Nu vill vi läsa 512 åt gången, och vi vill lagra detta i en buffert,
Jag ska kalla det.
>> I grund och botten, vi kommer att hålla på de 512 byte och göra
saker med det, eller hur?
Vi ska antingen kommer att jämföra den första fyra byte, eller vi ska
läste det i, OK?
Så då datapekaren kommer då fungera som din buffert, och
inpointer, ja, det är bara att gå vara minneskortet.
>> Tillbaka till vårt minneskort schema.
Vi kommer att läsa 512 byte i taget, lagra alla 512-byte blocket
in i en buffert, hålla på dem buffert, de 512 byte, tills vi vet
exakt vad de ska göra dem.
Så i början är inte något, så Vi ska läsa bufferten, jämföra det, och
Vi behöver inte göra något med det.
Och då, äntligen slog vi en stjärna blockera, vilket innebär att vi har
hittade vår första JPG.
Så bufferten nu håller byte från det JPG.
>> Nästa gång 512 byte, eftersom de är inte en stjärna blocket, också är
en del av denna JPG.
Och jpgs är kontinuerliga däri på i, tills vi träffade nästa JPG.
Och då bufferten håller sedan 512 byte för att JPG, och
så vidare, och så vidare.
OK.
>> Så när du träffar den första stjärnmärkta blocket, den första JPG, hur gör du
faktiskt, ja, öppna den?
Låt oss göra en ny JPG.
Filnamnen för en JPG ska vara i det formatet, antal, nummer,
number.jpg, i att de är namngiven i den ordning i vilken de finns,
med början på 0.
>> Så den första JPG som du hitta kommer 000.jpg.
Så, förmodligen en bra idé att hålla koll hur många jpgs du har hittat hittills.
Så det är filnamnet.
Men hur gör man egentligen göra det?
Nåväl, vi kommer att använda en Funktionen kallas sprintf.
Lite liknar printf, där du kan använda platshållare för stråkar,
förutom att i detta fall kommer sprintf ut filen ut i den aktuella
katalog, inte in i terminalen.
>> OK.
Så här ser vi att vi har titel, en char array som kommer att lagra de
resulte sträng, och vi passerar på Titeln på den färdiga strängen med en
platshållare, precis som vi har lärt sig att göra med printf.
Men denna kod som jag har här ger 2.jpg, inte 002.jpg.
Så jag lämnar till dig att ta reda på hur man ändra platshållaren för att göra
rätt namn.
>> OK.
Så när du har sprintf'd då du kan öppna filen, eftersom den existerar i
din katalog, med fopen, med hjälp av titel, och sedan vad läge du vill
öppna filen i.
Så nu när vi har öppnat en ny JPG-fil, Nu kan vi skriva 512 byte vid en
tid, till dess att en ny JPG hittas.
Så låt oss ta en titt vid syntax fwrite.
>> Jag vet att jag visar denna bild en mycket, men jag vill bara se till att
ni får inte alltför förvirrad, eftersom Jag vet att det är mycket lätt att
blanda upp den första och den sista argument, i synnerhet.
Men kom ihåg att du skriver från din buffert i ut filen bilderna.
>> Nu när du vet hur skriv-512 bytes in din JPG-fil som du har
skapat, bra, vi vill stoppa det process när vi har kommit till slutet av
våra kort, eftersom det inte kommer att finnas några fler bilder som finns.
Så låt oss gå tillbaka till fread en gång, jag lovar.
fread returnerar hur många objekt av storlek, storlek, var redo att framgångsrikt.
Helst detta kommer att bli allt du skickar in för nummer, eller hur?
Eftersom du försöker läsa nummer av element av storlek, storlek.
Men om fread inte kan läsa det antal element, då det kommer tillbaka
oavsett nummer det läser framgångsrikt.
>> Nu är en viktig sak att notera att om du använder en annan fil I / O
fungerar som fgetc, kommer det också tillbaka hur många objekt det läste framgångsrikt.
Vad är bra om den här funktionen är att om du använder funktioner inne i en
skick, det ska själv utföra medan bestämma detta villkor, vilket är
bara riktigt användbart.
Så om du har detta villkor, säg, om fread buffert, sizeof DOG, 2,
pekare, är lika med är lika med 1, att betyder att jag vill läsa
2 hundar på den tiden.
Men om fread returnerar en istället för två som väntat, innebär det att det finns 2
hundar kvar i min fil, utan snarare 1.
Men om den returnerar 2, då jag fortfarande har dessa två hundar inuti min buffert.
>> Så nu som ger dig en känsla för hur man kontrollera för slutet av filen, men
vi går igenom nu logiken.
Hur vi faktiskt pussla alla av dessa element?
När vi träffade vår första JPG, eftersom vi vet att jpgs lagras
intill varandra, kommer vi att skriva till vi når slutet på kort fil.
Men vi vill inte skriva något förrän dess.
Så det spelar roll, inte bara att vi är på början på en ny JPG, men om
Vi har redan hittat en JPG eller inte.
>> Om det är början på en ny JPG, vi ska vill stänga vårt nuvarande JPG-fil om
vi har en öppen och öppen en ny för att skriva in.
Om det inte är början på den nya JPG, Men ska vi hålla samma JPG-fil
öppna och skriva in det.
Vi ska skriva vår buffert i vilket som JPG-fil som vi har öppet, under förutsättning att
Vi har en öppen, förstås.
Om vi ​​inte har hittat vår första JPG Ännu vet vi inte skriva något.
Och denna process fortsätter tills du nå slutet på kort fil.
>> Och slutligen, kommer du vill göra Se till att du fclose någon
filer som du har fopened.
När du är bekväm med det begrepp, ta en titt på några
pseudokod, som jag har tagit med här.
Först vill du öppna kort fil, och sedan upprepa följande process
tills du har nått den änden av kortet.
Du vill läsa 512 bytes in i en buffert.
Med hjälp av denna buffert, kommer du vill kontrollera oavsett om du är i början av en
ny JPG eller inte.
Och svaret på den frågan kommer påverka din filhantering -
vilka filer som du öppnar, vilket kära ni stänger.
>> Då har du redan fått JPG?
Hur har ni hållit reda på det?
Sedan, beroende på det, kommer du antingen skriva in den aktuella JPG som du
har öppet, eller inte skriva det alls, eftersom du inte har hittat en JPG ännu.
Slutligen, när du har nått slutet av filen, men du vill stänga alla
resterande filer som du har öppna.
Vi vill vara snyggt här.
>> Och med det, du har återhämtat alla de saknade filerna från att minnet
kort, vilket är en ganska fantastisk bedrift.
Så klappa dig själv på ryggen.
Men det finns ytterligare en faktor till den PSET, som är tävlingen.
Du kommer att upptäcka att alla bilder att du har återhämtat sig faktiskt
bilder av CS50 personal.
Så om du är på campus eller någonstans nära, då kan du ta bilder med
personal, och den sektion som har de de flesta bilder med personal
från sin återvunna filer kommer få en fantastisk vinst.
Med det, då du är klar återvinnings PSET.
Mitt namn är Zamyla, och detta är CS50.