>> [Muziek]
>> ZAMYLA CHAN: Laten we pakken herstellen.
Recover is waarschijnlijk mijn favoriete PSET, en vooral omdat ik denk dat het
echt, echt cool.
In principe, je krijgt een herinnering kaartsysteem waarin
foto's zijn verwijderd.
Maar wat je gaat doen is ze allemaal te herstellen.
>> OK.
Dus het is echt spannend, maar misschien een beetje intimiderend, want je bent
gegeven een lege C-bestand en je moet het vullen inch
OK, dus laten we breken deze in beheersbare delen.
U wilt openen geheugenkaart bestand.
Dat lijkt eenvoudig genoeg.
Vind dan het begin van een JPG-afbeelding.
Alle bestanden op dit geheugen kaart gaan JPGs zijn.
Dan, zodra je het begin, je gaat naar een nieuwe JPG openen, dat
is, net als, maak een JPG, en schrijven 512 byte in een tijd totdat een nieuwe JPG is
gevonden, en eindigt het programma eenmaal u het einde van het bestand detecteren.
>> Dus eerste stappen eerste is om te openen de geheugenkaart bestand.
Maar je weet dit al, en er is een file I / O-functie die gaat
blijken zeer nuttig.
OK.
Dus wat zijn JPGs?
Want we moeten het begin.
Nou, JPG's, net als bitmaps, zijn sequenties van bytes.
Gelukkig elke JPG begint met ofwel 0xFF, 0xd8, 0xFF, 0xe0, een sequentie
bytes of andere reeks bytes.
>> Dus die vier bytes aan te geven het begin van een JPG.
Niemand minder dan die twee combinaties vier bytes.
En gelukkig voor ons, een ander feit dat we kunnen profiteren van is dat elke
JPG opgeslagen side-by-side op de geheugenkaart.
Ik heb de structuur van een vertegenwoordigd geheugenkaart schematisch dit
schuif hier.
Hier, elke vierkante, elke rechthoek, vertegenwoordigt 512 bytes, en het begint
met een grijze in dat we niet echt een JPG.
>> Maar toen we eindelijk hit een blok met een ster.
Dat betekent dat de eerste vier bytes uit van deze 512 zijn een van deze twee
conferentie sequenties van JPG.
En we gaan van daar, en dan een keer een JPG eindigt, het volgende spel begint.
We hebben nooit meer hebben grijze ruimte ertussen.
>> Maar hoe weten we eigenlijk dit leest, en Lees de 512 bytes, zodat we kunnen maken
de vergelijking van de eerste plaats?
Nou, laten we teruggaan naar fread, die neemt in de structuur die zal bevatten
de bytes die u nu leest.
Dus je gaat zetten die daar -
de grootte, het aantal, en dan inpointer dat je leest uit.
Nu willen we lezen 512 in een tijd, en wij willen dit op te slaan in een buffer,
Ik ga noemen.
>> Kortom, we gaan houden op die 512 bytes en doen
dingen mee doen, toch?
We ofwel gaat vergelijken met de eerste vier bytes, of we gaan
las het in, OK?
Dus dan is de data pointer zal dan dienen als uw buffer, en de
inpointer, nou, dat zal alleen maar naar uw geheugenkaart zijn.
>> Terug naar onze geheugenkaart schema.
We gaan 512 bytes te lezen op een moment, het opslaan van elk 512-byte block
in een buffer, vasthouden aan die buffer, die 512 bytes, totdat we weten
precies wat ze doen.
Dus het begin is niets, dus wij doen de buffer lezen, vergelijken en
zullen we niet nodig om iets te doen.
En dan hebben we eindelijk raakte een ster blokkeren, wat betekent dat we hebben
vonden onze eerste JPG.
Dus de buffer nu vasthouden bytes van die JPG.
>> De volgende keer 512 bytes, omdat ze geen ster blok, zijn ook
deel van die JPG.
En JPG's zijn continu vanaf daar op in, totdat wij slaan de volgende JPG.
En dan is de buffer houdt dan 512 bytes die JPG, en
enzovoort, enzovoort.
OK.
>> Dus zodra je op de eerste ster blok, het eerste JPG, hoe doe je
eigenlijk, goed, openen?
Laten we een nieuwe JPG.
De bestandsnamen voor een JPG gaan in het formaat, aantal, aantal,
number.jpg, in dat ze de naam in de volgorde waarin ze worden gevonden,
beginnend bij 0.
>> Dus de eerste JPG dat u vinden zal 000.jpg.
Dus, waarschijnlijk een goed idee om bij te houden hoeveel JPG's je tot nu toe hebt gevonden.
Dus dat is de bestandsnaam.
Maar hoe doe je dat eigenlijk maken dat?
Nou, we gaan in een functie genaamd sprintf.
Een beetje vergelijkbaar met printf, waar U kunt tijdelijke aanduidingen gebruiken voor strijkers,
behalve in dit geval sprintf afgedrukt het bestand uit in de huidige
directory, niet in de terminal.
>> OK.
Dus hier zien we dat we beschikken over een titel, een char array die zal slaan de
resulterende tekenreeks, en we passeren in de titel in de string met een
placeholder, net als we hebben geleerd te maken met printf.
Maar deze code die ik hier zal 2.jpg, niet 002.jpg geven.
Dus laat ik aan u om uit te vinden hoe te wijzigen van de tijdelijke aanduiding te maken de
juiste naam.
>> OK.
Dus als je eenmaal hebt dan sprintf'd kunt u dat bestand te openen, omdat het bestaat in
uw telefoonboek, met fopen, met behulp van de titel, en dan de modus waarin je wilt
om dat bestand te openen in
Dus nu dat we een nieuwe JPG-bestand hebt geopend, nu kunnen we 512 bytes schrijven op een
tijd, totdat een nieuwe JPG wordt gevonden.
Dus laten we nog eens kijken bij de syntaxis van fwrite.
>> Ik weet dat Ik toon deze dia een veel, maar ik wil gewoon zeker weten dat
jullie krijgen niet te verward, omdat Ik weet dat het heel gemakkelijk om
Verwissel de eerste en de laatste argument name.
Maar vergeet niet dat je aan het schrijven bent van uw buffer in de file afbeeldingen.
>> Nu je weet hoe de afschrijving 512 bytes in je JPG-bestand dat u hebt
gemaakt, goed, we willen stoppen met dat proces zodra we eind hebt bereikt
onze card, omdat er geen meer foto's te vinden.
Dus laten we teruggaan naar fread eens te meer, dat beloof ik.
fread keert hoeveel items van grootte, grootte, waren klaar met succes.
Idealiter is dit gaat worden wat passeer je in voor nummer, toch?
Omdat je probeert om het aantal te lezen van elementen van omvang, grootte.
Maar als fread niet kan lezen die aantal elementen, dan zal het terug
welk nummer het succes lezen.
>> Nu, een belangrijk ding om op te merken is dat als je een ander bestand gebruiken I / O
functie als fgetc, het zal ook terugkeren hoeveel items die het met succes lezen.
Wat is handig over deze functie dat als u functies binnen een
staat, zal het zelf uit te voeren, terwijl bepalen deze voorwaarde, dat
gewoon echt nuttig.
Dus als je deze voorwaarden, laten we zeggen, indien fread buffer, sizeof DOG, 2,
wijzer, gelijk is gelijk aan 1, dat betekent dat ik zou willen lezen
2 honden tegelijkertijd.
Maar als fread returns 1 in plaats van 2 zoals verwacht, dat betekent dat er 2
honden achtergelaten in mijn dossier, maar eerder 1.
Maar als het weer 2, dan heb ik nog steeds die 2 honden in mijn buffer.
>> Dus nu dat geeft je een gevoel van hoe controleert het einde van het bestand, maar
laten we gaan door nu de logica.
Hoe weten we eigenlijk allemaal stuk van deze elementen bij elkaar?
Zodra we raken onze eerste JPG, aangezien we weten dat JPGs zijn opgeslagen
aansluitend, zullen we schrijven tot bereiken we het einde van het kaartsysteem.
Maar we willen niet te schrijven alles wat tot dan toe.
Dus het maakt niet alleen dat we bij het begin van een nieuwe JPG, maar of
we hebben al gevonden een JPG-of niet.
>> Als Het is het begin van een nieuwe JPG, zullen we willen onze huidige JPG bestand als sluiten
we hebben een open en open een nieuwe te schrijven in.
Als het niet het begin van het nieuwe JPG, niettemin, zullen wij het zelfde JPG bestand te houden
openen en schrijven in dat.
We zullen onze buffer in welk schrijven JPG bestand dat we hebben een open, op voorwaarde dat
we hebben open, natuurlijk.
Als we niet hebben gevonden onze eerste JPG toch hebben we niet iets schrijven.
En dit proces gaat door totdat u bereiken het einde van het kaartsysteem.
>> En ten slotte, zult u willen ervoor ervoor dat u alle FSluit
bestanden die u hebt fopened.
Zodra u vertrouwd bent met het bent concepten, neem een ​​kijkje bij enkele
pseudocode, die ik hier heb opgenomen.
Eerst moet je de kaart wilt openen, en herhaal het volgende proces
totdat je hebt bereikt de uiteinde van de kaart.
U wilt 512 bytes lezen in een buffer.
Met behulp van die buffer, zult u wilt controleren of je nu aan het begin van een
nieuwe JPG of niet.
En het antwoord op die vraag zal invloed hebben op uw file management -
welke bestanden u opent, welke die heb je dicht.
>> Dan heb je al een JPG gevonden?
Hoe heb je het houden spoor van dat?
Vervolgens, afhankelijk van dat, zult u ofwel schrijven naar de huidige JPG dat u
hebben geopend, of schrijf het niet helemaal, omdat u nog niet gevonden een JPG.
Tot slot, als je eenmaal hebt het eind bereikt het bestand, wil je elke sluiten
resterende bestanden die u hebt geopend.
We willen hier netjes zijn.
>> En daarmee heb je al hersteld de ontbrekende bestanden van dat geheugen
kaart, die is een pretty amazing feat.
Dus mag je jezelf op de rug.
Maar, er is nog een element aan de PSET, dat is de wedstrijd.
U zult merken dat u alle foto's dat u hersteld bent eigenlijk
foto's van het personeel CS50's.
Dus als je op de campus of ergens buurt, dan kunt u opnamen maken met
het personeel, en de sectie die het heeft de meeste foto's met medewerkers
uit hun herstelde bestanden zal Word een geweldige prijs.
Met dat, dan ben je klaar bent het herstellen PSET.
Mijn naam is Zamyla, en dit is CS50.