[Powered by Google Translate] [Walkthrough - Проблем Set 4] [Zamyla Chan - Харвардския университет] [Това е CS50. - CS50.TV] Добре. Здравейте на всички, и добре дошли Walkthrough 4. Днес нашата pset е Криминалистите. Криминалистите е наистина забавно pset, която включва работа с растерни файлове да открие кой е извършил престъпление. След това отиваме да преоразмерите някои растерни файлове, тогава ние сме също така ще се справят с наистина забавна част, наречена Възстановяване , в която ние сме основно връчи карта с памет , в който някой случайно изтрити файловете си, и ние сме помолени да възстанови тези файлове. Но първо, преди да стигнем в pset, аз наистина просто искам да поздравя всички. Ние сме в средата на този курс. Quiz 0 е зад нас, и ние сме в pset4, толкова по същество, сме на половината път. Изминахме дълъг път, ако погледнем назад към вашите psets, pset0 и pset1, така че си поздравя за това, и отиваме да влязат в някои наистина забавни неща. Така инструментариум за тази pset, отново, вместо да вървят Sudo Yum-Y актуализация, ние сме в състояние само да стартирате update50, ако сте на версия 17.3 и по-горе на уреда. Така че не забравяйте да тече update50 - това е много по-лесно, няколко малко символи - за да се уверите, че сте в най-новата версия на уреда. Особено важно е да update50, когато започнете да използвате CS50 Проверете. Така че се уверете, че правиш, че. За всички секции за този pset, отиваме да се занимава с файлове входове и изходи, подайте I / O. Ние ще се случва в продължение на много програми, които се занимават с масиви сочещи към файлове и подобни неща, така че ние искаме да се уверите, че наистина сме познати и удобни справяне с как да вход и изход във файлове. В разпределението код за този pset е файл, наречен резервното и това е какво ще да се намери ще бъде наистина полезно за нас защото ние сме в крайна сметка ще копиране на резервното файл и просто да го променя леко, за да бъде в състояние да постигне първите две части на проблема набор. И така както споменах преди, ние се занимаваме с растерни изображения, както и JPEGs. Така че наистина разбирането на структурата на това как са организирани тези файлове, как наистина можем да преведем 0s и 1s в structs и неща, че всъщност можем да разбират и тълкуват и редактирате, , което ще бъде много важно, така навлиза в JPEG и растерни файлове и разбирането на структурата на тези. Pset4, както обикновено, започва с раздел от въпроси. Те ще се справят с I / O файл и да сте свикнали с това. Тогава част 1 е криминале, в която сте растерно файл , който изглежда нещо като червени точки навсякъде. И тогава основно това, което ние ще направим, е да вземе този файл и просто го редактирате леко в една версия, която можем да прочетем. По същество, след като приключим, ще имаме един и същи файл, освен ние ще бъдем в състояние да видите скритото послание, скрито от всички тези червени точки. Тогава Resize е програма, която по даден файл и след това се дава името на файла, който да подава и след това дава номер, както и, действително ще преоразмеряване, че растерна графика от тази целочислена стойност. Тогава накрая, ние имаме Възстановяване на pset. Ние се дават карта с памет и след това трябва да възстанови всички снимки , които са били случайно изтрити, но, както ще научите не, всъщност заличава и отстранен от файла; ние просто вид на изгубен, когато те са били във файла, но отиваме да се възстанови. Велики. Така че в досието I / O конкретно, те са цял списък от функции, които ще се използват. Вие вече сте виждали малко основите на fopen, fread и неуспешно, но ние ще разгледаме в някой файл I / O функции като fputc, , в които просто напишете един символ в даден момент, fseek, където можете вид преместите файла индикатор за положение напред и назад, И тогава някои други. Но ние ще отидем в това малко по-късно по време на pset. Така че, първо, само за да влязат в файл I / O, преди да отидем в pset за да отворите файл, например, това, което трябва да направите, е действително показалеца на този файл. Така че ние имаме указател FILE *. В този случай, ще се обадя в показалеца, защото това ще ми бъде infile. И така, аз отивам да използвате функцията fopen и след това името на файла и след това режим, в който аз ще се занимава с файла. Така че има "R" в този случай за четене, "w" за писане, а след това "а" за добавяне. Например, когато си имаш работа с infile и всичко, което искате да направите, е да прочетете битове и байтове, съхранявани там, тогава вие вероятно ще искате да използвате "R" като режим. Когато искате да напишете, вид на нов файл, тогава това, което ние ще направим, е, че ние отиваме, за да отворите нов файл и използвайте "w" режим за писане. Така че тогава, когато сте в действителност четене във файловете, структурата е както следва. Първо трябва да включва указател към структура, която ще съдържа байтове, които вие четете. Така че това ще бъде края местоположението на байтове, че вие ​​четете. След това ще посочи размера, като основно колко байта вашата програма трябва да прочете в файла, размера основно един елемент, и тогава започваш да се уточни колко елементите, които искате да прочетете. И накрая, трябва да знаете, когато четете, така че ще ви бъде показалка. Аз кодирани с цвят от тези, защото fread също е много подобно на неуспешно, с изключение на това, че искате да се уверите, че използвате правилния ред, уверете се, че сте всъщност писмено или четене от правото файл. Така че тогава, както и преди, ако имаме размер на елемента, както и броя на елементите, тогава можем да си поиграем малко. Да кажем, че имате куче структура и след това искам да прочета две кучета в даден момент. Какво можех да направя, е да казват че размера на един елемент ще бъде размера на едно куче и аз ще действително да четат две от тях. Освен това, какво мога да направя, е да кажа, че съм просто ще чете един елемент и че един от елементите ще бъде размера на две кучета. Така че това е аналогична как можете да си поиграете с размера и броя в зависимост от това, което е по-интуитивен за вас. Добре. Така че сега ние стигнем до писането на файлове. Когато искате да напишете файл, първият аргумент е всъщност къде четете. Така че това е в основата на данните, които ще пишат във файла, което е от показалеца в края. Така че, когато си имаш работа с pset, уверете се, да не се бърка. Може би има определения рамо до рамо. Можете да дръпнете определенията в ръководството, като въведете човек и след това неуспешно, например, в терминала, или може да се отнася обратно към този слайд и се уверете, че използвате дясната. Така че, отново неуспешно, когато имате файл, който искате да напишете, , че това ще бъде последният аргумент и това ще да е показалец към този файл. Така че това е начина, по който се справят с писането може би няколко байта, но казват, че искате да напишете само в един единствен характер. Както ще видим по-късно в този пример, в растерни изображения ще се наложи да го използвате. Това е, когато можем да използваме fputc по същество просто сложи един символ в даден момент, хр, в указателя на файла, и това е от показалеца. Тогава, когато ние се стремим или да пишат във файл, файлът се следи от къде сме. Така че това е един вид на курсора, индикаторът файл позиция. И така всеки път, когато се записва или чете отново във файл, файл всъщност си спомня къде е, и така продължава от къде е курсора. Това може да бъде полезно, когато искате да, да речем, прочетете в определена сума, за да се направи нещо и след това прочетете в следната сума, но понякога може да искате да се върнете назад или всъщност започват от определена референтна стойност. Тогава функцията fseek, това, което той прави, е ни позволява да преместите курсора в даден файл определен брой байтове. И тогава това, което трябва да направите е да посочите къде референтната стойност е. Така че или се движи напред или назад, където в момента е на курсора, или можем да се уточни, че тя трябва просто да се движат в от началото на файла или от края на файла. И така, вие може да мине в отрицателни или положителни стойности в размер, и това ще вид преместите курсора напред или назад. Преди да стигнем в други psets, на всички въпроси на файл I / O? Добре. Като стигнем в повече примери, не се колебайте да ме спре за въпроси. Така че в криминале, ти подаде растерна графика файл, подобен на този червен на слайда, и тя изглежда така - един куп червени точки - и вие наистина не знам какво е написано. Ако кривогледство, може да бъде в състояние да се види леко синкав цвят вътре в средата. По същество, това е мястото, където текстът се съхраняват. Имаше едно убийство, което се случи, и ние трябва да разберем кой го е направил. За да направим това, ние трябва да конвертирате тази картинка в лесен за четене формат. Ако вие срещала това, понякога ще има малки комплекти където ще имате лупа с червена филм. Някой? Да. Така че ще бъде предаден нещо подобно, вие ще трябва лупа с червения филм над него, ще го постави върху изображението, и вие ще можете да видите съобщение, скрито в него. Ние нямаме лупа с червена филм, така че вместо да отива някак да създаваме наша собствена в тази pset. , Така че потребителят да въведете криминале, тогава представа, BMP, така че това е infile, че е червен съобщение точка, и тогава те казват verdict.bmp ще бъде нашата outfile. Така че ще се създаде ново растерно изображение, подобно на следата освен в четивен формат, където можем да видим скритото послание. Тъй като ние ще трябва да се занимават с редактиране и манипулиране на растерни изображения от някакъв вид, отиваме вид гмуркане в структурата на тези растерни файлове. Ходихме тези малко в лекция, но нека погледнем в тях още малко. Bitmaps по същество са просто подреждане на байтове където сме уточни кои байта кажа какво. Така че тук е нещо като карта на растерно изображение казва, че започва с някои заглавни файлове, започва с някаква информация там. Вие виждате, че на около байт номер 14 размера е показан на растерно изображение, и тя продължава. Но след това, което ние наистина се интересуват от тук започва около байт номер 54. Имаме тези RGB тройки. Какво ще направи, е да съдържат действителните пиксела, цветовите стойности. Всичко по-горе, че в заглавието е някаква информация съответстващи на размера на изображението, ширината на изображението, а височината. Когато отидем в подложка по-късно, ще видим защо размера на изображението може да бъде различна от ширината или височината. Тогава да представляват тях - тези растерни изображения са последователности от байтове - какво можем да направим, е да се каже, добре, аз отивам да се помни, че при индекс 14, това е, когато размерът е, например, но вместо това, което започваш да направя, за да направи това по-лесно се капсулират в структурата. И така, имаме две structs за нас, BITMAPFILEHEADER и BITMAPINFOHEADER, и така всеки път, когато четем в този файл, по подразбиране той ще се случва с цел, и така, за да е също така ще да попълните в променливи като biWidth и biSize. И накрая, всеки пиксел е представена от три байта. Първият от тях е в размер на синьо в пиксел, вторият е в размер на зелено, и накрая, размерът на червено, където 0 е по същество няма сини или не зелено или няма червена и след това ее е максималната стойност. Това са шестнадесетични стойности. Значи, ако имаме ff0000, това съответства на максималния размер на синьо и след това не зелено и няма червена, така че след това, което ще ни даде син пиксел. Тогава, ако всички имаме ее е повсеместно, то това означава, че ние имаме бял пиксел. Това е вид обратното на обикновено, когато казваме, RGB. Всъщност се случва BGR. Така че, ако ние действително изглежда в пример за растерно изображение - нека ми една издърпайте нагоре. Това е малко по малко. Гледам, и можем да видим, е пикселизирани. Тя изглежда като блокове на цвета. Имате бели блокове и след това червени блокове. Ако играете в Microsoft Paint, например, може да направи нещо подобно от просто боядисване на някои площади в определен ред. Тогава какво това се превръща в растерна графика е както следва. Тук имаме първите бели пиксели, че всички шест са е, и след това имаме червени пиксела, посочен от 0000FF. И така поредица от байтове, които имаме, показва колко растерно изображение ще изглежда. Така че това, което съм направил тук е просто изписани всички тези байта и след това оцветени в червено така че можете да вид, ако кривогледство малко, как този вид показва усмивка на лицето. Начинът, по който е растерни изображения работа, предвиждат основно като мрежа. И така, по подразбиране, всеки ред на решетката трябва да бъде кратно на 4 байта. Ако се вгледаме в растерно изображение, вие попълване на всяка стойност. Например, може да имат червен, зелен, син, но вие трябва да се уверите, че изображението се попълва с кратно на четири байта. Така че, ако искам моят образ да бъде три блока, тогава ще трябва да се сложи празна стойност през последната една, за да го кратно на четири. Тогава бих добавила нещо, което се обаждате подложка. Аз съм просто ще показват, че с х. Сега кажем, че искаме един образ, който е с дължина 7 пиксела, например. Ние имаме 1, 2, 3, 4, 5, 6, 7, и всичко това се попълва с цвят. Начинът, по който, растерни изображения работят, е, че имаме нужда от 8-ми. Точно сега имаме 1, 2, 3, 4, 5, 6, 7. Имаме нужда от 8 места за растерно изображение, да четат правилно. Значи, това, което трябва да направите, е да добавите само малко на подложка за да се уверите, че всички от широчините са еднакви и че всички от широчините са кратен на 4. И така аз се посочва, подложки като х или деформирано линия, но в реалните растерни изображения подложка е обозначено с шестнадесетичен 0. Така че това ще бъде един символ, 0. Какво може да дойде по-удобно е xxd команда. Какво го прави е всъщност показва, като подобни на това, което направих преди с усмивка , когато се отпечатва реално това, което ще бъде за всеки цвят на пикселите и след това цвят кодирани, когато стартирате xxd със следните команди, тогава той ще отпечата какви цветове са тези пиксели. Това, което трябва да направите, е тук, показват, че като S 54 казва, че аз ще започне в 54-ата байт защото преди това, не забравяйте, ако погледнем назад към картата на растерни изображения, това е цялата информация в заглавието и подобни неща. Но това, което наистина се грижи за действителните пиксели, които показват цвета. Така чрез добавяне в този флаг, и 54, а след това ние сме в състояние да видите цветови стойности. И не се притеснявайте за сложните знамена и такива неща. В спец. проблем в стаята, ще има указания за това как да използвате xxd за показване на пиксела. Така че, ако видите тук, вид прилича на зелено поле, това малко нещо. Съм кодирани с цвят 00ff00 като основно казват, не сини, много зеленина, а не червен. Така че това съответства на зелено. Както виждате тук, ние виждаме зеления правоъгълник. Зеления правоъгълник е само на 3 пиксела широк, така че след това, което ние трябва да направим да се уверите, че изображението е кратно на 4 широк е да добавите допълнително подложка. И така, това е как виждате тези 0s тук. Това всъщност ще бъде резултат на вашия Resize pset, по същество като малък растерна графика, а след това неговото увеличаване с 4. И така, това, което виждаме, е, че всъщност това изображение е 12 пиксела широк, но 12 е кратно на 4, и така ние всъщност не виждам никаква 0s в края, защото ние не трябва да добавите , защото това е напълно подплатени. То не трябва повече място. Добре. Всякакви въпроси за подложка? Добре. Cool. Както споменах и преди, растерни изображения са само поредица от байтове. И така, това, което имаме, е, вместо да се налага да следите точно кой номер на байт съответства на определен елемент, ние всъщност са създали структура да представлява това. Така че това, което имаме, е RGBTRIPLE структура. Винаги, когато имате една инстанция на RGB тройна, защото това е вид определят структурата, след това можете да получите достъп до rgbtBlue променлива, По подобен начин, зелено и червено променливи, които ще показват колко синьо, зелено и червено, съответно имате. Така че, ако имаме син комплект променлива до 0, зелена ее което е максималната стойност, която може да има, а след това червената променлива трябва да е 0, тогава какъв цвят би това специално RGB тройна? >> Студент Грийн. Грийн. Точно така. Това ще бъде полезно да се знае, че ако имате например на RGB тройна, всъщност можете да получите достъп до размера на цвят - син, зелен и червен - отделно. Сега, когато сме говорили за структурата на това, нека хвърлим един поглед към BMP файл. Това са structs за вас. Тук имаме структурата на BITMAPFILEHEADER. От интерес е размерът. По-късно, ние имаме информация колонтитул, който има още няколко неща, които са интересни за нас, а именно размер, ширината и височината. Както ще отидат в по-късно, когато четете до преписката, автоматично прочита, защото сме поставил за цел да бъде същата. Така че biSize ще съдържа правилните байтове, които отговарят на действителния размер на изображението. И тогава, накрая, тъй като сме говорили за, имаме на RGBTRIPLE typedef структура. Имаме rgbtBlue, Green и Red, свързани с нея. Велики. Добре. Сега, ние разбираме, растерни изображения малко, разбирам, че имаме заглавен файл и информация за заглавието, свързани с нея, а след това след това, ние имаме интересни неща на цветовете, и тези цветове са представени от RGBTRIPLE structs, и тези, от своя страна, има три стойности, асоциирани към синьо, зелено и червено. Така че сега, ние можем да мисля за Възстановяване малко. Извинете. Помислете за криминале. Когато имаме нашата представа файл, тогава това, което искаме да направим, е да прочетете в пиксел по пиксел и след това по някакъв начин да променят тези пиксели, така че да можем да го изведе в лесен за четене формат. И така, да го изведе, ние отиваме да напишете пиксел по пиксел в verdict.bmp файл. Това е вид много да се направи. Ние осъзнаваме, че. Така че това, което сме направили, е всъщност сме ви предоставили и copy.c. Какво резервното прави е просто прави точно копие на даден файл на растерна графика, а след това да подава. Така че това вече отваря файла за вас, гласи пиксел по пиксел, и след това го пише в изходния файл. Нека хвърлим един поглед на това. Това е да се гарантира правилното използване, имената на файловете тук. Това, което прави е, тя определя входния файл, за да бъдем това, което сме преминали в в infile тук, , която е втората ни аргумент за командния ред. Проверки, за да сме сигурни, че можете да отворите файла. Проверки, за да сме сигурни, че може да се направи нов outfile тук. Тогава какво прави тук, той просто същество започва в растерното файл от самото начало. В началото, както знаем, съдържа BITMAPFILEHEADER и така тези поредици от битове директно ще попълни в BITMAPFILEHEADER. Така че това, което имаме тук се казва, че BITMAPFILEHEADER BF - това е нова променлива от тип BITMAPFILEHEADER - отиваме да се сложат бе това, което четем от показалка, която е нашата infile. Колко четем? Четем в колко байта ние трябва да съдържа цялата BITMAPFILEHEADER. Също така, това е това, което правим за заглавието на информация. Така че ние продължаваме по нашия файл в infile, и четеш тези битове и байтове, и ние сме ги включите директно в в тези случаи на променливите, които правехме. Тук ние просто се уверите, че растерна графика е растерна графика. Сега имаме outfile, нали? Така че в този си вид, когато го създаде, той е по същество празна. Така че ние трябва всъщност да създадете нова растерна графика от нулата. Това, което правим е, че ние трябва да сме сигурни, че копирате в заглавен файл информация Header точно като infile. Това, което правим, е да пиша - и не забравяйте, че BF е променлива на тип BITMAPFILEHEADER, така че това, което правим, е, че ние просто използвайте това съдържание да пиша в outfile. Ето, не забравяйте, ние говорихме за подложка, колко е важно да се уверите, че размерът на пикселите, които имаме, е кратен на 4. Това е доста полезно формула, за да изчисли колко подложка имате даден на ширината на вашия файл. Искам вие да запомните, че в резервното имаме формула за изчисляване на подложка. Добре? Така че всеки помни това. Велики. Тогава какво резервното следващия е итерации над всички на scanlines. Тя преминава през редовете и след това да съхранява всяка тройна, че се чете и след това го пише в outfile. Значи тук ние четеш само един RGB тройна в даден момент и след това същата тази тройна в outfile. Трудната част е, че уплътнението не е RGB тройна, и затова не може просто да прочетете тази подложка размера на тройки RGB. Това, което трябва да направите, е всъщност само се движи нашата индикатор за положение файл, да се движи нашата курсора, да прескачам подложка, така че ние сме в следващия ред. И тогава какво прави това е копие, което показва как може да искате да добавите подложка. Така че ние сме изчислява колко подложка имаме нужда, така че това означава, че ние трябва подложка броя на 0s. Това не е цикъл, който поставя подложка броя на 0s в нашия outfile. И накрая, да затворите двата файла. Затваряте infile, както и outfile. Ето как резервното работи, и че ще бъде доста полезно. Вместо просто всъщност директно го копирате и поставите или просто търсите в него и да пишете в каквото си искате, може би просто искате да изпълните тази команда в терминала, CP резервното whodunit.c, което ще създаде нов файл, whodunit.c , която съдържа точно същото съдържание като копие. Тогава какво можем да направим, е да използвате като рамка, върху която да се изгради и редактирате за нашето криминале файл. Това са ни до-DOS да направя за криминале, но какво резервното всъщност се грижи за повечето от тях за нас. Така че всички ние трябва да направите, е да промените пикселите, ако е необходимо действително да направите файла за четене. Не забравяйте, че за даден пиксел тройна, така че за дадена променлива от тип RGBTRIPLE можете да получите достъп до синьо, зелено и червено ценности. Това ще дойде по-удобно, защото, ако имате достъп до тях, това означава, че можете да ги проверите, и това означава, че можете да ги промените. Така че, когато ние се върнахме в червено нашия пример лупа, основно, че е действал като един вид филтър за нас. Така че това, което искаме да направим е, че искате да филтрирате всички тройки, които идват инча Има няколко различни начина да направите това. По принцип, може да имате, независимо от вида на филтъра, който искате. Може би искате да промените всички червени пиксели или може би искате да промените различен цвят на пикселите в различен цвят. Това е до вас. Не забравяйте, че можете да проверите какъв цвят на пикселите и след това можете да го промените като минаваш. Добре. Така че това е криминале. След като стартирате криминале, вие ще знаете кой е виновника на престъплението. Сега ние ще отидем да преоразмерите. Ние сме все още ще се занимава с растерни изображения. Това, което ще направя, е, че ще има растерна графика за въвеждане и след това отиваме да премине в редица и след това се outfile растерна графика когато това е в основата infile мащабират от N. Кажи ми файл е само един пиксел голям. Тогава, ако ми N 3, лющене от 3, тогава аз ще повторя, че пиксел N броя пъти, така три пъти, а след това да го мащабирате три пъти, както добре. Така че, виждаш ли, че нейното мащабиране вертикално и хоризонтално. А пък тук е един пример. Ако имате N = 2, ще видите, че първият син пиксел повтаря два пъти хоризонтално, както и два пъти вертикално. И това продължава нататък, и така имате директна лющене на първоначалния си образ по две. Значи, ако бяхме подробно pseudocode за това, ние искаме да отворите файла. И тогава, знаейки, че ако се върнем тук, виждаме, че ширината за outfile се щеше да бъде различна от ширината за infile. Какво означава това? Това означава, че нашата заглавна информация няма да се промени. И така, това, което ще искате да направите, е да актуализирате заглавието на информация, знаейки, че когато четем във файловете Ако работите на резервното рамка, ние вече имаме променлива, която показва каква е големината и такива неща. Така че след като веднъж сте, че това, което може да искате да направите, е да промените тези конкретни променливи. Не забравяйте, че ако имате структурата, начина за достъп до променливи в това. Можете да използвате точката оператор, нали? Тогава това, нали знаеш, че ще трябва да се промени заглавието на информация. Така че тук е просто списък на реалните елементи, които ще се променят във вашия файл. Размерът на файла ще се променя изображението, както и ширината и височината. Така че отново се връща към картата на растерни изображения, да видим дали това е заглавен файл или заглавието на информация, която съдържа тази информация и след това да се промени, ако е необходимо. Отново, да речем CP резервното resize.c. Това означава, че resize.c съдържа всичко, което се съдържа вътре копие защото копие ни дава начин за четене за всеки scanline пиксел по пиксел. Освен сега, вместо просто промяна на стойности, както направихме в криминале, това, което искаме да направим, е, че искам да пиша в няколко пиксела толкова дълго, колкото нашата N е по-голямо от 1. Тогава какво искаме да направим, е, че ние искаме да го удължавам хоризонтално от N, толкова добре, колкото се простират вертикално от N. Как бихме могли да направим това? Кажи си н е 2, а имате предвид infile. Курсорът ще започне в първия, и това, което искате да направите, ако N е 2, искате да се отпечата в два от тези. Така че, да печатате в две от тези. Тогава курсорът ще се премести към следващото пиксела, която е червена, и ще отпечата две от тези червените, да го положат върху това, което е правил досега. Тогава курсорът ще се премести към следващото пиксел и изготвя в два от тези. Ако погледнем назад към резервното рамка, какво прави тук се създава нова инстанция на RGB тройни, нова променлива, наречена тройна. И тук, когато се чете в нея, тя се чете от infile 1 RGBTRIPLE и го съхранява вътре на тази тройна променлива. Значи всъщност трябва променлива, представляваща този конкретен пиксел. Тогава, когато ти пиша, какво може да искате да направите, е оградете неуспешно отчет за контур че го пише във вашия outfile толкова пъти, колкото е необходимо. Това е достатъчно проста. Просто основно повторете процеса на писане N брой пъти, за да я мащабирате хоризонтално. Но тогава ние трябва да помним, че нашата подложка няма да се промени. Преди да кажем, че има нещо с дължина 3. Тогава ние ще трябва само да добавите в колко подложка? Само още един, за да го кратен на 4. Но казват, че ние сме мащабиране този конкретен образ от N = 2. Тогава колко сини пиксели ще имаме в края? Щяхме да имаме 6. 1, 2, 3, 4, 5, 6. Добре. 6 не е кратен на 4. Какво е най-близкото кратно на четири? Това ще бъде 8. Така че ние всъщност се случва там да има 2 знака на подложка. Има ли някой помни ако имаме формула за изчисляване подложка и когато това може да бъде? [Чува отговор студент] >> Да, copy.c. Точно така. Има формула в резервното да се изчисли колко подложка имате определена ширина на растерно изображение. Така че това ще бъде полезно, когато трябва да добавите в определен период на подложка действително да разбера колко подложка, което трябва да се добави. Но една бележка, обаче, е, че вие ​​искате да се уверите, че използвате правилния размер. Просто бъдете внимателни, защото вие сте основно ще се занимава с две растерни изображения. Вие искате да сте сигурни, че използвате най-подходящия. Когато сте изчисляване на подложка за outfile, който искате да използвате ширината на outfile , а не ширината на предишния. Велики. Този вид се грижи за разтягане растерно изображение хоризонтално. Но това, което искаме да направим, е да го разтегнете както и вертикално. Това ще бъде малко по-сложни, защото когато сме готови копиране на ред и писане на този ред, курсорът ще бъде в края. Така че, ако четем отново, то тогава просто ще прочетете в следващия ред. Така че това, което искаме да направим, е един вид намеря някакъв начин за копиране на тези редове отново или просто вид на този ред и след това пренаписване отново. Както вид намекна, има няколко различни начина да направите това. Какво можете да направите, е като минаваш и четенето чрез специално scanline и да го променя, тъй като това е необходимо, а след това вид магазин всички на тези пиксели в масив. По-късно от вас знае, че ще трябва да отпечатате отново този масив, и така можете да просто да използвате този масив да го направя. Друг начин да го направя е, че може да копира един ред, да разберат, че трябва да копирате, че отново, за да преместите курсора, и това ще се използва метода fseek. Можете да преместите курсора по целия път обратно и след това отново повторете процеса на копиране. Така че, ако нашата мащабиране брой е N, а след това колко пъти ще имаме да се върнем и да пренапише линия? >> [Ученик] - 1. >> Да, перфектно. N - 1. Сме го правили веднъж вече, така че тогава ще искате да повторите текущия процес гърба N - 1 брой пъти. Добре. Така че има ли функция за преоразмеряване. Сега можем да стигнем до наистина забавната част, любимата ми pset, което е Възстановяване. Вместо на растерни изображения, този път си имаме работа с JPEG файлове. Ние всъщност не сме получили файл само на JPEG файлове, ние сме в основата на суров формат на картата с памет. И така, това съдържа малко на информация и боклук стойности в началото и след това започва и има един куп JPEG файлове. Въпреки това, ние сме връчи карта, в която сте изтрили снимките; същество, сме забравили, когато снимките са разположени в рамките на картата. Тогава нашата задача в Възстановяване е да мине през този формат на карта и да намерят тези снимки отново. За щастие, структурата на JPEG файлове и картотека е малко полезни. Това определено може да са малко по-сложни, ако не беше в този формат. Всеки файл JPEG всъщност започва с две възможни последователности, изброени по-горе. По принцип, когато имате нов файл JPEG, започва с последователността ffd8 ffe0 или другата, ffd8 ffe1. Друг полезен нещо, което трябва да знаете е, че JPEG файлове се съхраняват Последователно. Така че, когато една JPEG файл завършва, а другият започва. Така че не е какъвто и да е вид на между стойностите там. След като удари началото на JPEG, ако вече сте били четене на JPEG, вие знаете, че вие ​​сте удари края на предишната и началото на следващата. Да визуализира тази, схематични. Друго нещо, за JPEG файлове е, че ние може да ги прочете в поредици от 512 байта в даден момент, Подобно е и с началото на картата. Ние не трябва да се проверява всеки един байт, защото това ще изсмуче. Така че вместо това, какво можем да направим, е всъщност просто прочетете в 512 байта в даден момент и след това, вместо да се проверява между тези, които в тези малки филийки, можем просто да проверите началото на 512 байта. По същество, в тази картина, това, което виждате, е в началото на картата, имате ценности, които наистина не са свързани с действителните самите JPEG файлове. Но след това, което имам, е звезда, да се посочи един от два стартови последователности за JPEG. Така че, когато видите една звезда, вие знаете, че имате файл във формат JPEG. И тогава ще бъде някои кратно на 512 байта всеки файл, JPEG но не съвпадат непременно с кратно. Начинът, по който вие знаете, че сте удари друг 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 функция. Подобно на ФОРМАТ, който просто разпечатки стойност в терминала, sprintf отпечатва файла в папката. И така, какво ще направя, ако имах sprintf, заглавие, а след това низ там, ще отпечата 2.jpg. Ако приемем, че съм затворена правилно мои файлове, , която да съдържа файл, който е писал,. Но едно нещо е, че кодът, че имам тук не съвсем удовлетвори pset изисква. На pset изисква втория файл, JPEG трябва да се именуват 002 вместо само две. Така че, когато печатате на името, тогава може би може да искате да се промени леко контейнера. Ли някой си спомня как сме дават възможност за допълнителни пространства, когато се печата нещо? Да. >> [Ученик] постави три между знака за процент и 2. >> Да, перфектно. Ще сложи 3 в този случай, защото искаме пространство за 3. 3D% вероятно ще ви даде 002.jpg вместо два. Първият аргумент в sprintf функция е всъщност знак масив, ако те предварително се знаеше като струни. Тези, воля, вид прилича повече на временно съхранение, съхранение на крайния низ. Вие не наистина ще се занимава с това, но трябва да го включва. Знаейки, че името на всеки файл има номер, който заема три знака, и след това. JPG, колко дълго трябва този масив? Изхвърлете номер. Колко знака в заглавието, в името? Така че има три hashtags, период, JPG. >> [Ученик] 7. >> 7. Не съвсем. Отиваме да искат 8, защото искаме да се даде възможност за нула терминатор, както и. И накрая, да се изготви на процес, който ще се прави за Възстановяване, имате някакъв началото информация. Вие продължавате, докато не се намери началото на JPEG файл, и това може да бъде един от два стартови последователности. Вие продължавайте да четете. Всяка черта тук представлява 512 байта. Вие продължавайте да четете, държат на четене, докато натъкваме на още един последователност. След като сте, че прекратите текущото JPEG - в този случай, това е червена, така че искам да се сложи край на това. Вие искате да sprintf името на този в pset4 вашата папка, след това искате да отворите нов JPEG и след това продължавайте да четете докато се натъкнете на следващия. Дръжте четене, продължавайте да четете, и накрая, в крайна сметка, вие ще достигнат края на файла, и така вие ще искате да затворите последния JPEG, че сте работили с, sprintf, че във вашия pset4 папка и след това погледнете всички снимки, които сте придобили. Тези снимки са всъщност снимки на CS50 персонал, и така това е мястото, където част бонус забавно на pset идва в е, че се състезават във вашите раздели да намерите TFS в снимки и да правите снимки с тях, за да докаже, че сте направили pset и така можете да видите кои членове на персонала са в снимки. Така че след това можете да правите снимки с персонала. Понякога вие ще трябва да ги гонят. Вероятно някои от тях ще се опита да избяга от вас. Можете да правите снимки с тях. Това е в ход. Това не е поради, когато pset се дължи. Крайният срок ще бъдат обявени в спецификациите. След това заедно с вашия раздел, в зависимост от това коя от двете раздел отнема най-много снимки с най-много членове на персонала ще спечелят доста страхотно награда. Това е вид стимул, за да получите вашия pset4 завърши възможно най-бързо защото тогава можете да се заловим за работа преследва всички различни CS50 служители. Това не е задължително, въпреки че, така че след като се снимки, значи сте готови с pset4. И аз съм свършил с Walkthrough 4, така че благодаря на всички, че дойдохте. Успех с Криминалистите. [Аплодисменти] [CS50.TV]