[Powered by Google Translate] [Walkthrough - Проблем Постави 4] [Zamyla Чан - Универзитетот Харвард] [Ова е CS50. - CS50.TV] Во ред. Здраво на сите, и добредојде на можи 4. Денес нашата pset е вештачења. Forensics е навистина забавно pset што вклучува занимаваат со битмапа датотеки да се открие кој извршил кривично дело. Тогаш ние ќе треба да ја промените големината некои битмапа датотеки, тогаш ние, исто така, ќе се справи со навистина забавно дел наречен реставрирана, во која ние сме во основа предаден на мемориска картичка во која некој случајно избришани сите нивни фајлови, и ние сме побарано да направите овие датотеки. Но, прво, пред да се влезе во pset, јас навистина само сакаат да им честитам на сите. Ние сме за во средина на овој курс. Квиз 0 е зад нас, а ние сме во pset4, па во суштина, ние сме на половина пат. Ние измина долг пат, ако се погледне назад кон вашиот psets, pset0 и pset1, па си честитам за тоа, и ние ќе ја добиеме во некои навистина забавно работи. Така, нашето алатникот за овој pset, пак, наместо на водење на sudo yum-y ажурирање, ние сме во состојба само да се кандидира update50 ако сте на верзија 17,3 и погоре на апаратот. Па не заборавајте да се кандидира update50 - тоа е многу полесно, неколку помалку карактери - да бидете сигурни дека сте на најновата верзија на апаратот. Особено важно е да се update50 кога ќе почнат да го користат CS50 Провери. Така бидете сигурни дека ќе го направи тоа. За сите делови за овој pset, ние ќе треба да се занимаваат со датотека влезови и излези, датотека I / O. Ние ќе се случува во текот на многу програми кои се занимаваат со низи укажува на датотеки и работи како што, затоа сакаме да бидете сигурни дека ние сме навистина познати и удобно кои се занимаваат со тоа како да влезни и излезни во датотеки. Во дистрибуцијата код за овој pset е датотека наречена copy.c, и тоа е она што ние ќе треба да се најде ќе биде навистина корисно за нас бидејќи ние ќе се заокружи всушност копирање на copy.c датотека и само го менува нешто да биде во можност да се постигне првите 2 дела на проблемот во собата. И така тогаш како што споменав порано, ние се занимаваат со bitmaps, како и JPEG слики. Значи, навистина разбирање на структурата на тоа како овие датотеки се организирани, како што навистина може да го преведе 0-ти и 1S во structs и она што ние всушност може да се разбере и протолкува и уреди, дека ќе биде навистина важно, па оди во JPEG и битмапа датотеки и разбирање на структурата на нив. Pset4, како и обично, започнува со дел од прашањата. Оние кои ќе се справи со датотека I / O и да ви се навикнати на тоа. Потоа дел 1 е Whodunit, во која ќе се доделува bitmap датотека што изгледа нешто како црвени точки над сите. А потоа во основа она што ние ќе треба да направите е да ја искористам оваа датотека и само да го уреди малку во верзија која може да се прочита. Во суштина, откако ќе заврши, ќе имаме иста датотека, освен што ќе бидете во можност да ги видите скриените порака скриени од страна на сите оние црвени точки. Потоа Повторно е програма која, со оглед на датотечниот а потоа дадено името на датотеката која ја излези, а потоа дадени голем број, како и, всушност ќе ја промени големината дека битмапа со тоа целобројна вредност. Тогаш на крај, ние имаме опорави pset. Ние се дадени мемориска картичка, а потоа мора да се опорави сите слики кои биле случајно избришана, но, како што ќе научат не, всушност избришани и отстранети од датотека; ние само вид на изгубени каде што беа во датотеката, но ние ќе се опорави тоа. Велики. Па оди во датотека I / O конкретно, тие се цела листа на функции што ќе биде во употреба. Веќе сте виделе малку основите на fopen, fread и запишување, но ние ќе се погледне понатаму во некои датотека I / O функции, како што fputc, во која само напиши еден карактер во еден момент, да fseek, каде што вид на преместите датотеката позиција индикатор напред и назад, а потоа некои други. Но, ние ќе одиме во таа малку подоцна во текот на pset. Значи прво, само за да се влезе во датотека I / O пред да одат во pset, за да отворите датотека, на пример, она што треба да направите е, всушност, се постави покажувачот во тој фајл. Значи имаме датотека * покажувач. Во овој случај, јас сум нарекувајќи го во покажувачот, бидејќи тоа ќе биде мојот infile. И така јас ќе одам да ја користите функцијата fopen а потоа името на датотеката а потоа начинот на кој јас ќе одам да се занимаваат со датотеката. Па таму е "r" во овој случај за читање, "W" за пишување, а потоа "а" за додавање. На пример, кога си имаш работа со infile и сите што сакате да направите е да прочитате на битови и бајти чуваат таму, тогаш сте веројатно нема да сакате да го користите "r" како режим. Кога сакате да всушност пишува, вид на направи нов фајл, тогаш што ние ќе треба да направите е да одиме да се отвори нова датотека и употреба на "w" на владата за пишување. Па тогаш кога сте всушност читање на датотеки, структурата е како што следува. Прво што вклучуваат покажувач на struct, која ќе содржи бајти кои што ти ја читаш. Така што ќе биде на крајот локацијата на бајти кои што ти ја читаш. Ти си тогаш ќе укажуваат на големината, како основа колку бајти вашата програма има за читање во датотеката, големината основа еден елемент е, а потоа ви се случува да наведете колку елементи ќе сакате да ја прочитате. А потоа, конечно, треба да знаете кога сте за читање од, така што ќе биде вашата во покажувач. Јас боја овие затоа fread е исто така многу слични на запишување, освен вие сакате да бидете сигурни дека го користите правилен редослед, бидете сигурни дека сте всушност пишување или читање од правото датотека. Па тогаш како и досега, ако имаме големина на елементот, како и бројот на елементи, тогаш можеме да се позанимавам тука малку. Велат дека имам куче struct и така тогаш сакам да ја прочитам две кучиња во исто време. Што можев да сторам е да се каже од големината на еден елемент се случува да биде со големина на едно куче и јас одам да всушност читање на две од нив. Алтернативно, она што можам да направам е да се каже јас сум само ќе прочитате еден елемент и дека еден елемент се случува да биде со големина на две кучиња. Значи тоа е аналогно како можете да вид на игра околу со големината и бројот во зависност од она што е повеќе интуитивна за вас. Во ред. Па сега ние да се пишува датотеки. Кога сакате да напишете датотека, првиот аргумент е, всушност, каде што ти ја читаш од. Значи тоа е во основа на податоците кои ви се случува да се напише во датотека, која е надвор покажувачот на крајот. Па кога си имаш работа со pset, бидете сигурни дека не се збунети. Можеби имаат дефиниции рамо до рамо. Можете да ги повлечат дефинициите во прирачникот со пишување човек, а потоа запишување, на пример, во терминал, или може да се однесува назад кон овој слајд и бидете сигурни дека сте користење на правото. Значи, повторно, за запишување, кога имаш датотека што сакате да го напишете во, тоа ќе биде последниот аргумент и дека ќе биде покажувач на таа датотека. Па тогаш тоа е како ние се занимаваат со пишување можеби неколку бајти во еден момент, но велат дека сакаат само да се напише во само еден единствен карактер. Како што ќе видиме подоцна, во овој пример, во bitmaps ќе имаме да го користат. Тоа е кога можеме да го користиме fputc, во суштина само ставање еден карактер во еден момент, Chr, во датотеката покажувач, и тоа е нашата надвор покажувачот таму. Па тогаш кога бараме или пишувам во датотеката, датотеката е следење на каде сме. Така, тоа е еден вид на курсорот, на датотеката позиција индикатор. И така, кога ние пишуваме или прочитате повторно во датотека, на датотеката всушност се сеќава каде е, и така тоа продолжува од каде курсорот е. Ова може да биде корисно кога сакате, да речеме, да се прочита во одреден износ да се направи нешто а потоа читаат во следните износ, но понекогаш можеби ќе сакате да се врати или, всушност да почне од одредена референтна вредност. Па тогаш функцијата fseek, она што го прави е ни овозможува да го движите курсорот во одредена датотека одреден број на бајти. И тогаш она што го имаме да направите е да одредите каде референтна вредност е. Па или се движи напред или назад од каде курсорот во моментов е, или може да се каже дека тоа само треба да се движи во од почетокот на датотеката или од крајот на датотеката. И така може да помине во негативен или позитивен вредности износ, и тој вид на ќе го преместите курсорот или нанапред или наназад. Пред да се влезе во други psets, било какви прашања на датотека I / O? Во ред. Како да се влезе во повеќе примери, се чувствуваат слободно да ме запре за прашања. Значи во Whodunit, ти си подаде bitmap датотека слично на ова црвениот на слајд, и тоа изгледа вака - еден куп црвени точки - и навистина не знам што е напишано. Ако кривогледство, може да биде во можност да видите мал сина боја во средината. Во суштина, тоа е каде што текстот е зачувана. Имаше убиството што се случи, и ние треба да дознаете кој го сторил тоа. Со цел да го направат тоа, ние треба да се вид на претворање на оваа слика во читлив формат. Ако вие момци некогаш се сретнал ова, понекогаш ќе има малку колекции каде што ќе мора лупа со црвена филм. Некој? Да. Па ќе им бидат предадени нешто како ова, ќе треба лупа со црвена филм над неа, ќе ја стави во текот на сликата, и ќе бидете во можност да ја видите пораката скриена во него. Ние немаме лупа со црвена филм, па наместо ние ќе вид на создаваме наша сопствена во овој pset. И така на корисникот ќе влез whodunit, тогаш поим. BMP, па тоа е infile, тоа е црвена точка порака, а потоа тие кажуваат verdict.bmp ќе биде нашата outfile. Па затоа се случува да се создаде нова bitmap слика слична на поим еден освен во читлив формат, каде што можеме да видиме скриената порака. Бидејќи ние ќе треба да се занимаваат со уредување и манипулација со bitmaps на некој вид, ние ќе вид на нурне во во структурата на овие битмапа датотеки. Отидовме во текот на овие малку во предавањето, но ајде да погледнеме во нив некои повеќе. Bitmaps во суштина се само аранжман на бајти каде што имаш специфицирано која бајти значи она. Значи тука е нешто како карта на bitmap слика велејќи дека тоа започнува со некои насловот датотеки, започнува со некои информации во таму. Ќе видите дека на околу бајт број 14 од големината е означена на bitmap слика, и продолжува натаму. Но, тогаш она што ние сме навистина заинтересирани тука почнува околу бајт број 54. Имаме овие RGB тројки. Она што се случува да направите е да ги содржи вистинските пиксели, бојата вредности. Сето погоре дека во заглавието е некои информации одговара на големината на сликата, ширината на сликата, и висина. Кога одиме во Соочи подоцна, ќе видиме зошто големината на сликата може да биде различна од ширината или висината. Па потоа да се претставуваат овие - овие bitmap слики се секвенци на бајти - она што може да направите е да се каже во ред, јас ќе одам да се запамети дека во индекс 14, тоа е каде што големина е, на пример, туку што ние ќе треба да направите за да се направи овој полесно е тоа капсулирало во структурата. И така имаме две structs направен за нас, BITMAPFILEHEADER и BITMAPINFOHEADER, и така кога читаме во таа датотека, по дифолт тоа ќе се случува во ред, и така во ред тоа е, исто така, ќе се пополни во во варијабли како што се biWidth и biSize. А потоа конечно, секој пиксел е претставена со три бајти. Првиот е износот на сино во пиксели, а втората е износот на зелена, и конечно, износот на црвено, каде што 0 е во суштина нема сина или без зелен или не црвени а потоа FF е максималната вредност. Овие се хексадецимално вредности. Па тогаш ако имаме FF0000, тогаш што одговара на максималната сума на сино и тогаш нема зелена и нема црвена, па тогаш тоа ќе ни даде сини пиксели. Потоа, ако имаме ff за сите во одборот, тогаш тоа значи дека имаме бели пиксели. Ова е вид на спротивни обично кога велиме RGB. Тоа е всушност се случува BGR. Значи, ако ние всушност се погледне во еден пример на bitmap слика - дозволете ми една повлече до тука. Тоа е малку мала. Јас сум зумирање, и може да се види тоа е pixelated. Тоа изгледа како блокови на боја. Имате бели блокови, а потоа црвени блокови. Ако играте во Microsoft Paint, на пример, можете да направите нешто слично од основа, само сликање одредени плоштади во одредена цел. Па тогаш што е ова преведува во битмапа е како што следува. Тука имаме првата бела пиксели, дека сите 6 се ѓ, а потоа ние имаме црвени пиксели, наведено од страна 0000ff. И така секвенца на бајти дека имаме покажува како bitmap слика се случува да се погледне. Значи она што го направив тука е само напишани сите оние бајти, а потоа обоени во црвено така што ќе вид на може да се види, ако кривогледство малку, како тоа вид на укажува на лицето смешковци. Начинот на кој bitmap слики работата е го гледа во основа како мрежа. И така по дифолт, секој ред на мрежата мора да биде повеќе од 4 бајти. Ако ги погледнеме во bitmap слика, ти си пополнување на секоја вредност. На пример, може да имаат црвени тука, зелени тука, сини тука, но мора да бидете сигурни дека на сликата се пополнува со повеќе од четири бајти. Значи, ако јас сакам мојата слика да биде три блока широк, тогаш јас ќе треба да се стави празно вредност во последниот еден да се направи повеќе од четири. Па тогаш јас би додал во нешто што ние сме повикувајќи баласт. Јас сум само ќе покаже дека таму со х. Сега велат сакаме слика што е 7 пиксели долго, на пример. Имаме 1, 2, 3, 4, 5, 6, 7, и сето тоа е исполнет со боја. Начинот на кој bitmap слики работи е дека ние треба 8. Токму сега имаме 1, 2, 3, 4, 5, 6, 7. Ние треба 8 простори за bitmap слика да се чита правилно. Па тогаш што треба да направите е да додадете само малку баласт да бидете сигурни дека сите ширини се подеднакво и дека сите ширини се повеќе од 4. И така јас претходно наведено, Соочи како x или squiggly линија, но во конкретната bitmap слики Соочи е означен со хексадецимален 0. Значи тоа ќе биде еден лик, 0. Она што може да дојде во рака е xxd команда. Што го прави тоа е всушност ви покажува, како слични на она што го направив пред со смешко кога јас всушност печатени надвор она што секоја боја ќе биде за пиксели а потоа боја, кога ќе ја стартувате xxd со следниве команди, тогаш тоа навистина ќе се печати она што боите се за оние пиксели. Што треба да направите е овде јас покаже, како-и 54 вели дека ќе одам да започне на 54 бајт бидејќи пред тоа, не заборавајте ако се погледне назад на мапата на bitmaps, тоа е сите технички податоци и работи како што. Но, она што навистина се грижат за е вистински пиксели кои укажуваат на боја. Значи, со додавање на тоа знаме,-S 54, тогаш ние сме во можност да ја видите вредности на бојата. И не грижете се за комплицирани знамиња и работи како што. Во проблемот сет спецификации, ќе имате насоки за тоа како да се користи xxd да се прикаже пиксели. Значи, ако видите тука, тој вид на изгледа како зелена кутија, оваа мала работа. Сум боја на 00ff00 како основа велејќи дека нема сина, многу зелен, а не црвена боја. Така што кореспондира со зелена боја. Како што можете да видите тука, можеме да видиме зелена правоаголник. Оваа зелено правоаголник е само 3 пиксели широк, па тогаш што ние треба да направите да бидете сигурни дека на сликата е повеќе од 4 широк е да додадете во екстра баласт. И така тогаш тоа е како гледате овие 0-ти тука. Ова, всушност, ќе биде резултат на вашата Повторно pset, суштина преземање на мали bitmap и потоа проширување тоа од 4. И така она што го гледаме е дека всушност оваа слика е 12 пиксели широк, но 12 е повеќе од 4, и така ние всушност не гледам никаква 0-ти на крајот, бидејќи ние не треба да додадете бидејќи тоа е целосно поместена. Тоа не имате било какви повеќе простор. Во ред. Било какви прашања во врска со баласт? Во ред. Кул. Како што споменав порано, bitmaps се само низа од бајти. И така она што го имаме е наместо да има потреба да ги пратите на точно кој број на бајт одговара на специфичен елемент, ние всушност се создаде struct да ја претставува. Значи она што го имаме е RGBTRIPLE struct. Секогаш кога имате пример на RGB трокреветни, бидејќи ова е еден вид дефинира структурата, тогаш можете да пристапите до rgbtBlue променлива, Слично на зелени и црвени променливи, кои ќе покажат колку сина, зелена и црвена, односно, го имате. Значи, ако имаме сини променлива е поставено на 0, зелени сет на FF, која е максималната вредност може да имаат, а потоа и црвени променлива е поставено на 0, тогаш каква боја овој RGB тројно би претставувало? >> [Студент] зелено. Зелена. Точно. Тоа ќе биде корисно да се знае дека секогаш кога имате пример на RGB трокреветни, вие всушност може да пристапите до износот на боја - сина, зелена и црвена - одделно. Сега дека ние сме зборуваше за структурата на тоа, ајде да ги разгледаме во датотеката BMP. Овие се structs направи за вас. Тука имаме BITMAPFILEHEADER struct. Од интерес е големината. Подоцна, имаме информации насловот, кој има уште неколку работи кои се интересни за нас, имено големина, ширина, и висина. Како ќе одиме во подоцна, кога ќе прочитате во датотеката, тој автоматски се вели во затоа што ние сме постави цел да биде ист. Па biSize ќе содржи право бајти кои соодветствуваат со реалните големината на сликата. А потоа тука, на крај, како што ние си зборуваше за, имаме RGBTRIPLE typedef struct. Имаме rgbtBlue, зелена и црвена поврзани со неа. Велики. Во ред. Сега дека ние се разбираме bitmaps малку, да разберат дека ние имаме заглавје на датотеката и информации заглавието поврзани со неа, а потоа после тоа, имаме интересни нешта на боите, и тие бои се претставени со RGBTRIPLE structs, и оние, пак, имаат три вредности кои се поврзани со сини, зелени и црвени. Па сега, можеме вид на размислува за враќање на малку. Жал ми е. Размислете за Whodunit. Кога имаме поим датотека, тогаш она што сакате да го направите е да прочитате во него пиксел од пиксел а потоа некако се промени оние пиксели, така што можеме да го излез во читлив формат. И така на излез, ние ќе пишувам пиксел од пиксел во verdict.bmp датотека. Тоа е вид на многу да се направи. Ние сме свесни дека. Значи она што ние го направивме е што сме всушност ви се предвидени со copy.c. Што copy.c не е само прави точна копија на дадениот bitmap датотека, и потоа излези тоа. Па ова веќе го отвора досие за вас, чита на пиксел од пиксел, а потоа го пишува во во излезната датотека. Ајде да ги разгледаме во тоа. Ова е обезбедување правилна употреба, добивање на имиња на датотеки тука. Што тоа не е тоа поставува влезна датотека да биде она што го помина во во infile тука, што е нашата втора командната линија аргумент. Проверки за да бидете сигурни дека ние може да се отвори датотеката. Проверки за да бидете сигурни дека ние може да се направи нов outfile тука. Тогаш што тоа не тука, тоа само во основа започнува читање во битмапа датотеки од самиот почеток. На почетокот, како што знаеме, содржи BITMAPFILEHEADER, и така тие секвенци од битови директно ќе се пополни во BITMAPFILEHEADER. Значи она што го имаме тука е дека BITMAPFILEHEADER Bf - тоа е нашата нова променлива од типот BITMAPFILEHEADER - ние ќе се стави внатре BF она што го читаме од во покажувач, што е нашата infile. Колку читаме? Читаме во колку бајти ние треба да содржат целата BITMAPFILEHEADER. Слично на тоа, тоа е она што го правиме за инфо заглавието. Па ние сме континуирано заедно нашата датотека во infile, и ние ја читаш овие битови и бајти, а ние сме ги директно приклучување во во овие случаи на променливи кои правиме. Тука ние сме само што си сигурен дека битмапа е битмапа. Сега имаме outfile, нели? Така како што стои кога ќе го креирате, тоа е во суштина празна. Значи ние треба да основа создадете нова bitmap од нула. Што правиме е ние треба да бидете сигурни дека ние копија во заглавјето на датотеката и информации наслов исто како infile има. Што правиме е ние пишуваме - и се сеќавам дека bf е променлива од типот BITMAPFILEHEADER, па она што го правиме е ние едноставно користете ја таа содржина да се напише во outfile. Еве, се сеќавам ние разговаравме за баласт, како тоа е важно да бидете сигурни дека износот на пиксели кои имаме е повеќе од 4. Ова е доста корисно формула за да се пресмета колку Соочи имате со оглед на ширината на вашето досие. Сакам да момци да се запамети дека во copy.c имаме формула за пресметување на баласт. Во ред? Па секој сеќавам на тоа. Велики. Па тогаш што copy.c прави следната е iterates над сите scanlines. Тоа оди преку редови, а потоа продавници секој тројно го чита а потоа го пишува во outfile. Па тогаш тука ќе ти ја читаш само еден RGB тројно во време и тогаш стави истата тројна во outfile. На слабо дел е тоа што баласт не е RGB трокреветни, и така ние не само да се прочита дека Соочи износот на RGB тројки. Она што ние треба да направите е всушност само се движи нашиот датотека позиција индикатор, се движи нашата курсорот, да се вид на прескокнете над сите баласт, така што ние сме во следниот ред. И тогаш што тоа не е копија ви покажува како може да сакате да го додадете баласт. Значи ние сме пресметува колку баласт што треба, па тоа значи дека ние треба Соочи бројот на 0-ти. Што тоа не е за телефонска линија што го става Соочи бројот на 0-ти во нашата outfile. А потоа, конечно, ќе го затворите и датотеки. Ќе го затворите infile како и outfile. Значи тоа е како copy.c дела, и дека ќе биде доста корисно. Наместо само всушност директно копирање и вметнување или само гледајќи во тоа и пишување во она што го сакате, само можеби ќе сакате да ја извршите оваа команда во терминалот, cp copy.c whodunit.c, кој ќе се создаде новата датотека, whodunit.c, кој содржи иста содржина како копија прави. Па тогаш што можеме да направиме е да се користи тоа како рамка врз која да се изгради и уреди за нашите whodunit датотека. Овие се нашите на-DOS да се направи за Whodunit, но она што copy.c не е, всушност, се грижи за повеќето од нив за нас. Значи, сите ние треба следно да направи е промена на пиксели колку што е потребно всушност да се направи датотека може да се чита. Запомнете дека за даден пиксели трокреветни, така и за дадена променлива од тип RGBTRIPLE, можете да пристапите во сина, зелена и црвена вредности. Тоа се случува да дојде во рака, бидејќи ако можете да им пристапите, тоа значи дека можете да ги проверите, а тоа значи дека можете да ги промените. Па кога се вративме во нашата црвена лупа пример, основа, значи дека дејствува како еден вид на филтер за нас. Значи она што сакате да го направите е да сакаме да ги филтрираат сите тројки кои доаѓаат внатре Постојат неколку различни начини да го направите тоа. Во суштина, може да имаат било каков тип на филтер сакате. Можеби сакате да ги промените сите црвени пиксели или можеби сакате да го промените различна боја пиксели на различни бои. Тоа е до вас. Запомнете дека можете да ја проверите каква боја на пиксел е а потоа исто така можете да ја промените како што поминува. Во ред. Значи тоа е Whodunit. Откако ќе се кандидира Whodunit, ќе се знае кој е виновникот за злосторството беше. Сега ние ќе одат за менување на големината. Ние ќе се уште се занимаваат со bitmaps. Она што ние ќе треба да направите е ние ќе имаат влез bitmap а потоа ние ќе помине во голем број, а потоа се добие outfile битмапа каде што тоа е во основа нашите infile намалени од n. Кажи ми датотека беше само еден пиксел голем. Потоа, ако ми n е 3, скалирање од 3, тогаш јас ќе повторам дека пиксели n број на пати, па 3 пати, а потоа, исто така, го намалите 3 пати, како и. Така што гледате јас сум таа скалирање вертикално, како и хоризонтално. А потоа тука е еден пример. Ако имате n = 2, ќе видите дека првите сини пиксели таму се повторува два пати хоризонтално како и вертикално два пати. И тогаш тоа продолжува натаму, и така имаш директен скалирање на вашата оригинална слика од двајца. Па тогаш ако ние требаше да детали pseudocode за ова, сакаме да ја отворам датотеката. А потоа знаејќи дека ако се вратиме тука, можеме да видиме дека ширината на outfile се случува да се биде различен од ширината на infile. Што значи тоа? Тоа значи дека нашите технички податоци нема да се промени. И така што ќе сакате да направите е да се ажурира заглавието информации, знаејќи дека кога читаме во досиејата ако сте работат на copy.c рамка, веќе имаме променлива која укажува на она што големина е и работи како што. Значи откако ќе го имаме тоа, она што можеби ќе сакате да направите е да се промени оние кои се особено променливи. Запомнете, ако имате struct, како да пристапите на променливи во тоа. Го користите точка операторот, нели? Па потоа со помош дека, знаеш дека ќе треба да го промените насловот информации. Па овде е само листа на реалните елементи кои се случува да се менува во вашето досие. Големината на датотеката ќе се менува, на сликата, како и ширина и висина. Па тогаш ќе се вратам на картата на bitmaps, погледне дали тоа е заглавје на датотеката или информации насловот кој содржи таа информација и потоа да се промени колку што е потребно. Повторно, да речеме ср copy.c resize.c. Тоа значи дека resize.c сега содржи сè што е содржан внатре копија бидејќи копија ни дава начин на читање во секој scanline пиксел од пиксел. Освен сега, наместо само менување на вредностите како што правевме во Whodunit, она што сакате да го направите е да сакаме да пишуваат во повеќе пиксели додека нашата n е поголема од 1. Потоа она што сакате да направите е ние сакаме да го водат хоризонтално со n, како и тоа се водат вертикално од n. Како да го направите ова? Кажете го вашиот n е 2 и имаш овој дадена infile. Курсорот ќе започне во првата, и она што сакате да го направите ако n е 2, сакате да се печати во 2 од нив. Така ќе се печати во 2 од нив. Тогаш курсорот ќе се движи кон следниот пиксели, што е црвен, и тоа се случува да испечатите 2 од оние црвени, додавање тоа врз она што е направено досега. Тогаш покажувачот ќе се движи кон следниот пиксели и да подготви во 2 од нив. Ако се погледне назад кон copy.c рамка, што е ова не тука се создава нова инстанца на RGB трокреветни, нова променлива наречена трокреветни. И тука кога се чита во неа, го чита од infile 1 RGBTRIPLE и продавници внатре во тоа тројно променлива. Па тогаш вие всушност имаат променлива претставуваат дека особено пиксели. Тогаш кога ќе напишам, она што можеби ќе сакате да направите е да покривам на запишување изјава во за телефонска линија што пишува во вашиот outfile онолку пати колку што е потребно. Тоа е едноставна. Само во основа се повторува процесот на пишување n број на пати за да ја скала хоризонтално. Но, тогаш ние треба да се запамети дека нашите баласт е ќе се смени. Претходно, велат имавме нешто од должината 3. Тогаш ние само би додал во колку Соочи? Само уште да се направи повеќе од 4. Но велат дека ние сме скалирање оваа слика со n = 2. Па тогаш колку сини пиксели ќе имаме на крајот? Ќе имаме 6. 1, 2, 3, 4, 5, 6. Во ред. 6 не е повеќе од 4. Што е најблискиот повеќе од 4? Тоа ќе биде 8. Така ние всушност ќе имаме 2 букви на Соочи таму. Дали некој се сеќавам ако имаме формула за пресметување Соочи и каде што може да биде? [Нечујни студент одговор] >> Да, copy.c. Право. Постои формула во copy.c да се пресмета колку Соочи имате дадена одредена ширина на bitmap слика. Па тогаш тоа ќе биде корисно кога ќе треба да додадете во одредена сума на Соочи всушност да дознаам колку Соочи треба да додадете. Но, една забелешка, сепак, е дека вие сакате да бидете сигурни дека сте користење на правото големина. Но, бидете внимателни затоа што ти си во основа ќе се занимаваат со две bitmap слики. Вие сакате да бидете сигурни дека сте користење на правото. Кога сте пресметување на баласт за outfile, сакате да го користите на ширината на outfile и не ширината на претходниот. Велики. Овој вид на се грижи за се протега на целата bitmap слика хоризонтално. Но, она што сакате да го направите е, всушност, го водат вертикално, како и. Ова ќе биде малку сложени да ја формира, бидејќи кога ќе завршите со копирање ред и пишување тој ред, нашата курсорот ќе биде на крајот. Значи, ако читаме повторно, тогаш тоа е само ќе прочитате во следната линија. Значи она што сакате да го направите е вид на се најде некој начин на копирање оние редови повторно или само вид на преземање на тој ред, а потоа препишување тоа повторно. Како што вид на алудира, постојат неколку различни начини да го направите тоа. Што можете да направите е како сте ќе низ и преку читање на одредена scanline и менување на тоа што е потребно, тогаш вид на продавница на сите оние пиксели во низа. Потоа подоцна знаеш дека ќе треба да се печати дека низа повторно, и за да можете да го користите само таа низа да го направите тоа. Друг начин да го направите е да можете да го копирате надолу еден ред, разбирам дека треба да го копирате дека повторно, па всушност го движите курсорот, и тоа ќе биде со користење на метод fseek. Можете да го движите курсорот целиот пат назад а потоа се повторува копија процес повторно. Значи, ако нашите скалирање број е n, тогаш колку пати ќе треба да се вратиш назад и преправи линија? >> [Студент] n - 1. >> Да, совршено. n - 1. Ние го направи еднаш веќе, па потоа ќе сакате да се повторува кога ќе се вратам процес n - 1 износ од пати. Во ред. Па таму ќе ја имате големината функција. Сега можеме да дојдеме до навистина забавно дел, мојата омилена pset, која е реставрирана. Наместо bitmaps, овој пат ние сме се занимаваат со JPEG слики. Ние сме, всушност, не даде датотека само на JPEG слики, ние си даде основа суровини мемориска картичка формат. И така овој содржи малку информации и ѓубре вредности во почетокот, а потоа почнува и има еден куп на JPEG датотеки. Сепак, ние сме предадени картичка каде сме избришани слики; во суштина, ние сме заборавиле каде што фотографиите се наоѓа во рамките на картичката. Па тогаш нашата задача во направите е да се оди преку оваа картичка формат и да најдат оние слики повторно. За среќа, структурата на JPEG датотеки и картичка датотека е малку корисни. Тоа дефинитивно можеше да биде малку сложени да ја формира ако не беше во овој формат. Секоја датотека JPEG, всушност, започнува со две можни секвенци, наведени погоре. Во суштина, кога имате нов JPEG фајл, тоа започнува со или секвенца ffd8 ffe0 или другиот, ffd8 ffe1. Друга корисна работа да се знае е дека JPEG слики се чуваат contiguously. Значи секогаш кога еден JPEG фајл завршува, другиот започнува. Така што не е било каков вид на во-помеѓу вредностите таму. Откако ќе хит на почетокот на JPEG, ако веќе сте биле читање на JPEG, знаете дека сте хит на крајот на претходниот и на почетокот на следниот. Да се ​​вид на визуелизира ова, јас направив шематски. Друга работа за JPEG слики е дека ние може да прочитате во секвенци од 512 бајти во еден момент, Слично со почетокот на картичката. Ние не треба да се проверува секој бајт бидејќи тоа би си го цица. Така, наместо, она што можеме да направиме е, всушност, само читаат во 512 бајти во еден момент а потоа, наместо на проверка помеѓу оние во тие малечки парчиња, ние само може да се провери на почетокот на 512 бајти. Во суштина, во овој филм, она што го гледате е во почетокот на картичката, имате вредности кои не се навистина релевантни за вистинските JPEG слики себе. Но, тогаш она што го имам е ѕвезда за да се покаже еден од двата почнувајќи секвенци за JPEG. Значи секогаш кога ќе видите една ѕвезда, знаете дека имате JPEG датотека. А потоа секој JPEG датотека ќе биде некои повеќе од 512 бајти но не значи дека истиот повеќе. Начинот на кој знаете дека сте погоди уште еден JPEG е ако го погоди друга ѕвезда, друга почетна секвенца на бајти. Тогаш она што го имаме тука е дека имате црвена JPEG фајл продолжува додека не го погоди ѕвезда, кој е означен со нова боја. Ќе продолжи, а потоа ќе го погоди друга ѕвезда, ќе го погоди уште еден JPEG, ќе продолжи по целиот пат до крај. Вие сте на последната слика тука, розова еден. Да одите до крај додека не го погоди крајот на датотеката карактер. Ова ќе биде навистина корисно. Неколку главни takeaways тука: Картичка датотека не започнува со JPEG, но еднаш JPEG започнува, сите на JPEG слики се чуваат рамо до рамо еден на друг. Некои pseudocode за враќање. Прво, ние ќе ги отвориме нашите картичка датотека, и тоа ќе биде со користење на нашите датотека I / O функции. Ние ќе го повтори овој процес додека не го достигнала крајот на датотеката. Ние ќе ја прочитате 512 бајти во исто време. И она што го рече е тука ние ќе се чува во тампон, Значи, во основа се држи до оние 512 бајти додека ние точно знаеме што да правиме со нив. Потоа она што сакате да направите е ние сакаме да се провери дали ние сме хит ѕвезда или не. Ако ние сме хит ѕвезда, ако ние сме го погоди еден од почетна секвенци, тогаш знаеме дека сме хит нова JPEG фајл. Што ќе сакате да направите е ние ќе сакате да се создаде новата датотека во нашата pset4 директориум да продолжат со таа датотека. Но, исто така, ако веќе сте направиле една JPEG пред, тогаш ние сакаме да се стави крај на таа датотека и да се поттикнат до pset4 папка, каде што ќе имаме таа датотека чуваат, бидејќи ако ние не се каже дека ние сме завршиле дека JPEG фајл, тогаш ние во основа ќе имаат неодредена сума. На JPEG слики никогаш нема да заврши. Значи, сакаме да бидете сигурни дека кога ќе ја читаш во JPEG датотека и пишување дека, ние сакаме да конкретно затвори дека со цел да се отвори следниот. Ние ќе сакате да се провери неколку работи. Ние сакаме да се провери дали ние сме на почетокот на една нова JPEG со нашите тампон и исто така ако ние веќе пронашле JPEG пред затоа што ќе го промени вашиот процес малку. Па тогаш, откако ќе поминат низ целиот пат и ќе го погоди на крајот на датотеката, тогаш што ќе сакате да направите е ќе сакате да го затворите сите датотеки кои се во моментов е отворен. Тоа веројатно ќе биде последен JPEG фајл дека имате, како и картичка датотека која сте биле занимаваат со. На последната пречка што треба да се справи е како да се навистина направи JPEG датотека и како да всушност го притисни за папката. На pset бара секој JPEG дека ќе најдете биде во следниов формат, каде што ќе имаат број. jpg. Бројот, дури и ако тоа е 0, ние го нарекуваме 000.jpg. Секогаш кога ќе се најде JPEG во вашата програма, сте ќе сакате да го името во цел дека тоа е пронајдена. Што значи ова? Ние треба да се вид на ги пратите на тоа колку ние Наидовме и што бројот на секој JPEG треба да биде. Тука ние ќе ги искористат предностите на sprintf функција. Слични на printf, која само вид на отпечатоци вредност надвор во терминал, sprintf печати ја датотеката во папката. И така што ова ќе направам, ако имав sprintf, наслов, а потоа стринг таму, тоа ќе испечатите 2.jpg. Претпоставувајќи дека сум затворен моите датотеки правилно, кој ќе содржи датотека која сум бил пишување надвор. Но, едно е дека кодот што сум тука сосема не ги задоволуваат што pset бара. На pset бара вториот JPEG фајл да се именува 002, наместо само 2. Па кога ќе се печати името, тогаш можеби би сакале да ја смени случаеви малку. Дали некој се сеќавам како ние се овозможи празни места кога ќе печати нешто? Да. >> [Студент] Вие стави 3 помеѓу знакот за процент и 2. >> Да, совршено. Ќе се стави 3 во овој случај, бидејќи ние сакаме простор за 3. % 3d веројатно ќе ви даде 002.jpg наместо на 2. Првиот аргумент во sprintf функција е всушност знак низа, кои претходно знаеше како стрингови. Оние волја, вид на повеќе како привремено чување, исто чување произлегуваат низа. Вие навистина не ќе се занимаваат со ова, но треба да го вклучат. Знаејќи дека секој името на датотеката има на број, кој ги зема три карактери, и тогаш. JPG, колку долго оваа низа треба да биде? Исфрли број. Колку знаци во насловот, во името? Значи има 3 hashtags, период, JPG. >> [Студент] 7. >> 7. Не сосема. Ние ќе сакате 8 затоа што ние сакаме да се овозможи null терминаторот, како и. Конечно, само за да извлече процес што ќе се прави за враќање, имате некои почетокот информации. Ќе продолжи се додека не се најде на почетокот на JPEG датотека, и дека може да биде еден од двата почнувајќи секвенци. Можете задржи за читање. Секој коса црта тука претставува 512 бајти. Можете да продолжи со читање, да ги задржи за читање додека не наишле на друга почетна секвенца. Откако ќе го имаат тоа, можете да го завршите тековниот JPEG - во овој случај, тоа е црвен, па сакате да се стави крај тоа. Сакате да sprintf името на таа во вашиот pset4 папка, тогаш ќе сакате да се отвори нов JPEG и потоа ги задржи за читање додека не се сретне следната. Чувајте ги за читање, да ги задржи на читање, а потоа конечно, конечно, си оди за да стигнат до крајот на датотеката, и така ќе сакате да го затворите последната JPEG дека сте биле работат со, sprintf дека во вашиот pset4 фолдер, а потоа да се погледне во сите слики кои сте добиле. Тие слики се всушност слики од CS50 персонал, и така ова е местото каде бонус забава дел од pset доаѓа во е дека се натпреваруваат во делови да се најде TFS во слики и да ги преземат слики со нив за да докаже дека сте го направиле на pset и за да можете да видите кој членови на персоналот се во слики. Па тогаш да фотографирате со персоналот. Понекогаш ќе треба да ги бркаат надолу. Веројатно некои од нив ќе се обиде да побегне од вас. Можете да фотографирате со нив. Ова е во тек. Тоа не е поради кога pset се должи. Крајниот рок ќе бидат објавени во спецификации. Потоа, заедно со вашата секција, кое дел се и повеќето слики со повеќето членови на персоналот ќе победи прилично страшни награда. Тоа е вид на поттик да ја добиете вашата pset4 заврши што е можно побрзо затоа што тогаш можете да се фаќате за бизнис лов на одредување на сите различни CS50 членови на персоналот. Тоа не е задолжително, иако, па откако ќе го добиете слики, тогаш ќе се заврши со pset4. И јас сум завршил со можи 4, па се заблагодарам на сите што дојдовте. Среќно со вештачења. [Аплауз] [CS50.TV]