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