[Powered by Google Translate] [Kiirtutvustus - Ülesanded 4] [Zamyla Chan - Harvardi Ülikool] [See on CS50. - CS50.TV] Hea küll. Tere kõigile ja tere tulemast kiirtutvustus 4. Täna on meie pset on kohtumeditsiini. Kriminalistid on tõesti lõbus pset et käsitleb tegevusi bitmap faili avastada toime pannud kuriteo. Siis läheme suurust mõned bitmap faili, siis me ka kavatsete toime tulla tõesti lõbus osa nimetatakse taastamine, kus me põhiliselt andis mälukaart kus keegi on kogemata kustutatud kõik oma failid, ja me palus taastada neid faile. Aga kõigepealt, enne kui me sattuda pset, ma tõesti tahan õnnitleda kõiki. Oleme umbes keskpunktis seda muidugi. Viktoriin 0 on möödas, ja me oleme pset4, nii sisuliselt, et me oleme poolel teel. Me oleme tulnud pika tee, kui sa vaatad tagasi oma psets, pset0 ja pset1, nii õnnitleda ennast selle pärast, ja me ei kavatse sattuda mõned väga lõbusaid asju. Nii et meie tööriistakasti selle pset jällegi selle asemel sudo yum-y update, suudame lihtsalt joosta update50 kui sa oled versioon 17,3 ja üle selle seadme kasutusiga. Nii et kindlasti joosta update50 - see on palju lihtsam, mõned vähem tähemärki - veenduda, et sa oled viimane versioon aparaat. Eriti on oluline update50 kui hakkame kasutades CS50 Kontrolli. Seega veenduge, et teil seda teha. Kõigil sektsioonid see pset, me hakkame tegelema faili sisendid ja väljundid, esitama I / O. Me läheme minema üle palju programme, et tegeleda massiivid osutades faile ja asju, nii et me tahame veenduda, et me oleme tõesti tuttav ja mugav tegelevad, kuidas sisend ja väljund failidesse. Turustamise kood see pset on fail nimega copy.c, ja see, mida me leiame saab olema tõesti kasulik meile sest me ei kavatse lõpuks tegelikult kopeerimine copy.c fail ja lihtsalt muuta see veidi, et oleks võimalik saavutada esimese 2 osa lahendamist. Ja nii siis nagu juba mainisin, on tegemist rasterpildid samuti JPEG. Nii et tõesti mõista struktuuri, kuidas need failid on korraldatud, kuidas me saame tõesti tõlkida 0. ja 1s arvesse structs ja asju, mida me tegelikult saame mõista ja tõlgendada ja muuta, mis on tõesti oluline, nii laskumist JPEG ja bitmap failide ja mõistmine struktuuri need. Pset4, nagu tavaliselt, algab sektsiooni küsimusi. Need hakkab tegelema faili I / O ja sulle harjunud, et. Siis 1. osa Dekkari, kus te olete antud bitmap faili , mis näeb välja selline nagu punased täpid üle kogu. Ja siis põhimõtteliselt mida me kavatseme teha, on võtta seda faili ja lihtsalt muuta pisut võetud versioon, et me saame lugeda. Sisuliselt, kui me lõpetame, me peame sama faili, välja arvatud me näe varjatud sõnum peidus kõik need punased täpid. Siis Resize on programm, mis antud faili ja siis antud faili nimi, mis on väljundiks ja siis antud arv samuti, tegelikult selle suurust muuta bitmap selle täisarvuni. Siis lõpuks, meil on taastada pset. Meile antakse mälukaardile ja siis peavad tagasi nõudma kõik fotod mis on kogemata kustutatud, kuid, nagu me õpime, tegelikult ei kustutata ja toimikust kõrvaldada; me lihtsalt selline kadunud, kus nad olid toimikusse, kuid me ei kavatse taastada seda. Suur. Nii laskumist faili I / O Täpsemalt on need terve nimekirja ülesandeid, mis teid kasutades. Olete juba näinud natuke põhitõdesid fopen, fread ja ümbernimetamisel nimega, kuid me ei kavatse sügavamalt uurida mõnda faili I / O funktsioone nagu fputc, kus te lihtsalt kirjutada üks täht korraga, kuni fseek, kus sa sellist faili teisaldada asendinäit edasi ja tagasi, ja siis mõned teised. Aga me läheme sinna natuke hiljem jooksul pset. Nii et esimene, lihtsalt sattuda faili I / O enne kui me minema pset, avada faili näiteks mida sa pead tegema, on tegelikult määratud osuti selle faili. Nii et meil on FILE * pointer. Sel juhul, ma helistan ta on pointer, sest see saab olema minu infile. Ja nii ma lähen kasutada funktsiooni fopen ja seejärel faili nimi ja siis millises režiimis ma lähen tegelema faili. Nii et seal on "r" antud juhul lugeda, "w" kirjutamiseks ja seejärel "a" lisades. Näiteks, kui olete tegelevad infile ja kõik, mida tahame teha, on lugeda bitid ja baidid seal ladustatud, siis oled ilmselt läheb taha kasutada "r", nagu teie režiimis. Kui soovite tegelikult kirjutada, millist teha uue faili siis mida me kavatseme teha, on me kavatseme avada uus fail ja kasutada "w" režiim kirjalikult. Siis kui sa tegelikult lugemisel vastu võetud failid, struktuur on järgmine. Esmalt hulka kursor struct mis sisaldavad baiti, et sa loed. Nii et see saab olema lõpuks asukoht baiti, et sa loed. Sa siis lähed näitavad, suurus, meeldib põhiliselt mitu baiti Teie programm peab lugema, et faili suurus põhimõtteliselt üks element on, ja siis sa lähed täpsustada, kui palju elemente, mida soovite lugeda. Ja siis lõpuks, sa pead teadma, kus sa loed sealt nii et see saab olema teie ka osuti. Ma värvilisel neid, sest fread on ka väga sarnane ümbernimetamisel nimega, va soovite veenduda, et te kasutate õiges järjekorras, veenduge, et sa oled tegelikult kirjalikult või lugedes paremalt fail. Nii et siis nagu enne, kui meil on suurus element samuti mitmeid elemente, siis saame mängida siin natuke. Ütle Mul on koer struct ja nii siis ma tahan lugeda kaks koera korraga. Mida ma võiksin teha, on öelda suurus üks element saab olema suurus üks koer ja ma lähen tegelikult lugeda kaks neist. Teise mida ma võiksin teha, on öelda, ma lihtsalt loen ühte elementi ja et üks element saab olema suurus kaks koera. Nii et analoogne kuidas te saate sellist mängida suurus ja arv sõltuvalt sellest, mida on rohkem intuitiivne teile. Hea küll. Nii et nüüd saame kirjalikult faile. Kui soovite kirjutada faili esimene argument on tegelikult kuhu lugemine. Nii et põhimõtteliselt andmeid, et te ei kavatse kirjutada arvesse faili mis on välja kursor lõpus. Nii et kui olete tegelevad pset, veenduge, et te ei saa segi ajada. Võib-olla on mõisted kõrvuti. Võite tõmmata mõisted üles käsitsi kirjutades mees ja seejärel ümbernimetamisel nimega, näiteks terminali või saate saata tagasi sellele slaidile ja veenduge, et te kasutate õige. Nii et jällegi ümbernimetamisel nimega, kui sul on fail, mida soovite kirjutada arvesse, et see saab olema viimane argument ja mis saab olema osuti selle faili. Nii siis see, kuidas me käsitleme kirjalikult ehk mitu baiti korraga, aga oletame, et soovite lihtsalt kirjutada vaid üks märk. Nagu näeme hiljem selle Näiteks rasterpildid me peame kasutama seda. See, kui saame kasutada fputc sisuliselt lihtsalt paneb ühe märgi korraga, chr, arvesse faili viitaja, ja see on meie välja pointer seal. Siis kui me küsida või kirjutada faili fail on jälgida, kus me oleme. Nii et see on omamoodi kursori faili asendinäit. Ja nii iga kord, kui me kirjutada ja lugeda jälle faili fail tegelikult mäletab, kus see on, ja nii see jätkub, kus kursor. See võib olla kasulik, kui soovite, ütleme, lugeda teatud midagi teha ja siis loe järgmistes summa, kuid mõnikord me võiksite minna tagasi või tegelikult algavad teatud künnise. Siis fseek funktsioon, mida ta teeb on võimaldab meil liikuda kursori mõne faili teatud baitide arv. Ja siis me peame tegema, on määrata, kuhu on kontrollväärtus. Nii et kas see liigub edasi või tagasi, kust kursor parajasti on, või saame määrata, et see tuleb lihtsalt liikuda alates faili algusest või faili lõppu. Ja nii saab läbida negatiivne või positiivne väärtuste summa, ja mis liiki kursori kas edasi või tagasi. Enne kui me sattuda teiste psets, mis tahes küsimustele faili I / O? Okei. Nagu me sattuda rohkem näiteid, võid vabalt mind peatada küsimustele. Nii Dekkari, sa kätte bitmap faili sarnaneb see punane üks slaid, ja see näeb välja selline - hunnik punast täppi - ja sa tõesti ei tea, mis on kirjutatud. Kui teil kissitama, võib teil olla võimalik näha kerget sinakat värvi sees keskel. Sisuliselt see on kui tekst on salvestatud. Seal oli mõrv, mis juhtus, ja me peame teada saama, kes seda tegi. Selleks, et meil on vaja sellist teisendada see pildi loetavas vormingus. Kui te olete kunagi kokku puutunud selle, mõnikord oleks vähe komplektid kuhu oleks luup punase kile. Igaüks? Jah. Nii et sa oleks kätega midagi sellist, siis oleks luup punase kile üle, siis paneks ta üle pildi, ja teil oleks võimalik näha peidetud sõnumi teel. Meil ei ole luup punase kile, nii et selle asemel me ei kavatse sellist luua oma Selles pset. Ja nii kasutaja saab sisestada Dekkari, siis aimugi,. Bmp, nii see on infile, see punane täpp sõnum ja siis nad ütlevad verdict.bmp saab olema meie outfile. Nii see läheb, et luua uus digitaalkujutisena sarnane aimugi 1 välja arvatud loetavas vormingus, kus näeme varjatud sõnum. Kuna me ei kavatse tegelema toimetamine ja manipuleerimine rasterpildid mingisugune, me ei kavatse sellist sukelduda struktuurist need bitmap faili. Käisime üle need natuke loeng, kuid vaatame neisse veel. Rasterpildid on sisuliselt lihtsalt paigutus baiti kus me oleme määratud mis baitides tähenda midagi. Nii et siin on selline nagu linna digitaalkujutisena öeldes, et see algab mõned päisefaile, algab mõned andmed sinna. Sa näed, et umbes baidi number 14 suurus on näidustatud on digitaalkujutisena, ja see jätkub. Aga mida me tõesti huvitatud siin hakkab ümber baidi number 54. Meil on need RGB kolmikud. Mida see tegema hakkab on sisaldavad tegelike pikslit, värvi väärtused. Kõik eespool, et päises on natuke informatsiooni vastava pildi suurust, pildi laius ja kõrgus. Kui me astume polster hiljem, näeme miks pildi suurust võib olla teistsugune kui laius või kõrgus. Siis esindada neid - need rasterpiltide on järjestused baite - mida me võiksime teha, on öelda okei, ma lähen meeles pidada, et kell indeks 14 see on kui suurus on näiteks, kuid mitte see, mida me teeme selle lihtsamaks on kapseldada see struct. Ja nii on meil kaks structs näha meid, BITMAPFILEHEADER ja BITMAPINFOHEADER, ja nii iga kord, kui loeme selle faili, vaikimisi see saab olla läheb selleks, ja nii, et see ka läheb täita võetud muutujad nagu biWidth ja biSize. Ja siis lõpuks, iga piksel on esindatud kolm baiti. Esimene neist on summa sinine pixel teine ​​on summa roheline, ja lõpuks punase värvi, kus 0 on sisuliselt puudub sinine või ei ole roheline või mitte punane ja siis FF on suurim väärtus. Need on kuueteistkümnendväärtused. Siis kui meil on ff0000, siis see vastab maksimaalselt sinine ja siis ei roheline ega punane, nii siis mis annaks meile sinine piksel. Siis kui meil on ff on kõik ja kõikjal, siis see tähendab, et meil on valge piksel. See on omamoodi vastupidine tavaliselt siis, kui me ütleme, RGB. See on tegelikult toimub BGR. Nii et kui me tegelikult uurima näide digitaalkujutisena - las ma tõmban seda siin. See on natuke väike. Ma Suurendamine ja näeme see pixelated. Tundub plokid värvi. Sul on valge plokid ja seejärel punane plokke. Kui mängid Microsoft Paint, näiteks, siis võiks teha midagi sellist poolt põhimõtteliselt ainult maali teatud ruudud kindlas järjekorras. Nii siis mida see tähendab, et ka bitmap on järgmine. Siin on meil esimene valge pikslit, et kõik 6 on f-d, ja siis on meil punane pikslit, tähistatud 0000FF. Ja nii jada bytes et meil näitab, kuidas digitaalkujutisena läheb otsima. Nii, mida ma olen teinud siin on lihtsalt välja kirjutatud kõik need baidid ja seejärel värvitud punane nii et saate mingi vaata, kui sa kissitama natuke, kuidas sellist näitab naerunägu. Nii, et rasterpiltide töö on ma kujutan ette seda põhimõtteliselt nagu grid. Ja nii vaikimisi iga rida; peab olema mitu 4 baiti. Kui me vaatame digitaalkujutisena, sa oled täites iga väärtus. Näiteks võib teil olla punane siin, roheline siin, sinine siin, aga sa pead veenduge, et pilt on täidetud koos mitme neli baiti. Nii et kui ma tahan, et mu pilt on kolm plokki lai, siis ma oleks panna tühi väärtus viimase ühe teha see mitmekordselt neli. Siis lisan ka midagi, mida me nõuame polster. Ma lihtsalt näitamaks, et seal x. Nüüd ütleme, et me tahame pilt, mis on 7 pikslit pikad, näiteks. Meil on 1, 2, 3, 4, 5, 6, 7, ja kõik see täidab värvi. Nii, et bitmap pilte tegema on see, et peame 8. Just nüüd on meil 1, 2, 3, 4, 5, 6, 7. Vajame 8 ruumi digitaalkujutisena lugeda õigesti. Nii siis, mida me peame tegema, on lisada ainult natuke polster veenduda, et kõik laiused on ühtne ja et kõik laiused on 4-ga. Ja nii ma eespool märkisin, polster kui x või sakiline joon, kuid tegelik rasterpiltide polster on näidatud kuueteistkümnendsüsteemis 0. Nii, et oleks üks sümbol, 0. Mis võib tulla mugav on XXD käsk. Mis see on tegelikult näitab teile, nagu sarnane sellega, mida ma tegin enne koos smiley kui ma tegelikult välja printida, mida iga värv oleks piksel ja siis värvilisel see, kui sa jooksed XXD selliste käskudega, siis see tegelikult välja printida, mida värvid on neile pikslit. Mida sa pead tegema, on siin ma näidata, nagu-s 54 ütleb, et ma lähen alustada 54. bait sest enne seda, mäletad kui me vaatame tagasi linna rasterpildid, see on kõik päiseteavet ja asjad niimoodi. Aga mida me tõesti hoolivad on tegelik pikslit, mis näitavad värvi. Nii et lisades selle lipu-s 54, siis suudame näha värvi väärtused. Ja ärge muretsege keeruline lipud ja asjad niimoodi. Kui probleem komplekt spec, pead juhiseid, kuidas kasutada XXD kuvada pikslit. Nii et kui näete siin, see selline välja näeb roheline kast, see väike asi. Olen värvilisel 00ff00 nagu põhimõtteliselt öelda ei sinine, palju rohelist, ja ei punane. Nii et vastab roheline. Nagu näete siin, me näeme roheline ristkülik. See roheline ristkülik on ainult 3 pikslit lai, nii siis mida me peame tegema veenduda, et pilt on 4-ga lai on lisada extra padding. Ja nii siis see on, kuidas sa näed neid 0s siin. See tegelikult olla tingitud teie Resize pset, sisuliselt võttes väike bitmap ja siis suurenda seda 4. Ja nii me näeme, et tegelikult see pilt on 12 pikslit lai, kuid 12 on 4-ga, ja nii me tegelikult ei näe 0s lõpus, sest meil ei ole vaja lisada mõni sest see on täielikult polsterdatud. See ei ole enam ruumi. Okei. Küsimusi polster? Okei. Lahe. Nagu ütlesin, rasterpildid on lihtsalt jada bytes. Ja mis meil on selle asemel, et jälgida täpselt, mis number bait vastab spetsiifilise elemendi, me tegelikult oleme loonud struct esindada seda. Mis meil on RGBTRIPLE struct. Kui sul on näiteks on RGB kolmekordne, sest see on teatud tüüpi määratleda struktuure, siis pääsete rgbtBlue muutuja, sarnaselt roheline ja punane muutujad, mis näitab, kui palju sinine, roheline ja punane, vastavalt sul on. Nii et kui meil on sinine muutuja väärtuseks 0, roheline komplekt FF mis on maksimaalne väärtus saab olla, ja siis punane muutuja väärtuseks 0, siis mis värvi oleks see eriti RGB kolmekordne koosneb? >> [Üliõpilane] Green. Green. Täpselt. See saab olema kasulik teada, et kui teil on astme RGB kolmekordne, tegelikult võite kasutada suuruse värv - sinine, roheline ja punane - eraldi. Nüüd, kui me rääkisime struktuuri, et võtame pilk BMP faili. Need on structs tehtud teie jaoks. Siin on meil BITMAPFILEHEADER struct. Huvi on suurus. Hiljem, meil on infot päis, mis on veel mõned asjad, mis on huvitav meile, nimelt suurus, laius ja kõrgus. Nagu me minna hiljem, kui sa lugeda toimikule, see automaatselt loeb, sest oleme seadnud selleks, et olla sama. Nii biSize sisaldab õigust baiti, mis vastavad tegelikule suurusele pilt. Ja siis siin lõpuks, nagu me rääkisime, meil on RGBTRIPLE typedef struktuure. Meil on rgbtBlue, roheline ja punane sellega seotud. Suur. Okei. Nüüd, kui me mõistame rasterpildid natuke aru, et meil on faili päis ja info kaudu seotud ja siis pärast, et meil on huvitav kraam värvid, ja need värvid on esindatud RGBTRIPLE structs, ja need omakorda on kolm väärtused seotud sinine, roheline ja punane. Nii et nüüd saame omamoodi mõelda Recover veidi. Vabandust. Mõtle Dekkari. Kui meil aimugi faili, siis mida me tahame teha, on lugeda, et see pikselhaaval ja siis kuidagi muuta need pikslid, et saaksime väljastada see loetavas vormingus. Ja nii väljund, siis me läheme kirjutada pikselhaaval arvesse verdict.bmp faili. See on kuidagi palju teha. Me mõistame, et. Nii et mida oleme teinud, on meil tegelikult annab teile copy.c. Mis copy.c teeb, on lihtsalt teeb täpse koopia antud bitmap faili ja siis näitab seda. Nii see juba avab faili teile, loeb pikselhaaval, ja siis kirjutab ta arvesse väljundfaili. Võtame pilk seda. See on tagada nõuetekohane kasutamine, saada failinimesid siin. Mis see on see seab sisendfail olema, mida oleme möödunud aastal ka infile siin, mis on meie teine ​​käsurea argument. Kontrollib, et veenduda, et saame avada faili. Kontrollib, et veenduda saame teha uusi outfile siin. Siis sa mida see siin, see lihtsalt põhimõtteliselt hakkab lugemise sisse bitmap faili algusest. Alguses, nagu me teame, sisaldab BITMAPFILEHEADER, ja nii need järjestused bittide aitab otseselt täita BITMAPFILEHEADER. Nii et meil on siin ütleb, et BITMAPFILEHEADER BF - see on meie uus muutuja tüüpi BITMAPFILEHEADER - me lähme sinna sisse panna bf mida me lugeda ka pointer, mis on meie infile. Kui palju me lugeda? Me loeme mitu baiti peame sisaldada kogu BITMAPFILEHEADER. Samuti see, mida me teeme infot päises. Nii et me jätkuvalt mööda meie faili infile, ja me pidime lugema need bitid ja baidid, ja me kõrvaldamine neid otse nendesse juhtumeid muutujad, mida me teeme. Siin me oleme lihtsalt tegemise kindel, et bitmap on bitmap. Nüüd on meil outfile, eks? Nii nagu see on, kui me loome, see on sisuliselt tühi. Nii et me peame põhimõtteliselt luua uue bitmap nullist. Mis me teeme, on meil veenduda, et me kopeerida faili päis ja info kaudu nagu infile on. Mis me teeme, on me kirjutame - ja pidage meeles, et bf on muutuja Tüübi BITMAPFILEHEADER, nii et mida me teeme, on meil lihtsalt kasutada, et sisu kirjutada arvesse outfile. Siin, mäletad me rääkisime polster, kuidas see on oluline veenduda, et summa pikslit et meil on 4-ga. See on päris kasulik valem arvutada, kui palju polster teil on antud laius fail. Ma tahan, et te meeles pidada, et copy.c meil arvutamise valem polster. Okei? Nii et igaüks meeles pidama. Suur. Nii siis mida copy.c ei järgmisena on ta kordab üle kõik scanlines. Ta läheb läbi rida ja siis salvestab iga kolmekordne et see loeb ja siis kirjutab see outfile. Nii siis siin me pidime lugema vaid üks RGB kolmekordne korraga ja siis panna, et sama kolmekordne arvesse outfile. Keeruline osa on see, et polster ei ole RGB kolmekordne, ja seega ei saa me just lugesin, et polster summa RGB kolmikud. Mida me peame tegema, on tegelikult lihtsalt liikuda meie pildi asendinäit, liikuda meie kursori et selline Otse üle kõik pehmendusega nii, et me oleme järgmisel real. Ja siis mida see teeb, on koopia näitab teile, kuidas võiksite lisada polster. Nii oleme arvutanud, kui palju padding peame, nii et tähendab, et peame polster arv 0.. Mis see on jaoks silmus, mis paneb polster arv 0. meie outfile. Ja siis lõpuks, kui sulgete mõlemad failid. Sulgete infile samuti outfile. Nii see on, kuidas copy.c töid, ja et see saab olema päris kasulik. Selle asemel, et lihtsalt tegelikult otseselt kopeerimist ja kleepimist või lihtsalt vaadata seda ja kirjutama mida iganes sa tahad, võite lihtsalt tahan seda käsklust terminalis, cp copy.c whodunit.c, mis loob uue faili, whodunit.c, , mis sisaldab täpselt sama sisu kui koopia teeb. Nii siis, mida me teha saame, on kasutada seda raamistikku, millele ehitada ja muuta meie Dekkari faili. Need on meie jaülesandeid teha Dekkari, kuid mida copy.c ei tegelikult hoolitseb enamik neist meie jaoks. Nii et kõik me peame tegema järgmisena on muuta pikslite vaja et tegelikult teevad faili loetav. Pea meeles, et antud piksli kolmekordne, nii et antud tüüpi muutuja RGBTRIPLE, pääsete sinine, roheline ja punane väärtused. See saab tulla mugav, sest kui sa ei pääse neile ligi, see tähendab, et sa võid ka vaadata neid, ja mis tähendab, et saate ka muuta. Nii et kui me läksime tagasi meie punane luubi näiteks põhimõtteliselt, et toimis omamoodi filter meile. Nii et see, mida me tahame teha, on meil soovite filtreerida kõik kolmikute et tulevad sisse On mitmeid erinevaid viise, kuidas seda teha. Põhimõtteliselt saab olla mis iganes tüüpi filtreid soovite. Võib-olla soovid muuta kõik punased pikslit või äkki soovite muuta eri värvi pikslit erinevat värvi. See on sinust. Pea meeles, et saate vaadata mis värvi piksel on ja siis saate ka seda muuta kui sa lähed läbi. Okei. Nii et Dekkari. Kui sa jooksed Dekkari, tead kes süüdlane kuritegu oli. Nüüd läheme suurust. Me läheme ikkagi tegelevad rasterpildid. Mida me kavatseme teha, on meil lähed on sisend bitmap ja siis me lähme edasi mitmes ja siis saad outfile bitmap kui see on põhimõtteliselt meie infile korrastatakse n. Ütle minu fail oli lihtsalt üks piksel suur. Siis kui minu n oli 3, tagi 3, siis ma kordan, et pixel n arv kordi, nii 3 korda ja siis ka skaala selle alla 3 korda samuti. Nii et näete ma tagi see vertikaalselt kui ka horisontaalselt. Ja siis siin on näide. Kui teil on n = 2, siis näeme, et esimene sinine piksel seal korratakse kaks korda horisontaalselt kui ka kaks korda vertikaalselt. Ja siis see jätkub, ja nii et teil on otsene tagi oma originaalpilt kahega. Siis kui me üksikasjalikult pseudokoodi selles, tahame avada faili. Ja siis teades, et kui me läheme tagasi siia, näeme, et laius outfile saab olema teistsugune kui laius infile. Mida see tähendab? See tähendab, et meie header information hakkab muutuma. Ja mis me tahame teha, on uuendada päises info, teades, et kui me lugeda faile, kui olete tegutsevad copy.c raamistik, meil on juba muutuja, mis näitab, mida suurus ja muud sellised asjad. Nii et kui sul on see, mida sa tahad teha, on muuta need eriti muutujad. Pea meeles, kui sul on struct, kuidas teile juurdepääsu muutujate et. Sa kasutad dot operaator, eks? Siis kasutades, et sa tead, et sa pead muuta header infot. Nii et siin on lihtsalt nimekiri tegelik elemente, mis ei kavatse olla muutumas oma faili. Faili suurus saab olema muutuv, pilt, samuti laius ja kõrgus. Siis lähen tagasi linna rasterpildid, vaadata, kas see on faili päist või info päis, mis sisaldab kõnealust teavet ja siis muuda vastavalt vajadusele. Jällegi ütlen cp copy.c resize.c. See tähendab, et resize.c nüüd sisaldab kõike, mis sisalduvad sees koopia sest koopia annab meile viis lugemist igale scanline pikselhaaval. Välja arvatud nüüd, selle asemel, et lihtsalt muutuvad väärtused nagu me tegime Dekkari, mida me tahame teha, on meil soovi kirjutada mitu pikslit nii kaua kui meie n on suurem kui 1. Siis mida me tahame teha, on me tahame venitada seda horisontaalselt n, samuti venitada vertikaalselt n. Kuidas võiks me seda teeme? Ütle oma n on 2 ja teil on see antud infile. Kursor kavatseb alustada esimesel üks, ja mida sa tahad teha, kui n on 2, mida soovite printida 2 neist. Nii et teil on vaja printida 2 neist. Siis kursor läheb liikuda järgmisele pikslit, mis on punane, ja see läheb välja printida 2 need punased, lisades selle peale, mida ta on teinud varem. Siis kursor liigub järgmisele pikslit ja juhtida 2 neist. Kui te vaatate tagasi copy.c raamistik, mida see teeb siin on see loob uue astme RGB kolmekordne, uus muutuja nimega kolmekordne. Ja siin, kui ta loeb selle sisse, see loeb infile 1 RGBTRIPLE ja salvestab selle sees, et kolmekordne muutuja. Nii siis tegelikult on muutuja esindab et eriti pixel. Siis kui sa kirjutad, mida sa tahad teha, on kapseldada ümbernimetamisel nimega arvestusest jaoks silmus et kirjutab ta oma outfile nii mitu korda kui vaja. See on piisavalt lihtne. Lihtsalt põhimõtteliselt korrata kirjutamise protsessi n arv kordi skaala seda horisontaalselt. Aga siis me peame meeles pidama, et meie polster hakkab muutuma. Varem öelda, et meil oli midagi pikkusega 3. Siis võiks lihtsalt lisada, kui palju polster? Veel üks teha see 4-ga. Aga öelda, et me tagi selle konkreetse pildi n = 2. Nii siis kui palju sinine pikslit oleks meil lõpus? Meil oleks 6. 1, 2, 3, 4, 5, 6. Hea küll. 6 ei ole 4-ga. Mis oleks lähim 4-ga? See saab olema 8. Nii et me tegelikult läheb on 2 märki padding seal. Kas keegi mäletab, kui meil on valem arvutada polster ja kus see võiks olla? [Kuuldamatu õpilase vastus] >> Jah, copy.c. Õigus. On valem copy.c arvutada, kui palju polster teil on antud konkreetse laius digitaalkujutisena. Nii siis, et see saab olema kasulik, kui teil on vaja lisada teatud summa padding et tegelikult aru saada, kui palju polster teil on vaja lisada. Aga üks märkus, kuigi see, et sa tahad veenduda, et te kasutate õige suurusega. Lihtsalt olla ettevaatlik, sest sa oled põhiliselt hakatakse lähtuma kahest bitmap pilte. Sa tahad teha kindel, et te kasutate õige. Kui olete arvutamise padding outfile, mida soovite kasutada laius outfile ja mitte laius eelmine. Suur. Selline hoolitseb venitades kogu digitaalkujutisena horisontaalselt. Aga mida me tahame teha, on tegelikult venitada vertikaalselt samuti. See saab olema natuke keerukam, sest kui me oleme lõpetanud kopeerimise järjest ja kirjalikult, et rida, meie kursor saab olema aasta lõpus. Nii et kui me uuesti lugeda, siis see on lihtsalt loen ka järgmisele reale. Nii et mida me tahame teha, on selline leia kuidagi kopeerimine need read uuesti või lihtsalt selline võttes selle rea ja siis ümberkirjutamist uuesti. Nagu ma sellist vihjas, on mitmeid erinevaid viise seda teha. Mida võiks teha, on kui sa lähed läbi ja lugedes eriti scanline ja muutmist vajalikuks, siis sellist poodi kõik need pikslid massiivi. Siis hiljem te teate, et teil on vaja printida, et massiivi taas ja nii saab lihtsalt kasutada, et massiivi teha. Teine viis seda teha on siis võiks kopeeri alla üks rida, aru, et teil on vaja kopeerida seda uuesti, nii tegelikult kursori, ja mis saab olema meetodil fseek. Sa võid kursori kogu tee tagasi ja korrake koopia protsessi uuesti. Nii et kui meie tagi arv on n siis kui mitu korda oleks me peame tagasi minema ja kirjutada rida? >> [Üliõpilane] n - 1. >> Jah, täiuslik. n - 1. Me tegime seda kord juba nii, siis me tahame korrata naasmine protsessi n - 1 arv kordi. Okei. Nii et teil on oma resize funktsiooni. Nüüd saame tõesti lõbus osa, minu lemmik pset, mis on Recover. Selle asemel rasterpildid, seekord me tegeleme JPEG. Me tegelikult ei antud faili lihtsalt ja JPEG, me antud põhiliselt toore mälukaardi formaati. Ja nii see sisaldab natuke infot ja prügi väärtusi alguses, ja siis algab ja see on hunnik JPEG-faile. Kuid me kätte kaardi, kus oleme välja pildigalerii; Sisuliselt me ​​oleme unustanud, kus pildid asuvad kaardiga. Nii siis meie ülesanne Recover on minna läbi selle kaardi kujul ja leida need pildid uuesti. Õnneks struktuur JPEG failide ja kartoteek on natuke abiks. See kindlasti oleks võinud olla veidi keerukam, kui poleks olnud selles konkreetses formaadis. Iga JPEG faili tegelikult algab kahe võimalik järjestusi, mis on loetletud eespool. Põhimõtteliselt kui sul on uus JPEG faili see algab kas jada ffd8 ffe0 või teine, ffd8 ffe1. Veel üks kasulik asi on teada, et JPEG hoitakse contiguously. Nii et kui keegi JPEG faili lõpeb, teine ​​algab. Nii et ei ole mingeid vahepeal väärtusi seal. Kui oled tabanud algust JPEG, kui olete juba lugenud JPEG, sa tead, et oled tabanud lõpus eelmise ja algust järgmise üks. Et selline visualiseerida seda, ma tegin skemaatiline. Teine asi JPEG on see, et me saame lugeda neid järjestusi 512 baiti korraga, Sarnaselt aasta algusega kaardiga. Meil ei ole vaja kontrollida iga ühe baidi, sest see oleks nõme. Nii et selle asemel, mida me teha saame, on tegelikult lihtsalt lugeda 512 baiti korraga ja siis selle asemel, kontrollides nende vahel nendes tilluke viilud, saame vaid vaadata alguses 512 baiti. Sisuliselt on see pilt, mida sa näed on aasta alguses kaardi, teil on väärtused, mis ei ole tegelikult seotud tegelike JPEG ise. Aga siis mis mul on täht, mis näitab üks kahest alustades järjestused JPEG. Nii et kui näed täht, sa tead, et sul on JPEG-faili. Ja siis iga JPEG faili saab olema teatud arv 512 baiti kuid mitte tingimata samad mitu. Nii, et sa tead, et oled tabanud teise JPEG on kui vajutad teise star, teine ​​algab jada bytes. Siis mida sa pead siin on sul punane JPEG faili jätkata seni, kuni te tabanud täht, mis tähistab uue värvi. Sa jätkata ja siis põrkad teise täht, vajutad teise JPEG, jätkad kogu tee lõpuni. Sa oled viimasel pildil siin, roosa. Sa lähed lõpuni kuni vajutad faili lõppu iseloomu. See saab olema väga kasulik. Mõned peamised takeaways siin: Kartoteek ei alga JPEG, aga kui JPEG algab kõik JPEG hoitakse kõrvuti üksteisega. Mõned pseudokoodi jaoks taastada. Esiteks, me avada meie kartoteek, ja mis on kavatse olla kasutades meie Faili I / O funktsioone. Me läheme kordama järgmist protsessi, kuni oleme jõudnud faili lõppu. Me läheme lugeda 512 baiti korraga. Ja mida ma ütlesin siin on me kavatseme seda säilitada puhver, nii et põhimõtteliselt kinni hoida neid 512 baiti kuni me teame täpselt, mida teha nendega. Siis mida me tahame teha, on me tahame kontrollida, kas oleme tabanud täht või mitte. Kui me oleme tabanud täht, kui oleme tabanud üks alustades järjestused, siis me teame, et oleme tabanud uus JPEG faili. Mida me tahame teha, on meil lähed tahan luua uus fail meie pset4 kataloog tegemise jätkamiseks, et faili. Aga ka, kui me oleme juba teinud JPEG enne, siis me tahame lõpetada selle faili ja lükake seda pset4 kausta kus me peame selle faili salvestatud, sest kui me ei täpsustata, et me oleme jõudnud, et JPEG faili siis me põhimõtteliselt on määramata summa. JPEG lõpe kunagi. Nii et me tahame veenduda, et kui me lugemist, et JPEG-faili ja kirjalikult, tahame konkreetselt sulgeda, et selleks, et avada järgmise üks. Me tahame kontrollida mitut asja. Tahame kontrollida, kas me oleme alguses uue JPEG meie puhver ja ka siis, kui me juba oleme leidnud JPEG enne sest, mis muudab teie protsessi veidi. Nii et siis pärast sa lähed läbi kogu tee ja vajutad faili lõppu, siis mida sa teha tahad on, mida sa tahad sulgeda kõik failid, mis on praegu avatud. See on arvatavasti viimane JPEG fail, mis teil on, samuti kartoteek, et olete tegelenud. Viimane takistus, et me peame tegelema on see, kuidas tegelikult teha JPEG-faili ja kuidas tegelikult lükake seda kausta. Pset nõuab, et iga JPEG et te leiate olema järgmises vormingus, kus sul on number. jpg. Arv, isegi kui see on 0, me nimetame seda 000.jpg. Kui sa leiad JPEG oma programmi, sa lähed tahan nimetada seda et see on leitud. Mida see tähendab? Me peame mingi jälgida, kui palju oleme leidnud ja mis number iga JPEG peaks olema. Siin me läheme ära sprintf funktsioon. Sarnaselt printf, mis lihtsalt selline graafika väärtus viidud terminal, sprintf prindib faili viidud kausta. Ja mis see teeks kui mul oleks sprintf pealkiri ja seejärel string seal, oleks välja printida 2.jpg. Eeldades, et ma olen suletud minu faile õigesti, mis sisaldavad faili, et olin kirjalikult läbi. Aga üks asi on see, et kood, mis mul siin ei ole päris rahuldavad mida pset nõuab. Pset nõuab, et teine ​​JPEG faili nimi peaks olema 002 asemel vaid 2. Nii et kui sa välja printida nimi, siis ehk võiksite muuta kohatäide pisut. Kas keegi mäletab, kuidas me lubada lisatühikud me printida midagi? Jah. >> [Üliõpilane] Paned 3 vahel protsendimärk ja 2. >> Jah, täiuslik. Sa paned 3 käesolevas asjas, kuna tahame ruumi 3. % 3d oleks ilmselt teile 002.jpg 2 asemel. Esimene argument arvesse sprintf funktsioon on tegelikult char massiiv, mis me varem teadnud, kui stringid. Need tahe, selline rohkem nagu ajutine ladustamine, lihtsalt salvestada tulemuseks oleva stringi. Sa ei tõesti tegelema, kuid teil on vaja kaasata. Teades, et iga faili nimi on arv, mis kulub kolm märki, ja siis. jpg, kui kaua peaks see massiiv olla? Viska number. Mitu tähemärki pealkirjas, nime? Nii et seal on 3 hashtags, periood, jpg. >> [Üliõpilane] 7. >> 7. Mitte päris. Me läheme taha 8, sest me tahame, et võimaldada null terminaator samuti. Lõpuks lihtsalt venitama protsessi, et sa pead olema teinud juba taastuma, teil on mõned alguses teavet. Sa jätkata kuni leiad algust JPEG faili ja mis võib olla kas üks kahest alustades järjestusi. Sa lugedes. Iga kaldkriipsuga siin esindab 512 baiti. Sa lugedes, lugedes kuni sul tekib teise Käivitusjärjekord. Kui olete, et te lõpuks praeguse JPEG - sel juhul on punane, nii et sa tahad lõpetada seda. Sa tahad sprintf nime, et oma pset4 kausta siis sa tahad, et avada uus JPEG ja siis lugedes kuni sul tekib järgmine. Lugedes, lugedes, ja siis lõpuks, lõpuks, sa lähed, et jõuda lõpuks fail, ja et sa tahad sulgeda viimase JPEG et sa töötasid, sprintf et oma pset4 kausta ja seejärel vaadata kõiki pilte, et olete saanud. Need pildid on tegelikult pilte CS50 personal ja nii see on kui boonus lõbus osa pset jõuab on see, et te olete võistlevad oma osa leida TFS pilte ja pildistada neid tõestada, et sa oled teinud pset ja nii saab näha, millised töötajad on pildid. Nii siis pildistada nii, et töötajad. Vahel pead jälitama neid. Ilmselt mõned neist püüavad põgeneda sind. Pildistada neid. See on pidev. See ei ole tingitud kui pset põhjuseks. Tähtaeg tehakse teatavaks spec. Siis koos oma jagu, kumb osa võtab kõige pilte kõige töötajat võidab päris vinge auhind. See on omamoodi stiimul saada oma pset4 valmis nii kiiresti kui võimalik sest siis saab pikali äri jaht sätestatakse kõik erinevad CS50 töötajat. See ei ole kohustuslik, küll, et kui sa saad pilte siis olete lõpetanud pset4. Ja ma olen lõpetanud kiirtutvustus 4, nii et tänan teid kõiki, et tulite. Õnn kohtumeditsiini. [Aplaus] [CS50.TV]