>> [MUSIC Playing]
>> ZAMYLA CHAN: Le të trajtuar të shërohen.
Recover është ndoshta PSET im i preferuar, dhe kryesisht për shkak se unë mendoj se është e
me të vërtetë, me të vërtetë cool.
Në thelb, ju jeni duke i dhënë një kujtim kartë fotografi në të cilat
fotografi janë fshirë.
Por ajo që ju jeni do të bëni është të shërohen ato të gjitha.
>> OK.
Pra, është me të vërtetë emocionuese, por ndoshta një pak frikësuese, sepse ju jeni
dhënë një skedar bosh C dhe ju duhet të plotësoni atë in
OK, kështu që le të thyejnë këtë në pjesë të menaxhueshme.
Ju do të dëshironi të hapur kartën e kujtesës fotografi.
Kjo duket mjaft e thjeshtë.
Pastaj, gjeni fillimin i një imazh JPG.
Të gjitha fotografi në këtë kujtim kartë do të jetë JPGs.
Pastaj, sapo ju të gjeni fillimin, ju do të jeni për të hapur një JPG të re, që
është, si, të krijojë një JPG, dhe të shkruani 512 bajt në një kohë deri në një JPG i ri është
gjetur, dhe dhënien fund të programit, një herë ju zbuluar në fund të file.
>> Pra hapat e para të parë është për të hapur fotografi kartën e kujtesës.
Por ju e dini këtë tashmë, dhe nuk ka një file I / O funksion që do të
provojë shumë i dobishëm.
OK.
Pra cilat janë JPGs?
Sepse ne kemi nevojë për të në fillim atë.
E pra, JPGs, ashtu si harta bit, janë vetëm sekuenca të bytes.
Për fat të mirë, çdo JPG fillon me ose 0xff, 0xd8, 0xff, 0xe0, e rend
e bytes, ose një tjetër sekuencë e bytes.
>> Pra, këto katër bytes tregojnë fillimi i një JPG.
Askush tjetër përveç këtyre dy kombinime e katër bytes.
Dhe për fat të mirë për ne, një tjetër fakt që ne mund të përfitojnë nga është se çdo
JPG është ruajtur krah për krah në kartën e kujtesës.
Unë e kam përfaqësuar strukturën e një kartën e kujtesës në mënyrë skematike në këtë
rrëshqitje këtu.
Këtu, çdo katror, ​​çdo drejtkëndësh, përfaqëson 512 bytes, dhe ajo fillon
me një gri në se ne nuk bëjmë me të vërtetë kanë një JPG.
>> Por pastaj ne fund goditi një bllok me një yll.
Kjo do të thotë se katër bytes e para nga nga ata 512 janë një nga ato dy
duke filluar sekuenca e një JPG.
Dhe ne do të shkojmë nga atje, dhe pastaj një herë një JPG përfundon, një tjetër fillon.
Ne kurrë nuk kanë asnjë më shumë hapësirë ​​gri në mes.
>> Por si nuk kemi të vërtetë lexuar këtë, dhe lexoni 512 bytes në mënyrë që ne mund të bëjë
krahasimi vendin e parë?
E pra, le të kthehemi në fread, të cilat merr në struct që do të përmbajë të
e bytes që ju jeni duke lexuar.
Pra, ju jeni duke shkuar për të vënë ata në atje -
madhësia, numri, dhe pastaj inpointer që ju jeni duke lexuar nga.
Tani, ne duam të lexojnë 512 në një kohë, dhe ne duam të ruajtur këtë në një tampon,
Unë jam duke shkuar për të thirrur atë.
>> Në thelb, ne jemi duke shkuar për të mbajtur mbi ato 512 bytes dhe të bëjë
gjërat me atë, e drejtë?
Ne jemi ose do të të krahasuar parë katër bytes, ose ne do të
lexuar atë në, OK?
Pra, atëherë të dhënat akrep do pas shërbejnë si tampon tuaj, dhe
inpointer, mirë, kjo është vetëm do të jetë kartën tuaj të kujtesës.
>> Mbrapsht në kartën e kujtesës tonë skemën.
Ne jemi duke shkuar për të lexuar 512 bytes në një kohë, magazinimin e çdo bllok 512-byte
në një tampon, mbajnë mbi ata tampon, ato 512 bytes, deri sa ne e dimë
saktësisht se çfarë për të bërë ato.
Pra, në fillim nuk është ndonjë gjë, kështu që ne do të lexoni tampon, krahasojnë atë, dhe
ne nuk do të duhet të bëjë asgjë me të.
Dhe pastaj, ne fund goditi një yll të bllokuar, do të thotë se ne kemi
gjetur JPG tonë të parë.
Deri tani tampon mbajë bytes nga ajo JPG.
>> Herën tjetër 512 bytes, sepse ata janë jo një bllok yll, janë gjithashtu
pjesë e atij JPG.
Dhe JPGs janë të vazhdueshme nga atje më në, deri sa ne goditi JPG ardhshëm.
Dhe pastaj tampon pastaj mban 512 bytes për atë JPG, dhe
kështu me radhë, e kështu me radhë.
OK.
>> Pra, një herë ju goditi i pari i stolisur me yje bllok, JPG pari, si ju
në fakt, mirë, të hapur atë?
Le të bëjë një JPG re.
Filenames për një JPG do të të jetë në formatin, numri, numri,
number.jpg, në se ata janë emëruar në mënyrë në të cilën ata janë gjetur,
duke filluar në 0.
>> Pra JPG parë që ju gjeni do të 000.jpg.
Pra, ndoshta një ide e mirë për të mbajtur nën e sa JPGs keni gjetur deri tani.
Pra, kjo është emrin e file.
Por si mund të bëjë në fakt atë?
E pra, ne do të përdorë funksion të quajtur sprintf.
A pak e ngjashme me printf, ku ju mund të përdorni placeholders për vargjet,
përjashtim në këtë rast, sprintf do të shtypura dosja jashtë në tanishme
directory, jo në terminal.
>> OK.
Pra, këtu ne shohim se ne kemi titullin, një koleksion char që do të ruajë
string rezultante, dhe ne të kalojë në Titulli i vargut aktuale me një
placeholder, ashtu si e kemi mësuar të bëjë me printf.
Por kjo kodin që kam këtu do të japë 2.jpg, jo 002.jpg.
Kështu që unë do të iki nga ju për të gjetur se si për të modifikojë kete vend për të bërë
Emri i saktë.
>> OK.
Pra, një herë ju keni sprintf'd atëherë ju mund të të hapur këtë dosje, sepse ajo ekziston në
directory tuaj, me fopen, duke përdorur titullin, dhe më pas çdo gjë mënyra të doni
për të hapur këtë dosje in
Pra, tani që ne kemi hapur një skedë të re JPG, tani ne mund të shkruaj 512 bytes në një
kohë, deri sa një JPG re është gjetur.
Pra, le të marrë një sy në sintaksë e fwrite.
>> Unë e di që unë jam duke treguar këtë rrëshqitje a shumë, por unë vetëm dua të sigurohemi që
ju djema nuk e merrni shumë të hutuar, sepse Unë e di se është shumë e lehtë për të
përzierje deri pari dhe i fundit argumenti, në mënyrë të veçantë.
Por mos harroni se ju jeni me shkrim nga tampon tuaj në imazhet jashtë file.
>> Tani që ju e dini se si shkruaj 512 bytes në dosjen tuaj JPG që e keni
krijuar, mirë, ne duam të ndaluar që Procesi herë ne kemi arritur në fund të
kartë tonë, sepse nuk do të ketë çdo imazhe më shumë për të gjetur.
Pra, le të kthehemi në fread edhe një herë, unë premtoj.
fread kthehet si artikuj shumë të madhësisë, madhësia, ishin të gatshme në sukses.
Në mënyrë ideale, kjo do të jetë çdo gjë ju të kalojë në për numër, apo jo?
Sepse ju jeni duke u përpjekur për të lexuar numrin e elementeve të madhësisë, madhësisë.
Por nëse fread nuk është në gjendje për të lexuar se Numri i elementeve, atëherë ajo do të kthehet
çfarëdo numri është lexuar me sukses.
>> Tani, një gjë e rëndësishme të theksohet është se në qoftë se ju përdorni një skedar I / O
funksion si fgetc, ajo do të kthehet se sa çështje është lexuar me sukses.
Çfarë është e dobishme në lidhje me këtë funksion është se në qoftë se ju përdorni funksionet në brendësi të një
kusht, ajo do të kryej vetë, ndërsa përcaktimin atë kusht që është
vetëm të vërtetë të dobishme.
Pra, nëse ju e keni këtë kushte, të themi, nëse tampon fread, DOG sizeof, 2,
akrep, e barabartë është e barabartë me 1, që do të thotë se unë do të doja të lexuar
2 qentë në atë kohë.
Por në qoftë se fread kthehet me 1 vend të 2 si Pritet, që do të thotë se ka 2
qentë lënë në dosjen time, por më tepër 1.
Por në qoftë se ajo kthehet 2, atëherë unë ende kanë ato 2 qentë brenda e tampon tim.
>> Pra, tani që ju jep një kuptim të asaj se si për të shikoni për në fund të skedarit, por
le të kalojnë nëpër tani logjikën.
Si nuk kemi të vërtetë të kuptuar të gjithë nga këto elemente së bashku?
Pasi të kemi goditur JPG tonë të parë, që nga ne e dimë se JPGs janë ruajtur
pranë njëri tjetrit, ne do të jetë me shkrim deri kemi arritur në fund të dosjen e tyre.
Por ne nuk duam të shkruani çdo gjë deri atëherë.
Pra kjo çështje, jo vetëm që ne jemi në fillimi i një JPG të re, por nëse
ne kemi gjetur tashmë një JPG ose jo.
>> Nëse Është fillimi i një JPG të re, ne do të duan për të mbyllur dosjen tonë të tanishëm JPG nëse
ne kemi një të hapur, dhe të hapur një e re për të shkruar në.
Nëse nuk është fillimi i JPG ri, edhe pse, ne do të vazhdojmë të njëjtën kartelë JPG
të hapur dhe të shkruani në këtë.
Ne do të shkruaj tampon tonë në cilado JPG fotografi ne kemi hapur, me kusht që
ne kemi një Open, natyrisht.
Në qoftë se ne nuk kemi gjetur JPG tonë të parë por, ne nuk shkruaj asgjë.
Dhe ky proces vazhdon deri sa ju arrijë në fund të dosjen e tyre.
>> Dhe së fundi, ju do të dëshironi të bëni të sigurtë që ju fclose ndonjë
fotografi që ju keni fopened.
Pasi të jeni të kënaqur me konceptet, të marrë një vështrim në disa
pseudokod, të cilën unë kam përfshirë këtu.
Së pari, ju doni të hapur dosjen e kartës, dhe pastaj të përsëritur procesin e mëposhtëm
deri sa të keni arritur fundi i kartës.
Ju dëshironi të lexoni 512 bytes në një buffer.
Duke përdorur këtë tampon, ju do të dëshironi të kontrolloni nëse ju jeni në fillim të një
JPG re apo jo.
Dhe përgjigja e kësaj pyetje do të ndikojë në menaxhimin e skedarëve -
cilën fotografi ju hapur, të cilat ato ju mbyllni.
>> Pastaj, a keni gjetur tashmë një JPG?
Si keni qenë mbajtur udhë e se?
Më pas, në varësi të se, ju do ose shkruani në JPG tanishme që ju
kanë hapur, apo jo shkruani atë në të gjitha, sepse ju nuk keni gjetur një JPG ende.
Së fundi, një herë ju keni arritur në fund të fotografi, ju do të dëshironi për të mbyllur ndonjë
fotografi që ju keni hapur mbetur.
Ne duam që të jenë të pastra këtu.
>> Dhe me këtë, ju keni gjetur të gjitha fotografi të humbur nga ai kujtim
kartë, e cila është një feat shumë e mahnitshme.
Pra, pat veten në anën e pasme.
Por, ka një element më shumë për të PSET, e cila është contest.
Ju do të gjeni se të gjitha fotografitë që e keni gjetur të vërtetë janë
fotografitë e stafit CS50-së.
Pra, nëse ju jeni në kampus ose diku pranë, atëherë ju mund të marrë fotografi me
stafit, dhe seksioni që ka shumica e fotografi me anëtarë të stafit
nga dosjet e tyre do të mbulohen të marrë një çmim të tmerrshëm.
Me këtë, atëherë ju keni përfunduar shërohen PSET.
Emri im është Zamyla, dhe kjo është CS50.