>> [Redare a muzicii]
>> ZAMYLA CHAN: Să aborda recupera.
Recuperarea este, probabil, PSET meu preferat, și, în principal pentru că eu cred că este
foarte, foarte misto.
Practic, esti dat o memorie fișier carte în care
imagini au fost șterse.
Dar ceea ce ai de gând să faceți este să le recupereze.
>> OK.
Deci, este foarte interesant, dar poate o puțin intimidant, pentru că ești
dat un fișier C gol și va trebui să-l umple inch
OK, asa ca hai sa rupe acest în părți ușor de gestionat.
Veți dori să deschideți fișier card de memorie.
Asta pare destul de simplu.
Apoi, găsiți la început a unei imagini JPG.
Toate fișierele de pe aceasta memorie carte vor fi jpgs.
Apoi, odată ce ați găsi la început, ai de gând să deschidă un nou JPG, care
este, cum ar fi, de a crea un JPG, și scrie 512 octet la un moment dat până când un nou JPG este
găsit, și se încheie programul, odată vă detecta sfârșitul fișierului.
>> Astfel primii pași în primul rând este de a deschide fișierul card de memorie.
Dar știți deja acest lucru, și nu e o funcție de fișier I / O care va
dovedi foarte util.
OK.
Deci, ce sunt JPGs?
Pentru că avem nevoie de la început ea.
Ei bine, jpgs, la fel ca și hărți de biți, sunt doar secvențe de bytes.
Din fericire, fiecare JPG începe cu, fie 0xff, 0xd8, 0xff, 0xE0, o secvență
de octeți, sau un alt secvență de octeți.
>> Deci, cele patru octeți indică începutul unui JPG.
Nimeni altul decât cele două combinații de patru octeți.
Și din fericire pentru noi, un alt fapt care ne-am pot profita de este că fiecare
JPG este stocat-side-by-side de pe cardul de memorie.
Am reprezentat structura unei card de memorie schematic în acest
glisați aici.
Aici, fiecare pătrat, fiecare dreptunghi, reprezintă de 512 bytes, și de a începe
cu un gri, în care noi nu facem au într-adevăr un JPG.
>> Dar apoi ne-am lovit în cele din urmă un bloc cu o stea.
Asta înseamnă că primele patru octeți out din cei 512 sunt unul dintre cei doi
începând cu secvențe de un JPG.
Și vom merge de acolo, și apoi o dată unul JPG se termină, începe următoarea.
Noi nu mai avea vreodată spațiu gri în între-.
>> Dar cum am citit de fapt acest lucru, și citiți 512 de bytes, astfel încât să putem face
comparația în primul rând?
Ei bine, să ne întoarcem la fread, care ia în struct care va conține
bytes pe care sunteți de lectură.
Deci, ai de gând să pună cei de acolo -
dimensiunea, numărul, și apoi inpointer că sunteți de lectură de la.
Acum, vrem să citească 512 la un moment dat, și ne-o dorim pentru a stoca acest lucru într-un tampon,
Am de gând să-l numesc.
>> Practic, am de gând să dețină pe aceste 512 octeți și face
lucruri cu ea, nu?
Vom fie de gând să compare primul patru bytes, sau vom
citit-o în, OK?
Deci, atunci indicatorul de date va fi atunci servi drept tampon ta, și
inpointer, bine, care este doar de gând pentru a fi cardul de memorie.
>> Înapoi la schematic nostru card de memorie.
Vom citi 512 octeți la un moment dat, stocarea fiecare bloc de 512 octeți
într-un tampon, care deține pe cei tampon, aceste 512 de bytes, până nu știm
exact ce să le facă.
Deci, la început, nu este nimic, așa vom citi tampon, compara-l, și
nu vom avea nevoie pentru a face ceva cu ea.
Și apoi, ne-am lovit în cele din urmă o stea bloca, ceea ce înseamnă că ne-am
a găsit primul nostru JPG.
Deci tampon acum deține bytes din care JPG.
>> Data viitoare 512 bytes, deoarece acestea sunt nu un bloc de stea, sunt, de asemenea,
o parte din care JPG.
Și jpgs sunt continuu de acolo pe la, până când ne-am lovit la următoarea JPG.
Și apoi tamponul are atunci 512 octeți pentru că JPG, și
așa mai departe, și așa mai departe.
OK.
>> Deci, odată ce te-a lovit primul a jucat bloc, primul JPG, cum a face tu
de fapt, ei bine, se deschide?
Să facem un nou JPG.
Numele fisierelor de un JPG sunt de gând să să fie în formatul, numărul, numărul,
number.jpg, în care acestea sunt numit în ordinea în care se găsesc,
incepand de la 0.
>> Deci, primul JPG vă că găsi va fi 000.jpg.
Deci, probabil, o idee bună pentru a ține evidența de câte JPGs ați găsit până acum.
Deci, asta e numele fișierului.
Dar cum a face tu a face de fapt asta?
Ei bine, am de gând să utilizeze un Funcția numit sprintf.
Un pic similar cu printf, în cazul în care aveți posibilitatea să utilizați substituenți pentru siruri de caractere,
cu excepția cazului în acest caz, sprintf va imprima fișierul afară, în curentul
director, nu în terminal.
>> OK.
Deci, aici vom vedea că avem titlu, o matrice char care va stoca
șir rezultat, și vom trece în titlu din șirul actual cu un
substituent, la fel ca ne-am învățat să fac cu printf.
Dar acest cod pe care o am aici va da 2.jpg, nu 002.jpg.
Deci, voi lăsa să te pentru a afla cum de a modifica substituentul pentru a face
Numele corect.
>> OK.
Deci, odată ce ați sprintf'd atunci puteți deschide acest dosar, pentru că există în
directorul, cu fopen, folosind titlu, și apoi orice mod doriți
pentru a deschide acel fișier inch
Deci, acum că ne-am deschis un nou fișier JPG, acum putem scrie 512 biti la un
timp, până când se găsește un nou JPG.
Deci, haideți să aruncăm o privire la sintaxa de fwrite.
>> Știu că arăt acest slide o lot, dar eu vreau doar să vă asigurați că
voi nu te prea confuz, pentru că Știu că este foarte ușor de
amesteca primul și ultimul argument, în special.
Dar amintiți-vă că sunteți scris de la buffer-ul în imaginile de fișiere afara.
>> Acum, că știți cum scrie 512 octeți în fișier JPG pe care le-ați
a creat, de asemenea, dorim să oprim proces odată ce am ajuns la sfârșitul
cartea noastra, deoarece nu va fi orice mai multe imagini pentru a fi găsit.
Așa că haideți să ne întoarcem la fread o dată mai mult, promit.
fread întoarce cât de multe elemente de dimensiuni, dimensiune, au fost gata în succes.
În mod ideal, acest lucru va fi, indiferent de treci în număr de, corect?
Pentru că sunteți încercarea de a citi număr de elemente de mărime, dimensiune.
Dar dacă fread nu este capabil să citească că număr de elemente, atunci va returna
indiferent de numărul citit-o cu succes.
>> Acum, un lucru important de reținut este că, dacă utilizați un alt fișier I / O
funcție ca fgetc, va reveni, de asemenea, cât de multe elemente citit-o cu succes.
Ce-i utile despre această funcție este că, dacă utilizați funcții în interiorul unei
condiție, se va executa în timp ce a determina această condiție, care este
doar într-adevăr util.
Deci, dacă aveți aceste condiții, să zicem, dacă tampon fread, DOG sizeof, 2,
pointer, egal este egal cu 1, care înseamnă că mi-ar place să citesc
2 câini la momentul.
Dar dacă fread returnează 1 în loc de 2 ca așteptat, ceea ce înseamnă că există 2
câini plecat în dosarul meu, ci mai degrabă 1.
Dar dacă se întoarce 2, atunci mai am aceste 2 câini din interiorul tampon mea.
>> Deci, acum, care vă oferă un sentiment de modul în care a verifica pentru sfârșitul fișierului, dar
Să mergem acum prin logica.
Cum ne-am pune cap de fapt, toate dintre aceste elemente împreună?
După ce ne-am lovit prima JPG, deoarece știm că JPGs sunt stocate
adiacent, vom fi scris până vom ajunge la sfârșitul fișierului cardului.
Dar nu vrem să scrie nimic până atunci.
Deci, nu contează, nu numai că suntem la începutul unui nou JPG, ci dacă
am găsit deja un JPG sau nu.
>> Dacă Este începutul unui nou JPG, vom Vreau să închidă dosarul nostru JPG curent dacă
avem un deschis, și deschis un nou o pentru a scrie în.
În cazul în care nu este începutul unui nou JPG, deși, vom păstra același fișier JPG
deschidă și să scrie în asta.
Vom scrie tampon noastră în funcție de Fișier JPG ne-am deschis, cu condiția ca
avem unul deschis, desigur.
Dacă nu ne-am găsit primul nostru JPG cu toate acestea, noi nu scriu nimic.
Și acest proces va continua până când ajunge la sfârșitul fișierului cardului.
>> Și, în sfârșit, veți dori să facă vă că fclose orice
fișierele pe care le-ați fopened.
După ce te confortabil cu concepte, să ia o privire la unele
pseudocod, pe care le-am inclus aici.
În primul rând, doriți să deschideți fișierul de carte, și apoi repetați procesul următor
până când ați ajuns la capăt al cardului.
Doriți să citiți 512 octeți într-un buffer.
Folosind ca tampon, veți dori să verificați chiar daca esti la inceputul unei
noi JPG sau nu.
Și răspunsul la această întrebare va afecta management de fișiere -
care fișierele pe care le deschide, care cei ai închide.
>> Apoi, ați găsit deja un JPG?
Cum ați fost păstrarea piesa de asta?
Apoi, în funcție de care, veți fie scrie în JPG curent pe care îl
au deschis, sau nu scrie deloc, pentru că nu au găsit un JPG încă.
În cele din urmă, odată ce ați ajuns la sfârșitul fișierul, veți dori să închidă orice
fișierele pe care le au rămas deschise.
Vrem să fie curat aici.
>> Și cu asta, te-ai recuperat toate fișierele lipsă din acea memorie
carte, care este un feat destul de uimitor.
Deci, bate-te pe spate.
Dar, există un element mai mult de PSET, care este concursul.
Veți găsi că toate imaginile care le-am recuperat sunt de fapt
poze ale personalului CS50 lui.
Deci, dacă sunteți în campus sau undeva în apropiere, atunci aveți posibilitatea să faceți fotografii cu
personal, și secțiunea care are cele mai multe fotografii cu membri ai personalului
din fișierele lor recuperate vor obține un premiu minunat.
Cu care, atunci ați terminat recupera PSET.
Numele meu este Zamyla, iar acest lucru este CS50.