[Музички] ZAMYLA Чан: Да се ​​справи со се опорави. Закрепне е веројатно мојата омилена PSET, и главно затоа што мислам дека е навистина, навистина кул. Во суштина, ти си даде меморија картичка датотека во која слики биле избришани. Но, она што ви се случува да направите е да се опорави сите нив. OK. Така, тоа е навистина возбудливо, но можеби малку застрашувачки, затоа што ти си со оглед на празен Ц датотека и што треба да го пополнат внатре ОК, па ајде да се скрши оваа во податлив делови. Ќе сакате да го отворите мемориска картичка датотека. Што се чини дека едноставно доволно. Потоа, се најде на почетокот на 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, која зема во struct, која ќе содржи на бајти кои што ти ја читаш. Па ви се случува да се стави оние кои се во таму - големината, бројот, а потоа inpointer дека сте читање од. Сега, ние сакаме да го прочитате 512 во еден момент, и ние сакаме да го зачувате овој во тампон, Одам да го наречеме. Во суштина, ние ќе треба да се одржи кон оние 512 бајти и направи работи со тоа, нели? Ние сме или ќе се спореди првиот четири бајти, или ние ќе треба да ја прочита во, во ред? Па тогаш податоци покажувачот на што потоа ќе се послужи како тампон, и inpointer, добро, тоа е само ќе да биде вашата мемориска картичка. Назад кон нашиот мемориска картичка шематски. Ние ќе се прочита 512 бајти во еден момент, чување на секои 512-бајт блок во тампон, задржување на оние тампон, оние 512 бајти, додека ние знаеме точно што да ги прават. Значи на почетокот не е ништо, па ние ќе го прочитате тампон, споредете го, и ние не ќе треба да се направи нешто со неа. А потоа, конечно погоди ѕвезда блокира, што значи дека ние сме Пронајдовме нашата прва JPG. Па тампон сега држат бајти од тоа JPG. Следниот пат 512 бајти, затоа што тие се не е ѕвезда блок, исто така, дел од таа JPG. И jpgs се континуирано од таму на во, додека ние хит на следната JPG. А потоа на тампон, тогаш држи 512 бајти за тоа JPG, и така натаму, и така натаму. OK. Значи откако ќе го погоди првите ѕвезда блок, првиот JPG, како да всушност, добро, ја отвори? Ајде да се направи нов JPG. На имиња на датотеки за JPG се случува да да биде во формат, број, број, number.jpg, во која тие се именувани во редоследот по кој тие се наоѓаат, со почеток во 0. Така, првиот JPG вас, кои најдете ќе биде 000.jpg. Значи, веројатно е добра идеја да ги пратите колку jpgs си нашол досега. Па тоа е името на датотеката. Но како да всушност прават тоа? Па, ние ќе треба да се користи функција наречена sprintf. А малку слични на printf, каде можете да го користите променливи за жици, освен во овој случај, sprintf ќе печати ја датотеката во тековната директориум, не во терминал. OK. Па еве гледаме дека имаме наслов, на знак низа што ќе ги чува произлегуваат низа, и ние помине во Насловот на вистинските стринг со случаеви, само сакаме сум научил да прави со printf. Но овој код кој имам тука ќе им даде 2.jpg не 002.jpg. Па ќе оставиме тоа за вас за да дознаете како да се менувате случаеви да се направи точно име. OK. Значи еднаш сте sprintf'd можеш да отвори таа датотека, бидејќи таа постои во вашиот именик, со fopen, со користење на титула, а потоа она што го саканиот режим да се отвори таа датотека внатре Па сега дека ние сме отвори нова JPG датотека, сега ние може да напише 512 бајти на време, додека не се најде нов JPG. Па ајде земи друг изглед на синтаксата на запишување. Знам дека јас сум покажува овој слајд на многу, но јас само сакам да бидете сигурни дека вие момци не се премногу збунета, бидејќи Знам дека тоа е многу лесно да се измеша прв и последен аргумент, а особено. Но запомнете дека сте пишување од Вашиот тампон во надвор датотека слики. Сега дека знаете како пишува 512 бајти во вашиот JPG датотеката која сте создадени, добро, ние сакаме да го спречи тоа процес еднаш сме стигнале до крајот на нашата картичка, бидејќи нема да има повеќе слики да се најде. Па ајде да одиме назад кон fread уште еднаш, ти ветувам. fread враќа колку елементи на големината, големина, беа подготвени во успешно. Идеално, тоа се случува да биде што ќе помине во за бројот, нели? Затоа што се обидуваш да го прочитате број на елементи на големината, големината. Но, ако fread не е во состојба да се прочита дека број на елементи, тогаш тоа ќе се врати без оглед на бројот го прочита успешно. Сега, една важна работа да се напомене е дека ако користите друга датотека I / O функција како fgetc, исто така, ќе се врати колку елементи се прочита успешно. Што е корисно за оваа функција е дека ако користите функциите во внатрешноста на состојба, тоа ќе се изврши додека утврдување на тоа состојба, која е само навистина корисни. Значи, ако имате овие услови, да речеме, ако fread тампон, sizeof куче, 2, покажувач, еднакво е еднаква на 1, односно значи дека јас би сакал да го прочиташ 2 кучиња во време. Но, ако fread враќа 1, наместо на 2 како се очекува, тоа значи дека постојат 2 кучиња остави во моето досие, туку 1. Но, ако тоа се враќа на 2, тогаш јас се уште имаат оние 2 кучиња во внатрешноста на мојата тампон. Па сега дека ви дава чувство како да се провери на крајот на датотеката, но Ајде да одиме преку сега логиката. Како ние всушност го состави сите на овие елементи заедно? Откако ќе го погоди нашиот прв JPG, бидејќи ние знаеме дека jpgs се чуваат contiguously, ние ќе се пишува до стигнавме до крајот на картичка датотека. Но ние не сакаме да се напише ништо до тогаш. Па затоа е важно, не само што ние сме во на почеток на нова JPG, но дали ние веќе го нашол во JPG или не. Ако тоа е почеток на нова JPG, ние ќе сакате да го затворите нашите сегашни JPG датотека ако имаме еден отворен, и отворен нова да се напише во. Ако тоа не е почеток на новата JPG, сепак, ние ќе продолжиме исто JPG датотека отвори и да пишува во тоа. Ние ќе пишуваме нашата тампон во зависност од JPG датотека имаме отворен, под услов имаме еден отворен, се разбира. Ако ние не го нашле нашиот прв JPG сепак, ние не го пишувам ништо. И овој процес продолжува се додека не стигне до крајот на картичка датотека. И, конечно, ќе сакате да бидете сигурни дека ќе запишам било додадени фајлови: дека сте fopened. Откако ќе бидете задоволни од концепти, да погледнам во некои pseudocode, кои јас сум вклучен тука. Прво, вие сакате да го отворите картичка датотека, а потоа се повторува следните процес до кога сте достигнавме крајот на картичка. Сакате да прочитате 512 бајти во пуфер. Користење на тие тампон, ќе сакате да се провери без разлика дали сте на почетокот на нова JPG или не. И одговорот на тоа прашање ќе влијаат на вашиот управување со датотеки - кои датотеки ќе се отвори, кои оние мислите затвори. Потоа, дали веќе се најде во JPG? Како сте биле одржување ги пратите на тоа? Потоа, во зависност од тоа, или ќе пишува во тековната JPG дека имаат отворена, или не пишува тоа на сите, затоа што не пронашле JPG уште. Конечно, откако сте достигнавме крајот на датотеката, ќе сакате да го затворите било Останатите датотеки кои сте ги отворени. Ние сакаме да бидеме уредно тука. А со тоа, вие сте ги обнови сите на исчезнатите датотеки од таа меморија картичка, која е прилично неверојатен подвиг. Значи се туп на грбот. Но, има уште еден елемент за на PSET, кое е натпревар. Ќе најдете дека сите слики дека сте обнови се всушност слики на персоналот CS50 е. Значи, ако сте на кампусот или некаде во близина, тогаш вие може да потрае слики со персоналот, и делот кој има повеќето слики со членови на персоналот од нивните обнови датотеки ќе добие одличен награда. Со тоа, тогаш ќе завршите со закрепне PSET. Моето име е Zamyla, а тоа е CS50.