>> [За възпроизвеждане на музика]
>> ZAMYLA CHAN: Нека да се справи възстанови.
Възстановяване е може би любимата ми PSET, и най-вече, защото аз мисля, че е
наистина, наистина страхотен.
По принцип, вие сте даде памет картотека, в който
снимки са били изтрити.
Но това, което ти започваш да се направите, е да ги възстанови.
>> OK.
Така че това е наистина вълнуващо, но може би малко смущаваща, защото си
даден празен C файл и трябва да го попълните инча
ОК, така че нека да се разбие в управляеми части.
Вие ще искате да отворите файла на картата с памет.
Това изглежда достатъчно проста.
След това, да намерите началото на JPG изображение.
Всички файлове в тази памет карта ще бъде JPGs.
След това, след като се намери началото, ти започваш да се отвори нов JPG, че
е, като, създайте JPG, и напишете 512 байт на време до нов JPG е
намери, и завършва програмата, след като да открива края на файла.
>> Така че първи стъпки първи е да отворите файла на картата с памет.
Но вие знаете това вече, а има файл I / O функция, която ще
да се окаже много полезно.
OK.
Така че какви са JPGs?
Защото ние трябва да се отначало.
Е, JPGs, точно като битови карти, са само последователности от байтове.
За щастие, всеки започва с JPG или 0xff, 0xd8, 0xff, 0xE0, една последователност
байтове, или друга последователност от байтове.
>> Така че тези четири байта посочват началото на JPG.
Не друг, а тези две комбинации на четири байта.
И за щастие за нас, още един факт, че ние могат да се възползват от е, че всеки
JPG се съхранява страна по страна на картата с памет.
Аз бях представена структурата на карта с памет схематично по този
плъзнете тук.
Тук всеки квадрат, всеки правоъгълник, представлява 512 байта, и започва
със сиво в което ние не знаем наистина има JPG.
>> Но след това ние най-накрая удари блок с една звезда.
Това означава, че първите четири байта място на тези, които 512 са една от тези две
начало последователности на JPG.
И ние ще тръгнем оттам, а след това веднъж един JPG завършва, започва другата.
Ние никога не трябва повече сиво пространство между тях.
>> Но как всъщност се чете това, и прочетете 512 байта, така че ние можем да направим
сравнението на първо място?
Е, нека се върнем към fread, които се в структурата, която ще съдържа
байтове, че сте четене.
Така че ти започваш да се постави онези там -
размера, броя, и после inpointer че сте четене от.
Сега, ние искаме да се чете 512 в даден момент, и ние искаме да се съхранява тази в буфер,
Отивам да го наричат.
>> По принцип, ние ще се слагат върху тези 512 байта и да направим
неща с него, нали?
Ние или ще да се сравни първия четири байта, или отиваме в
Прочетох го в, OK?
Така че след това показалеца на данни след това ще служи като буфер и
inpointer, добре, че просто ще да бъде вашата карта с памет.
>> Назад към нашата схематични карти с памет.
Отиваме да се чете 512 байта в даден момент, съхраняване на всеки 512-байтов блок
в буфер, държейки се за тези, буфер, тези 512 байта, докато ние знаем,
точно какво да ги правя.
Така че в началото не е нищо, така че Ще прочетете буфер, да я сравни, и
ние няма да има нужда да се направи нещо с него.
И тогава, най-накрая удари звезда блокира, което означава, че сме
Намерени първата ни JPG.
Така че буферът сега задръжте байта от този JPG.
>> Следващият път, 512 байта, защото те са не една звезда блок, също са
част от тази JPG.
И JPGs са непрекъснати от там вътре, докато не се удари в следващия JPG.
И тогава буфера тогава притежава 512 байта за това JPG, и
така нататък, и така нататък.
OK.
>> Така че, след като удари първият, означени със звездичка блок, първият JPG, как го правиш
Всъщност, добре, да го отворите?
Да се ​​направи нов JPG.
Имената на файловете за JPG ще да бъде във формат, номер, номер,
number.jpg, в които те са име в реда, в който те се намират,
започвайки от 0.
>> Така че първата JPG вас, че намерите ще бъдат 000.jpg.
Така че, може би е добра идея да следите колко JPGs сте открили досега.
Така че това е името на файла.
Но как всъщност се прави това?
Е, ние отиваме да се използва функция, наречена Оферта номер.
А малко по-подобни на ФОРМАТ, където можете да използвате контейнери за струнни,
освен в този случай, Оферта номер ще отпечата файла навън в ток
директория, не в терминала.
>> OK.
Така че тук ние виждаме, че имаме заглавие, Чар масив, който ще се съхранява на
Полученият стринг, и ние взетите Заглавие на действителния низ с
контейнер, просто ни харесва съм Научих се да правя с ФОРМАТ.
Но този код, който имам тук ще даде 2.jpg, не 002.jpg.
Така че аз ще оставя на вас да разберете как да се модифициране на контейнера да се направи
правилното име.
>> OK.
Така че след като веднъж сте sprintf'd след това можете да отворите този файл, защото тя съществува в
телефонния указател, с FОтваряне на, като се използва титла, а след това по какъвто и начин искате
, за да отворите този файл инча
Така че сега, че сме откри нов JPG файл, сега можем да напишем 512 байта на
време, докато се намери нов JPG.
Така че нека хвърлим още един поглед в синтаксиса на неуспешно.
>> Знам, че аз съм, показващ този слайд много, но аз просто искам да се уверя, че
вие не получават твърде объркани, защото Знам, че е много лесно да се
смесват първия и последния аргумент, по-специално.
Но не забравяйте, че пишеш от Вашата буфер в извън Файл.
>> Сега, че знаете как пиша 512 байтове във вашия JPG файл, че сте
създаден, добре, ние искаме да спрем това процес, след като сте достигнали до края на
нашата карта, защото няма да има повече изображения, за да бъдат намерени.
Така че нека да се върнем към fread още веднъж, обещавам.
fread връща колко много елементи с размер, размер, бяха готови в успешно.
В идеалния случай, това ще бъде независимо минете през за брой, нали?
Защото вие се опитвате да прочетете брой на елементи с размер, размер.
Но ако fread не е в състояние да прочете, че брой елементи, то ще се върне
независимо от броя го прочетете успешно.
>> Сега, едно важно нещо е да се отбележи, е че ако използвате друг файл I / O
функция като fgetc, тя ще се върне колко елемента го прочетете успешно.
Какво е полезно за тази функция е че ако използвате функции вътре в
състояние, то ще се изпълни, докато определяне на това условие, което е
Просто наистина полезно.
Така че, ако имате тези условия, да речем, ако fread буфер, sizeof DOG, 2,
показалеца е равна равно на 1, че означава, че бих искал да прочета
2 кучета по това време.
Но ако fread връща 1 вместо 2 както Очаква се, това означава, че има два
кучета, останали в досието ми, а по-скоро едно.
Но ако той се връща 2, а след това аз все още имам тези две кучета във вътрешността на моя буфер.
>> Така че сега, че ви дава усещане за това как да се проверите за края на файла, но
нека да мине през сега логиката.
Как ние всъщност парче всички на тези елементи заедно?
След като удари първия ни JPG, тъй като ние знаем, че JPGs се съхраняват
Последователно, ние ще се пише до стигаме до края на картотеката.
Но ние не искаме да пиша нещо дотогава.
Така че това е важно, не само, че ние сме най- началото на нов JPG, но дали
ние вече открихме JPG или не.
>> Ако това е началото на нова JPG, ние ще искате да затворите текущата ни JPG файл, ако
имаме един отворен и открит нов, за да пишете в.
Ако това не е началото на нова JPG, макар, че ще се задържи на същото JPG файл
отворите и пишат в това.
Ние ще напишем буфер в зависимост от това кое JPG файл имаме отворени, при условие че
имаме един отворен, разбира се.
Ако не сме намерили нашия първи JPG И все пак, ние не пиша нищо.
И този процес продължава, докато не достигнат края на файла на картата.
>> И накрая, вие ще искате да направите сте сигурни, че всяко неуспешно
файлове, които сте fopened.
След като сте доволни от концепции, да вземе един поглед към някои
pseudocode, които сме включили тук.
Първо, вие искате да отворите файла на картата, и след това се повтаря след процеса
докато сте достигнали край на картата.
Искаш ли да се чете 512 байта в буфер.
Използвайки тази буфер, вие ще искате да проверите независимо дали сте в началото на
нова JPG или не.
И отговорът на този въпрос ще повлияе на управление на файлове -
кои файлове отваряте, които такива ще затворят.
>> След това, вече сте намерили JPG?
Как сте били водене следите на това?
След това, в зависимост от това, или ще напиши в текущия JPG, че сте
са отворени, или не го напиша на всички, защото не са намерили още JPG.
Накрая, след като веднъж сте достигнали до края на файла, вие ще искате да се закрие
Останалите файлове, които сте отворили.
Искаме да бъде подредено тук.
>> И с това, че си възстанови всички липсващите файлове от този спомен
карта, което е доста невероятно постижение.
Така потупа себе си на гърба.
Но, има още един елемент към на PSET, който е на конкурса.
Ще откриете, че всички картини че сте възстановени са всъщност
снимки на персонал CS50-те години.
Така че, ако сте в университета или някъде близо, а след това можете да правите снимки с
на персонала, и частта, която има повечето снимки с членове на персонала
от техните възстановените файлове ще получи едно страхотно награда.
С това, след като сте приключили на се възстанови PSET.
Моето име е Zamyla, и това е CS50.