>> [Музыка играет]
>> 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.