[Speel van musiek] ZAMYLA CHAN: Kom ons pak herstel. Herstel is waarskynlik my gunsteling PSET, en veral omdat ek dink dit is regtig, regtig cool. Basies, jy 'n geheue gegee kaart lêer waarin foto's is verwyder. Maar wat jy gaan doen, is hulle almal te herstel. OK. So dit is regtig opwindend, maar miskien 'n bietjie intimiderend, want jy gegee 'n leë C lêer en jy het om dit te vul in OK, so laat breek hierdie in hanteerbare dele. Jy wil oop te maak die geheue kaart lêer. Dit lyk eenvoudig genoeg. Dan vind die begin van 'n JPG-beeld. Al die lêers op die geheue kaart gaan JPG te wees. Dan, wanneer jy vind die begin, jy gaan 'n nuwe JPG oop te maak, sodat is, soos, 'n JPG, en skryf 512 byte op 'n tyd totdat 'n nuwe JPG is gevind, en die beëindiging van die program, een keer jy spoor die einde van die lêer. So eerste stappe eerste is om oop te maak die geheue kaart lêer. Maar jy weet dit reeds, en daar is 'n lêer I / O-funksie wat gaan bewys dat baie nuttig. OK. So, wat is JPG? Omdat ons nodig het om te begin nie. Wel, JPG, net soos bietjie kaarte, is net rye van grepe. Gelukkig, elke JPG begin met óf 0xff wees, 0xd8, 0xff wees, 0xe0, een volgorde grepe, of 'n ander volgorde van grepe. So die vier grepe dui die begin van 'n JPG. Niemand anders as die twee kombinasies vier grepe. En gelukkig vir ons, nog 'n feit dat ons voordeel kan trek, is dat elke JPG gestoor side-by-kant op die geheue kaart. Ek het die struktuur van 'n verteenwoordig geheue kaart skematies op hierdie gly hier. Hier, elke vierkante elke reghoek, verteenwoordig 512 grepe, en dit begin met 'n grys in wat ons doen nie regtig 'n JPG. Maar dan moet ons uiteindelik getref 'n blok met 'n ster. Dit beteken dat die eerste vier grepe uit van daardie 512 is een van die twee begin rye van 'n JPG. En ons gaan van daar af, en dan weer een JPG eindig, is die volgende een begin. Ons moet nooit meer nie grys ruimte tussen-in. Maar hoe weet ons eintlik lees, en Lees die 512 grepe sodat ons kan maak die vergelyking die eerste plek? Wel, laat ons terug na fread gaan, wat neem in die struct wat bevat die grepe wat jy lees. So jy gaan sit diegene in daar - die grootte, die aantal, en dan inpointer dat jy die lees van. Nou, wil ons lees 512 op 'n tyd, en ons wil dit op te slaan in 'n buffer, Ek gaan om dit te noem. Kortom, ons gaan om vas te hou op die 512 grepe en doen dinge met dit, reg? Ons is nie van plan om die eerste te vergelyk vier grepe, of ons gaan Lees dit in, OK? So dan is die data wyser sal dan dien as 'n buffer, en die inpointer, Wel, dit is net gaan jou geheue kaart te wees. Terug na ons geheue kaart skematiese. Ons gaan 512 grepe op 'n tyd om te lees, stoor elke 512-byte blok in 'n buffer, hou op diegene buffer, wat 512 grepe, totdat ons weet presies wat om te doen. So die begin is nie niks nie, so ons sal die buffer te lees, te vergelyk, en sal ons nie nodig om iets te doen met dit. En dan, het ons uiteindelik 'n ster getref blok, wat beteken dat ons gevind dat ons eerste JPG. So het die buffer nou hou grepe uit die JPG. Die volgende keer 512 grepe, want hulle is nie 'n ster blok, is ook deel van daardie JPG. En JPG is deurlopende van daar in, totdat ons getref die volgende JPG. En dan is die buffer dan hou 512 grepe vir die JPG, en so aan, en so meer. OK. So wanneer jy druk op die eerste ster blok, die eerste JPG, hoe kan jy eintlik, wel, dit oop te maak? Kom ons maak 'n nuwe JPG. Die lêername vir 'n JPG gaan in die formaat,, nommer, number.jpg, in dat hulle die naam in die volgorde waarin hulle gevind word, begin by 0. Dus is die eerste JPG dat jy vind sal 000.jpg word. So, waarskynlik 'n goeie idee om tred te hou hoeveel JPG jy tot dusver gevind. So wat is die lêer se naam. Maar hoe kan jy eintlik maak dit? Wel, ons gaan gebruik om 'n funksie genoem sprintf. 'N bietjie soortgelyk aan printf, waar jy kan gebruik plekhouers vir Strykers, behalwe in hierdie geval, sal sprintf druk die lêer uit in die huidige Gids, nie in die terminale. OK. So hier sien ons dat ons 'n titel, 'n kar skikking wat sal die stoor van die gevolglike string, en ons slaag in die titel van die werklike string met 'n bevat, wil ons net het geleer het om te doen met printf. Maar hierdie kode wat ek hier sal 2.jpg, nie 002.jpg gee. So ek sal laat jy om uit te vind hoe om te verander die plekhouer te maak die korrekte naam. OK. So as jy dan sprintf'd het wat jy kan open die lêer nie, want dit bestaan ​​in jou gids, met fopen, met behulp van die titel, en dan net af wat jy wil dat 'n lêer om in te open So nou dat ons 'n nuwe JPG lêer het oopgemaak, nou kan ons op 'n skryf 512 grepe tyd, totdat 'n nuwe JPG gevind word. So kom ons neem 'n ander kyk by die sintaksis van fwrite. Ek weet dat ek wys hierdie skuif 'n baie, maar ek wil net om seker te maak dat julle kry nie te verwar nie, want Ek weet dat dit is baie maklik om te meng die eerste en die laaste argument, in die besonder. Maar onthou dat jy skryf uit jou buffer in die buite-lêer beelde. Nou dat jy weet hoe om die skryf 512 grepe in jou JPG lêer wat jy het geskep het, goed, ons wil om dit te stop proses wanneer ons die einde van bereik het Ons kaart, want daar sal nie meer beelde te vinde nie. So laat ons gaan terug na fread weer, ek belowe. fread terug hoeveel items van grootte, grootte, gereed was suksesvol. Ideaal, is dit gaan wees wat jy slaag in vir die nommer, reg? Omdat jy probeer aantal te lees van die elemente van grootte, grootte. Maar as fread is nie in staat om dit te lees aantal elemente, dan sal dit terugkeer watter getal is dit suksesvol te lees. Nou, 'n belangrike ding om daarop te let is dat as jy 'n ander lêer I / O funksie soos fgetc, sal dit ook terug hoeveel items suksesvol te lees. Wat is nuttig oor hierdie funksie is dat as jy gebruik funksies binnekant van 'n toestand is, sal dit self uit te voer, terwyl die bepaling van die toestand, wat net werklik nuttig. So as jy het hierdie toestande, sê, As fread buffer, sizeof hond, 2, wyser, gelyk is gelyk aan 1, wat beteken dat ek wil om te lees 2 honde by die tyd. Maar as fread terug 1 in plaas van 2 as verwag, beteken dit dat daar 2 honde het in my lêer, maar eerder 1. Maar as dit gee 2, dan het ek nog ' die 2 honde binnekant van my buffer. So nou wat gee jou 'n gevoel van hoe om te gaan vir die einde van die lêer, maar Kom ons gaan deur nou die logika. Hoe weet ons eintlik stuk al van hierdie elemente saam? Sodra ons getref ons eerste JPG, aangesien ons weet dat JPG gestoor contiguously, sal ons skryf word totdat bereik ons ​​die einde van die kaart lêer. Maar ons wil nie om te skryf enigiets tot dan. So dit saak maak, nie net dat ons by die begin van 'n nuwe JPG, maar of Ons het reeds 'n JPG of nie. As dit die begin van 'n nuwe JPG, sal ons wil ons huidige JPG lêer of te sluit ons het een oop, en oop 'n nuwe een in te skryf. As dit is nie die begin van die nuwe JPG, al is, sal ons dieselfde JPG lêer hou oop te maak en skryf in daardie. Ons sal ons buffer te skryf in welke JPG lêer ons het oop, met dien verstande dat ons het een oop, natuurlik. As ons nog nie gevind nie ons eerste JPG nie, moet ons iets skryf nie. En hierdie proses gaan voort totdat jy bereik die einde van die kaart lêer. En uiteindelik, sal jy wil maak seker dat jy fclose enige lêers wat jy het fopened. Sodra jy gemaklik met die konsepte, neem 'n blik op sommige pseudokode, wat ek hier ingesluit. Eerste, wil jy die kaart lêer oop te maak, en dan herhaal die volgende proses totdat jy bereik die einde van die kaart. Jy wil 512 grepe om te lees in 'n buffer. Met behulp van die buffer, sal jy wil om te kyk of jy by die begin van 'n nuwe JPG of nie. En die antwoord op die vraag sal invloed op jou leer bestuur - wat lêers wat jy oopmaak, wat kinders dink jy sluit. Dan, het jy reeds 'n JPG? Hoe het jy is hou spoor van daardie? Dan, afhangende van wat, sal jy óf skryf in die huidige JPG dat jy oop, of nie skryf dit glad nie, omdat jy nie 'n JPG gevind nie. Ten slotte, as jy die einde van bereik die lêer, sal jy wil 'n te sluit oorblywende lêers wat jy het oop. Ons wil hier netjies wees. En met dié, het jy al verhaal die vermiste lêers uit dat die geheue kaart, wat is 'n mooi ongelooflike prestasie. So klop jouself op die rug. Maar, daar is nog 'n element te die PSET, wat is die wedstryd. Jy sal vind dat al die foto's wat jy herstel is eintlik foto's van CS50 se personeel. So as jy op die kampus of iewers naby, dan is jy kan foto's neem met die personeel, en die afdeling wat die die meeste foto's met personeellede van hul verhaal lêers sal kry 'n awesome prys. Met dit, dan is jy klaar die herstel PSET. My naam is Zamyla, en dit is CS50.