1 00:00:00,000 --> 00:00:09,780 >> [За възпроизвеждане на музика] 2 00:00:09,780 --> 00:00:11,150 >> ZAMYLA CHAN: Нека да се справи възстанови. 3 00:00:11,150 --> 00:00:14,030 Възстановяване е може би любимата ми PSET, и най-вече, защото аз мисля, че е 4 00:00:14,030 --> 00:00:15,650 наистина, наистина страхотен. 5 00:00:15,650 --> 00:00:19,040 По принцип, вие сте даде памет картотека, в който 6 00:00:19,040 --> 00:00:20,900 снимки са били изтрити. 7 00:00:20,900 --> 00:00:23,650 Но това, което ти започваш да се направите, е да ги възстанови. 8 00:00:23,650 --> 00:00:24,250 >> OK. 9 00:00:24,250 --> 00:00:28,230 Така че това е наистина вълнуващо, но може би малко смущаваща, защото си 10 00:00:28,230 --> 00:00:32,430 даден празен C файл и трябва да го попълните инча 11 00:00:32,430 --> 00:00:36,250 ОК, така че нека да се разбие в управляеми части. 12 00:00:36,250 --> 00:00:38,160 Вие ще искате да отворите файла на картата с памет. 13 00:00:38,160 --> 00:00:39,900 Това изглежда достатъчно проста. 14 00:00:39,900 --> 00:00:43,030 След това, да намерите началото на JPG изображение. 15 00:00:43,030 --> 00:00:46,740 Всички файлове в тази памет карта ще бъде JPGs. 16 00:00:46,740 --> 00:00:50,840 След това, след като се намери началото, ти започваш да се отвори нов JPG, че 17 00:00:50,840 --> 00:00:57,610 е, като, създайте JPG, и напишете 512 байт на време до нов JPG е 18 00:00:57,610 --> 00:01:02,930 намери, и завършва програмата, след като да открива края на файла. 19 00:01:02,930 --> 00:01:06,400 >> Така че първи стъпки първи е да отворите файла на картата с памет. 20 00:01:06,400 --> 00:01:09,850 Но вие знаете това вече, а има файл I / O функция, която ще 21 00:01:09,850 --> 00:01:12,030 да се окаже много полезно. 22 00:01:12,030 --> 00:01:12,820 OK. 23 00:01:12,820 --> 00:01:14,760 Така че какви са JPGs? 24 00:01:14,760 --> 00:01:16,330 Защото ние трябва да се отначало. 25 00:01:16,330 --> 00:01:21,310 Е, JPGs, точно като битови карти, са само последователности от байтове. 26 00:01:21,310 --> 00:01:30,660 За щастие, всеки започва с JPG или 0xff, 0xd8, 0xff, 0xE0, една последователност 27 00:01:30,660 --> 00:01:33,610 байтове, или друга последователност от байтове. 28 00:01:33,610 --> 00:01:37,250 >> Така че тези четири байта посочват началото на JPG. 29 00:01:37,250 --> 00:01:40,780 Не друг, а тези две комбинации на четири байта. 30 00:01:40,780 --> 00:01:44,840 И за щастие за нас, още един факт, че ние могат да се възползват от е, че всеки 31 00:01:44,840 --> 00:01:48,550 JPG се съхранява страна по страна на картата с памет. 32 00:01:48,550 --> 00:01:52,210 Аз бях представена структурата на карта с памет схематично по този 33 00:01:52,210 --> 00:01:53,310 плъзнете тук. 34 00:01:53,310 --> 00:01:59,270 Тук всеки квадрат, всеки правоъгълник, представлява 512 байта, и започва 35 00:01:59,270 --> 00:02:01,750 със сиво в което ние не знаем наистина има JPG. 36 00:02:01,750 --> 00:02:05,700 >> Но след това ние най-накрая удари блок с една звезда. 37 00:02:05,700 --> 00:02:10,940 Това означава, че първите четири байта място на тези, които 512 са една от тези две 38 00:02:10,940 --> 00:02:13,230 начало последователности на JPG. 39 00:02:13,230 --> 00:02:17,340 И ние ще тръгнем оттам, а след това веднъж един JPG завършва, започва другата. 40 00:02:17,340 --> 00:02:20,990 Ние никога не трябва повече сиво пространство между тях. 41 00:02:20,990 --> 00:02:25,550 >> Но как всъщност се чете това, и прочетете 512 байта, така че ние можем да направим 42 00:02:25,550 --> 00:02:27,500 сравнението на първо място? 43 00:02:27,500 --> 00:02:33,470 Е, нека се върнем към fread, които се в структурата, която ще съдържа 44 00:02:33,470 --> 00:02:34,470 байтове, че сте четене. 45 00:02:34,470 --> 00:02:36,570 Така че ти започваш да се постави онези там - 46 00:02:36,570 --> 00:02:42,192 размера, броя, и после inpointer че сте четене от. 47 00:02:42,192 --> 00:02:49,900 Сега, ние искаме да се чете 512 в даден момент, и ние искаме да се съхранява тази в буфер, 48 00:02:49,900 --> 00:02:50,700 Отивам да го наричат. 49 00:02:50,700 --> 00:02:54,100 >> По принцип, ние ще се слагат върху тези 512 байта и да направим 50 00:02:54,100 --> 00:02:55,500 неща с него, нали? 51 00:02:55,500 --> 00:02:58,260 Ние или ще да се сравни първия четири байта, или отиваме в 52 00:02:58,260 --> 00:02:59,830 Прочетох го в, OK? 53 00:02:59,830 --> 00:03:05,050 Така че след това показалеца на данни след това ще служи като буфер и 54 00:03:05,050 --> 00:03:07,745 inpointer, добре, че просто ще да бъде вашата карта с памет. 55 00:03:07,745 --> 00:03:09,500 >> Назад към нашата схематични карти с памет. 56 00:03:09,500 --> 00:03:14,690 Отиваме да се чете 512 байта в даден момент, съхраняване на всеки 512-байтов блок 57 00:03:14,690 --> 00:03:19,190 в буфер, държейки се за тези, буфер, тези 512 байта, докато ние знаем, 58 00:03:19,190 --> 00:03:22,000 точно какво да ги правя. 59 00:03:22,000 --> 00:03:25,960 Така че в началото не е нищо, така че Ще прочетете буфер, да я сравни, и 60 00:03:25,960 --> 00:03:28,160 ние няма да има нужда да се направи нещо с него. 61 00:03:28,160 --> 00:03:32,030 И тогава, най-накрая удари звезда блокира, което означава, че сме 62 00:03:32,030 --> 00:03:33,630 Намерени първата ни JPG. 63 00:03:33,630 --> 00:03:36,560 Така че буферът сега задръжте байта от този JPG. 64 00:03:36,560 --> 00:03:40,220 >> Следващият път, 512 байта, защото те са не една звезда блок, също са 65 00:03:40,220 --> 00:03:41,740 част от тази JPG. 66 00:03:41,740 --> 00:03:47,630 И JPGs са непрекъснати от там вътре, докато не се удари в следващия JPG. 67 00:03:47,630 --> 00:03:51,880 И тогава буфера тогава притежава 512 байта за това JPG, и 68 00:03:51,880 --> 00:03:53,580 така нататък, и така нататък. 69 00:03:53,580 --> 00:03:54,250 OK. 70 00:03:54,250 --> 00:03:58,980 >> Така че, след като удари първият, означени със звездичка блок, първият JPG, как го правиш 71 00:03:58,980 --> 00:04:01,910 Всъщност, добре, да го отворите? 72 00:04:01,910 --> 00:04:04,990 Да се ​​направи нов JPG. 73 00:04:04,990 --> 00:04:08,846 Имената на файловете за JPG ще да бъде във формат, номер, номер, 74 00:04:08,846 --> 00:04:13,830 number.jpg, в които те са име в реда, в който те се намират, 75 00:04:13,830 --> 00:04:14,780 започвайки от 0. 76 00:04:14,780 --> 00:04:19,890 >> Така че първата JPG вас, че намерите ще бъдат 000.jpg. 77 00:04:19,890 --> 00:04:26,560 Така че, може би е добра идея да следите колко JPGs сте открили досега. 78 00:04:26,560 --> 00:04:27,610 Така че това е името на файла. 79 00:04:27,610 --> 00:04:29,660 Но как всъщност се прави това? 80 00:04:29,660 --> 00:04:34,310 Е, ние отиваме да се използва функция, наречена Оферта номер. 81 00:04:34,310 --> 00:04:38,260 А малко по-подобни на ФОРМАТ, където можете да използвате контейнери за струнни, 82 00:04:38,260 --> 00:04:42,420 освен в този случай, Оферта номер ще отпечата файла навън в ток 83 00:04:42,420 --> 00:04:45,550 директория, не в терминала. 84 00:04:45,550 --> 00:04:46,120 >> OK. 85 00:04:46,120 --> 00:04:49,950 Така че тук ние виждаме, че имаме заглавие, Чар масив, който ще се съхранява на 86 00:04:49,950 --> 00:04:55,120 Полученият стринг, и ние взетите Заглавие на действителния низ с 87 00:04:55,120 --> 00:04:58,720 контейнер, просто ни харесва съм Научих се да правя с ФОРМАТ. 88 00:04:58,720 --> 00:05:05,530 Но този код, който имам тук ще даде 2.jpg, не 002.jpg. 89 00:05:05,530 --> 00:05:09,920 Така че аз ще оставя на вас да разберете как да се модифициране на контейнера да се направи 90 00:05:09,920 --> 00:05:11,920 правилното име. 91 00:05:11,920 --> 00:05:12,610 >> OK. 92 00:05:12,610 --> 00:05:17,390 Така че след като веднъж сте sprintf'd след това можете да отворите този файл, защото тя съществува в 93 00:05:17,390 --> 00:05:22,690 телефонния указател, с FОтваряне на, като се използва титла, а след това по какъвто и начин искате 94 00:05:22,690 --> 00:05:25,140 , за да отворите този файл инча 95 00:05:25,140 --> 00:05:30,260 Така че сега, че сме откри нов JPG файл, сега можем да напишем 512 байта на 96 00:05:30,260 --> 00:05:33,320 време, докато се намери нов JPG. 97 00:05:33,320 --> 00:05:36,640 Така че нека хвърлим още един поглед в синтаксиса на неуспешно. 98 00:05:36,640 --> 00:05:40,060 >> Знам, че аз съм, показващ този слайд много, но аз просто искам да се уверя, че 99 00:05:40,060 --> 00:05:43,530 вие не получават твърде объркани, защото Знам, че е много лесно да се 100 00:05:43,530 --> 00:05:47,000 смесват първия и последния аргумент, по-специално. 101 00:05:47,000 --> 00:05:54,390 Но не забравяйте, че пишеш от Вашата буфер в извън Файл. 102 00:05:54,390 --> 00:05:59,250 >> Сега, че знаете как пиша 512 байтове във вашия JPG файл, че сте 103 00:05:59,250 --> 00:06:03,230 създаден, добре, ние искаме да спрем това процес, след като сте достигнали до края на 104 00:06:03,230 --> 00:06:06,720 нашата карта, защото няма да има повече изображения, за да бъдат намерени. 105 00:06:06,720 --> 00:06:10,760 Така че нека да се върнем към fread още веднъж, обещавам. 106 00:06:10,760 --> 00:06:15,600 fread връща колко много елементи с размер, размер, бяха готови в успешно. 107 00:06:15,600 --> 00:06:19,440 В идеалния случай, това ще бъде независимо минете през за брой, нали? 108 00:06:19,440 --> 00:06:24,140 Защото вие се опитвате да прочетете брой на елементи с размер, размер. 109 00:06:24,140 --> 00:06:29,380 Но ако fread не е в състояние да прочете, че брой елементи, то ще се върне 110 00:06:29,380 --> 00:06:32,530 независимо от броя го прочетете успешно. 111 00:06:32,530 --> 00:06:36,310 >> Сега, едно важно нещо е да се отбележи, е че ако използвате друг файл I / O 112 00:06:36,310 --> 00:06:43,860 функция като fgetc, тя ще се върне колко елемента го прочетете успешно. 113 00:06:43,860 --> 00:06:48,000 Какво е полезно за тази функция е че ако използвате функции вътре в 114 00:06:48,000 --> 00:06:53,190 състояние, то ще се изпълни, докато определяне на това условие, което е 115 00:06:53,190 --> 00:06:54,340 Просто наистина полезно. 116 00:06:54,340 --> 00:07:00,440 Така че, ако имате тези условия, да речем, ако fread буфер, sizeof DOG, 2, 117 00:07:00,440 --> 00:07:04,870 показалеца е равна равно на 1, че означава, че бих искал да прочета 118 00:07:04,870 --> 00:07:06,540 2 кучета по това време. 119 00:07:06,540 --> 00:07:13,490 Но ако fread връща 1 вместо 2 както Очаква се, това означава, че има два 120 00:07:13,490 --> 00:07:16,480 кучета, останали в досието ми, а по-скоро едно. 121 00:07:16,480 --> 00:07:22,450 Но ако той се връща 2, а след това аз все още имам тези две кучета във вътрешността на моя буфер. 122 00:07:22,450 --> 00:07:26,280 >> Така че сега, че ви дава усещане за това как да се проверите за края на файла, но 123 00:07:26,280 --> 00:07:28,940 нека да мине през сега логиката. 124 00:07:28,940 --> 00:07:32,460 Как ние всъщност парче всички на тези елементи заедно? 125 00:07:32,460 --> 00:07:36,880 След като удари първия ни JPG, тъй като ние знаем, че JPGs се съхраняват 126 00:07:36,880 --> 00:07:40,910 Последователно, ние ще се пише до стигаме до края на картотеката. 127 00:07:40,910 --> 00:07:43,950 Но ние не искаме да пиша нещо дотогава. 128 00:07:43,950 --> 00:07:48,710 Така че това е важно, не само, че ние сме най- началото на нов JPG, но дали 129 00:07:48,710 --> 00:07:50,655 ние вече открихме JPG или не. 130 00:07:50,655 --> 00:07:55,390 >> Ако това е началото на нова JPG, ние ще искате да затворите текущата ни JPG файл, ако 131 00:07:55,390 --> 00:07:59,110 имаме един отворен и открит нов, за да пишете в. 132 00:07:59,110 --> 00:08:03,340 Ако това не е началото на нова JPG, макар, че ще се задържи на същото JPG файл 133 00:08:03,340 --> 00:08:05,910 отворите и пишат в това. 134 00:08:05,910 --> 00:08:10,100 Ние ще напишем буфер в зависимост от това кое JPG файл имаме отворени, при условие че 135 00:08:10,100 --> 00:08:12,120 имаме един отворен, разбира се. 136 00:08:12,120 --> 00:08:16,190 Ако не сме намерили нашия първи JPG И все пак, ние не пиша нищо. 137 00:08:16,190 --> 00:08:20,290 И този процес продължава, докато не достигнат края на файла на картата. 138 00:08:20,290 --> 00:08:23,410 >> И накрая, вие ще искате да направите сте сигурни, че всяко неуспешно 139 00:08:23,410 --> 00:08:25,800 файлове, които сте fopened. 140 00:08:25,800 --> 00:08:28,360 След като сте доволни от концепции, да вземе един поглед към някои 141 00:08:28,360 --> 00:08:30,840 pseudocode, които сме включили тук. 142 00:08:30,840 --> 00:08:34,830 Първо, вие искате да отворите файла на картата, и след това се повтаря след процеса 143 00:08:34,830 --> 00:08:37,144 докато сте достигнали край на картата. 144 00:08:37,144 --> 00:08:40,880 Искаш ли да се чете 512 байта в буфер. 145 00:08:40,880 --> 00:08:43,934 Използвайки тази буфер, вие ще искате да проверите независимо дали сте в началото на 146 00:08:43,934 --> 00:08:45,300 нова JPG или не. 147 00:08:45,300 --> 00:08:48,400 И отговорът на този въпрос ще повлияе на управление на файлове - 148 00:08:48,400 --> 00:08:51,940 кои файлове отваряте, които такива ще затворят. 149 00:08:51,940 --> 00:08:55,220 >> След това, вече сте намерили JPG? 150 00:08:55,220 --> 00:08:57,740 Как сте били водене следите на това? 151 00:08:57,740 --> 00:09:01,735 След това, в зависимост от това, или ще напиши в текущия JPG, че сте 152 00:09:01,735 --> 00:09:07,090 са отворени, или не го напиша на всички, защото не са намерили още JPG. 153 00:09:07,090 --> 00:09:10,870 Накрая, след като веднъж сте достигнали до края на файла, вие ще искате да се закрие 154 00:09:10,870 --> 00:09:12,590 Останалите файлове, които сте отворили. 155 00:09:12,590 --> 00:09:14,590 Искаме да бъде подредено тук. 156 00:09:14,590 --> 00:09:18,790 >> И с това, че си възстанови всички липсващите файлове от този спомен 157 00:09:18,790 --> 00:09:21,620 карта, което е доста невероятно постижение. 158 00:09:21,620 --> 00:09:23,430 Така потупа себе си на гърба. 159 00:09:23,430 --> 00:09:27,560 Но, има още един елемент към на PSET, който е на конкурса. 160 00:09:27,560 --> 00:09:30,920 Ще откриете, че всички картини че сте възстановени са всъщност 161 00:09:30,920 --> 00:09:32,820 снимки на персонал CS50-те години. 162 00:09:32,820 --> 00:09:38,500 Така че, ако сте в университета или някъде близо, а след това можете да правите снимки с 163 00:09:38,500 --> 00:09:42,600 на персонала, и частта, която има повечето снимки с членове на персонала 164 00:09:42,600 --> 00:09:46,940 от техните възстановените файлове ще получи едно страхотно награда. 165 00:09:46,940 --> 00:09:50,650 С това, след като сте приключили на се възстанови PSET. 166 00:09:50,650 --> 00:09:53,600 Моето име е Zamyla, и това е CS50. 167 00:09:53,600 --> 00:10:01,835