[Музыка гуляе] ZAMYLA Чан: Давайце вырашаць аднавіць. Аднаўленне, верагодна, мой любімы PSET, і ў асноўным таму, што я думаю, што гэта вельмі, вельмі крута. У прынцыпе, вы далі памяць картатэка, у якой фатаграфіі былі выдаленыя. Але тое, што вы збіраецеся зрабіць, гэта аднавіць іх усіх. ОК. Так што гэта вельмі цікава, але, магчыма, трохі страшным, таму што ты улічваючы пусты файл C і вы павінны запоўніць яго цалі Такім чынам, давайце разбярэм гэты на кіраваныя часткі. Вы хочаце, каб адкрыць файл карты памяці. Гэта здаецца досыць простым. Затым знайсці пачатак з JPG малюнка. Усе файлы на гэтай памяці карта будуць JPG-файлы. Затым, калі вы знайсці пачатак, вы збіраецеся адкрыць новы JPG, што з'яўляецца, быццам бы, стварыць JPG, і пісаць 512 байт у той час, пакуль новы JPG не з'яўляецца знойдзена, і заканчваючы праграму, як толькі датчык выяўляе канец файла. Так першыя крокі Па-першае, адкрыць файл карты памяці. Але вы ведаеце, гэта ўжо і ёсць файл функцыя ўводу / высновы, што збіраецца апынуцца вельмі карысным. ОК. Так што JPG-файлы? Таму што нам трэба да пачатку яго. Ну, JPG-файлы, гэтак жа, як бітных карт, проста паслядоўнасці байтаў. На шчасце, кожны JPG пачынаецца альбо з 0xff, 0xD8, 0xff, 0XE0, адна паслядоўнасць з байт, ці іншай паслядоўнасць байтаў. Так што тыя чатыры байта паказваюць пачаткам JPG. Ніхто іншы, як гэтых двух камбінацый з чатырох байт. І на шчасце для нас, яшчэ адзін факт, што мы могуць скарыстацца ў тым, што кожны JPG захоўваецца бок аб бок на карце памяці. Я ўяўляў структуру карта памяці схематычна на гэтым слізгаць тут. Тут кожны квадрат, кожны прастакутнік, ўяўляе 512 байт, і яна пачынае з шэрым у тым, што мы робім не сапраўды ёсць JPG. Але тады мы, нарэшце, хіт блок з зоркай. Гэта азначае, што першыя чатыры байта з з тых 512 з'яўляюцца адным з тых двух пачынаючы паслядоўнасці ў JPG. І мы ідзем адтуль, а затым адзін раз адзін JPG сканчаецца, наступны пачынаецца. Мы ніколі не павінны больш шэрая прастора паміж імі. Але як мы на самай справе чытаць гэта, і чытаць 512 байт, так што мы можам зрабіць параўнанне першае месца? Ну, давайце вернемся да FREAD, якія займае ў структуры, якая будзе ўтрымліваць байты, вы чытаеце. Так што вы збіраецеся паставіць тыя, у там - памер, колькасць, а затым inpointer што вы чытаеце з. Цяпер мы хочам, каб прачытаць 512 у той час, і мы хочам захаваць гэта ў буфер, Я буду называць яго. У прынцыпе, мы збіраемся правесці на тыя 512 байт і рабіць рэчы з ім, праўда? Мы альбо будзем параўноўваць першы чатыры байта ці мы збіраемся чытаць яго, добра? Такім чынам паказальнік дадзеных будзе потым служыць у якасці буфера, а inpointer, добра, што проста будзе быць ваша карта памяці. Вернемся да нашага карты памяці схеме. Мы збіраемся, каб прачытаць 512 байт, у той час, захоўвання кожны блок 512 байт у буфер, трымаючыся тых буфер, гэтыя 512 байт, пакуль мы не даведаемся дакладна, што рабіць іх. Такім чынам, пачатак няма нічога, так што мы будзем чытаць буфер, параўнаць яго, і нам не трэба нічога рабіць з ім. І потым, мы, нарэшце, хіт зорку блакаваць, а гэта азначае, што мы знайшлі наш першы JPG. Так буфер цяпер трымаюць байты з гэтай JPG. У наступны раз 512 байт, таму што яны не зорка блок, таксама часткай гэтай JPG. І JPG-файлы з'яўляюцца бесперапыннымі адтуль на ў, пакуль мы не патрапілі ў наступны JPG. І тое буфер то мае 512 байт для гэтага JPG і гэтак далей, і таму падобнае. ОК. Таму, як толькі вы націснеце ўпершыню зняўся блок, першы JPG, як вы на самай справе, добра, адкрыць яго? Давайце зробім новую JPG. Імёны файлаў для JPG збіраюцца быць у фармаце, нумар, нумар, number.jpg, у тым, што яны названы ў парадак, у якім яны знаходзяцца, пачынаючы з 0. Такім чынам, першы JPG, што вы знайсці будзе 000.jpg. Так, верагодна, добрая ідэя, каб адсочваць ад таго, колькі файлаў JPG вы знайшлі да гэтага часу. Дык вось імя файла. Але як вы на самой справе зрабіць гэта? Ну, мы збіраемся выкарыстаць Функцыя называецца Sprintf. Трохі падобна на Printf, дзе Вы можаце выкарыстоўваць запаўняльнікі для струнных, акрамя як ў гэтым выпадку, Sprintf будзе друкаваць файл з ў ток каталог, а не ў тэрмінале. ОК. І вось мы бачым, што ў нас ёсць назва, масіў сімвалаў, які будзе захоўваць Атрыманы радок, і мы праходзім ў Назва рэальную радок з запаўняльнік, гэтак жа, як мы навучыліся рабіць з Printf. Але гэты код, што ў мяне тут дасць 2.jpg, а ня 002.jpg. Таму я пакідаю вас, каб даведацца, як змяніць запаўняльнік, каб зрабіць правільную назву. ОК. Таму, як толькі вы sprintf'd то вы можаце адкрыць гэты файл, таму што яна існуе ў ваш каталог, з FOPEN, выкарыстоўваючы назва, а затым усё, што патрэбны Вам рэжым для адкрыцця гэтага файла цалі Так што цяпер мы адкрылі новы файл JPG, зараз мы можам напісаць 512 байт на Час, пакуль новы JPG не знойдзена. Так што давайце яшчэ раз зірнуць ў сінтаксісе FWRITE. Я ведаю, што я паказваю гэты слайд шмат, але я проста хачу, каб пераканацца, што вы, хлопцы, не занадта блытаць, таму што Я ведаю, што гэта вельмі лёгка пераблытаць першы і апошні Аргумент, у прыватнасці. Але памятайце, што вы пішаце ад ваш буфер ў з малюнкаў файлаў. Зараз, калі вы ведаеце, як пісаць 512 байт у вашым JPG файл, які вы створаны, добра, мы хочам, каб спыніць гэта Працэс, як толькі мы дасягнулі канца наша карта, таму што там не будзе любыя іншыя выявы, якія будуць знойдзеныя. Так што давайце вернемся да FREAD яшчэ раз, я абяцаю. FREAD вяртае, як шмат элементаў памеру, памер, былі гатовыя ў паспяхова. У ідэале, гэта будзе тое, што Вы перадаеце ў колькасці, ці не так? Таму што вы спрабуеце чытаць нумар элементаў памер, памер. Але калі FREAD не ў стане прачытаць, што лік элементаў, то вярнуся што колькасць паспяхова чытаць. Цяпер адна важная рэч, варта адзначыць, што калі вы выкарыстоўваеце іншы файл уводу / вываду функцыі, як fgetc, гэта будзе таксама вяртаць колькі элементаў ён паспяхова чытаў. Што карысна аб гэтай функцыі з'яўляецца што калі вы выкарыстоўваеце функцыі ўнутры стан, ён будзе выконваць сам у той час як вызначэння, што ўмова, якое з'яўляецца проста вельмі карысна. Так што калі ў вас ёсць гэтыя ўмовы, скажам, калі FREAD буфера, SizeOf САБАКІ, 2, паказальнік, роўная роўная 1, што азначае, што я хацеў бы прачытаць 2 сабакі ў той час. Але калі FREAD вяртае 1 замест 2, як Чакаецца, што азначае, што існуе два сабакі пакінулі ў маім файле, а 1. Але калі ён вяртае 2, то я да гэтага часу гэтыя 2 сабакі ўнутры майго буфера. Так што цяпер дае вам пачуццё таго, як праверыць на канец файла, але давайце пройдзем зараз логіцы. Як мы на самай справе сабраць усе з гэтых элементаў разам? Як толькі мы патрапілі наш першы JPG, так як мы ведаем, што JPG-файлы захоўваюцца бесперапынна, мы не буду пісаць, пакуль мы дасягнем канца файла карты. Але мы не хочам, каб напісаць нічога да таго часу. Так што мае значэнне, а не толькі тое, што мы на пачатак новага JPG, а ў тым, мы ўжо знайшлі JPG ці не. Калі гэта пачатак новага JPG, мы будзем хочаце зачыніць наш бягучы файл JPG, калі у нас ёсць адзін Адкрыць і адкрыйце новы, каб напісаць у. Калі гэта не пачатак новага JPG, хоць, мы будзем трымаць той жа файл JPG адкрыць і пісаць у гэта. Мы напішам наш буфер у залежнасці ад таго, JPG-файл у нас адкрыты пры ўмове, што у нас ёсць адзін адкрыты, вядома. Калі мы не знайшлі наш першы JPG тым не менш, мы нічога не пісаць. І гэты працэс працягваецца да вас дойдзе да канца картатэцы. І, нарэшце, вы хочаце, каб зрабіць ўпэўненыя, што вы FClose любой файлы, якія вы fopened. Пасля таго, як вы адчуваеце сябе камфортна з паняцці, зірніце на некаторыя псевдокод, які я уключыў тут. Па-першае, вы хочаце, каб адкрыць файл карты, а затым паўтарыць наступны працэс пакуль вы не дасягнулі канец карты. Вы хочаце чытаць 512 байт у буфер. Выкарыстанне гэтага буфера, вы хочаце, каб праверыць Ці вы ў пачатку Новы JPG ці не. І адказ на гэтае пытанне будзе паўплываць на кіраванне файламі - якія файлы вы адкрываеце, якія з іх вы закрыць. Тады, вы ўжо знайшлі JPG? Як вы трымалі трэк з гэтага? Затым, у залежнасці ад таго, вы альбо напісаць у бягучы JPG, што вы ёсць адкрытая або ня пісаць наогул, таму што вы не знайшлі JPG яшчэ. Нарэшце, як толькі вы дасягнулі канца файл, вы хочаце, каб закрыць любую астатнія файлы, якія ў вас адкрыты. Мы хочам быць акуратным тут. І з гэтым, вы адноўлены ўсе адсутнічаюць файлы з гэтай памяці карта, якая з'яўляецца даволі дзіўны подзвіг. Так пагладзіць сябе па спіне. Але ёсць яшчэ адзін элемент, каб PSET, што конкурс. Вы ўбачыце, што ўсе фатаграфіі што вы адноўлены на самай справе фатаграфіі супрацоўнікаў CS50 ст. Так што калі вы знаходзіцеся на тэрыторыі кампуса ці дзесьці побач, то вы можаце рабіць здымкі з персанал, і падзел, які мае большасць фатаграфій з супрацоўнікамі ад сваіх адноўленых файлаў будзе атрымаць дзіўны прыз. Пры тым, што тады вы скончылі аднавіць PSET. Мяне клічуць Zamyla, і гэта CS50.