[Powered by Google Translate] [Návod - Problém Set 4] [Zamyla Chan - Harvard University] [To je CS50. - CS50.TV] Dobrá. Ahoj, všichni, a vítejte na Walkthrough 4. Dnes je naše Pset je forenzní. Forenzní je opravdu zábavná Pset, který zahrnuje jednání s bitmapové soubory zjistit, kdo spáchal zločin. Pak budeme velikost nějaké bitmapové soubory, pak jsme také bude zabývat opravdu zábavné části zvané Recover, , ve kterém jsou si v podstatě podal paměťové karty ve kterém někdo omylem smazali všechny své soubory, a my jsme vyzváni k vymáhání těchto souborů. Ale nejdřív, než se dostaneme do PSet, já opravdu chci pogratulovat všem. Jsme asi ve středu tohoto kurzu. Kvíz 0 je za námi, a my jsme na pset4, takže v podstatě, jsme na půli cesty. Ušli jsme dlouhou cestu, když se podíváte zpět na seznam psets, pset0 a pset1, tak poblahopřát sami o tom, a budeme se dostat do nějaké opravdu zábavné věci. Takže naše toolbox pro tento PSet, opět, místo toho, sudo yum-y update, jsme schopni jen spustit update50, pokud jste na verzi 17.3 a vyšší spotřebiče. Takže je třeba spustit update50 - je to mnohem jednodušší, několik méně znaků - Ujistěte se, že jste na nejnovější verzi spotřebiče. Zejména je důležité, aby update50, když začneme používat CS50 kontrolu. Takže se ujistěte, že jste to udělal. Pro všechny části pro tento Pset, budeme se zabývat souborů vstupy a výstupy, soubor I / O. Budeme jít přes mnoho programů, které se zabývají poli směřující k souborům a podobné věci, které, tak chceme, aby se ujistil, že jsme opravdu známé a pohodlné zabývající se jak vstup a výstup do souborů. V distribuční kódu pro tento PSet je soubor s názvem copy.c, a to je to, co budeme najít je bude opravdu užitečné pro nás protože budeme skončit skutečně kopírování copy.c soubor a jen měnit mírně, aby mohli dosáhnout prvních 2 části problému sady. A pak se, jak jsem se zmínil výše, máme co do činění s bitmapami i jako JPEG. Takže opravdu pochopení struktury, jak jsou organizovány tyto soubory, Jak můžeme opravdu překládat 0s a 1s do structs a věci, které můžeme skutečně pochopit a interpretovat a upravovat, to bude opravdu důležité, takže jít do JPEG a bitmapové soubory a pochopení struktury z nich. Pset4, jako obvykle, začíná část otázek. Ti se budou zabývat souborem I / O a vám zvyklí na to. Pak část 1 je detektivka, ve které budete stejně bitmapový soubor , která vypadá trochu jako červené tečky po celém těle. A pak v podstatě to, co budeme dělat, je vzít tento soubor a stačí upravit lehce na verzi, že můžeme číst. V podstatě, když jsme dokončit, budeme mít stejný soubor, kromě budeme moci vidět skrytou zprávu skryté všemi těmi červenými tečkami. Pak Resize je program, který, vzhledem soubor a pak daný název souboru, který výstupy a pak jim přiděleno číslo, stejně, bude skutečně zmenšit tento bitmapu tímto celočíselnou hodnotu. Pak konečně, máme obnovit PSet. Dostáváme paměťovou kartu a pak obnovit všechny fotografie , které byly omylem odstraněny, ale, jak se dozvíme, nebude odstraněn a ze souboru odstraněny; jsme tak nějak ztratila, kde byli v souboru, ale budeme obnovit to. Great. Takže když do souboru I / O konkrétně se jedná o celý seznam funkcí, které budete používat. Jste již viděli trochu základy fopen, fread, fwrite a, ale budeme se podívat dále do nějakého souboru I / O funkce, jako je fputc, , ve kterém stačí napsat jeden znak v době, na fseek, kde tak nějak přesunout soubor ukazatel polohy vpřed a vzad, a pak někteří jiní. Ale půjdeme do toho trochu později PSet. Takže první, jen aby se dostali do souboru I / O než půjdeme do PSet, k otevření souboru, například, co musíte udělat, je skutečně nastaven ukazatel k tomuto souboru. Takže máme FILE * ukazatel. V tomto případě, volám, že ukazovátko, protože to je bude můj infile. A tak budu používat funkce fopen a pak název souboru a pak režim, ve kterém budu se zabývat se souborem. Takže tam je "r" v tomto případě pro čtení, "w" pro psaní, a pak "" pro přidávání. Například, když máte co do činění s vstupni_soubor a vše, co chcete udělat, je přečíst bitů a bajtů uložené tam, pak jste pravděpodobně bude chtít použít "r" jako režim. Pokud chcete skutečně psát, druh vytvořit nový soubor, pak to, co budeme dělat, je budeme otevření nového souboru a použijte tlačítko "w" režimu pro psaní. Takže, když jste vlastně čtení do souborů, struktura je následující. Nejprve se patří ukazatel na struct, který bude obsahovat bajtů, které čtete. Takže to bude konec umístění bajtů, které čtete. Ty pak bude zobrazovat pouze velikost, rád v podstatě kolik bajtů váš program musí přečíst do souboru, velikost v podstatě jeden prvek, a pak budete určit, kolik prvků si chcete přečíst. A pak konečně, musíte vědět, kde jste čtení z, takže to bude tvůj v ukazatel. I barevně odlišeny, neboť dle fread je také velmi podobné fwrite, kromě chcete, aby se ujistil, že používáte správné pořadí, ujistěte se, že jste skutečně zápisu a čtení z pravé souboru. Takže jako předtím, pokud budeme mít velikost prvku, stejně jako počet prvků, pak můžeme hrát tady trochu. Řekněme, že mám psa, struct, a tak jsem si přečíst dva psi najednou. To, co jsem mohl udělat, je říci, že velikost jednoho prvku bude velikost jednoho DOG a budu skutečně číst dva z nich. Případně, co jsem mohl udělat, je říct, že jsem jen tak číst jeden prvek a že jedním z prvků bude velikost dvou psů. Tak to je obdobné, jak můžete trochu pohrát s velikostí a počtem v závislosti na tom, co je více intuitivní pro vás. Dobrá. Takže teď se dostáváme k psaní souborů. Pokud chcete napsat soubor, první argument je vlastně kam čtení z. Takže to je v podstatě data, která budete psát do souboru, který je mimo ukazatel na konci. Takže když máte co do činění s PSet, ujistěte se, že se zmást. Možná mají definic bok po boku. Můžete vytáhnout definice v příručce zadáním muže a pak fwrite, například, v terminálu, nebo se můžete obrátit zpět k tomuto snímku a ujistěte se, že používáte správný. Takže znovu, pro fwrite, když máte soubor, který chcete zapsat do, že to bude poslední argument a že to bude ukazatel do tohoto souboru. Takže to, jak jednáme s psaním snad několik bajtů v době, ale že chcete stačí napsat jen v jednom znaku. Jak uvidíme později v tomto příkladu, v bitmapy budeme muset použít. To je, když můžeme použít fputc, v podstatě jen uvedení jeden znak v době, chr, do souboru ukazatel, a to je naše se ukazatel tam. Takže vždy, když se snažíme, nebo psát v souboru, soubor je sledování, kde jsme. Takže je to druh kurzoru, pozice v souboru indikátorů. A tak když jsme psát nebo číst znovu do souboru, soubor skutečně pamatuje, kde je to, a tak to pokračuje od místa, kde je kurzor. To může být výhodné, když chcete, řekněme, přečtěte si v určitém množství něco udělat a pak si v následující výši, ale někdy bychom mohli chtít vrátit, nebo skutečně začít od určitého referenční hodnoty. Takže funkce fseek, co dělá, je nám umožňuje pohybovat kurzorem v určitém souboru určitý počet bajtů. A pak to, co musíme udělat, je určit, kde referenční hodnota. Takže buď se pohybuje dopředu nebo dozadu od místa, kde se kurzor je v současné době, nebo se může určit, že by měl jen pohybovat od začátku souboru nebo od konce souboru. A tak si můžete projít v záporných nebo kladných hodnot na částku, a že se bude trochu pohybovat kurzorem buď dopředu nebo dozadu. Než jsme se dostali do dalších psets, jakékoli otázky týkající se souboru I / O? Dobře. Jak jsme se dostali do další příklady, neváhejte mě zastavit na otázky. Takže v detektivka, jste podal bitmapový soubor podobný tomuto červeným na snímku, a vypadá to, že to - banda červených teček - a opravdu nevím, co je napsáno. Pokud šilhání, můžete být schopni vidět mírný modravou barvu uvnitř uprostřed. V podstatě, že je místo, kde je uložen text. Tam byla vražda, co se stalo, a my musíme zjistit, kdo to udělal. Aby k tomu, že, musíme trochu převést tento obraz do čitelného formátu. Pokud jste se někdy setkali tento, někdy tam bude malé soupravy kde budete mít lupu s červeným filmem. Každý, kdo? Jo. Takže byste se pravou rukou něco takového, měli byste mít lupu s červeným filmu nad ním, byste dát to přes obraz, a měli byste být schopni vidět zprávy skryté v něm. Nemáme zvětšovací sklo s červeným filmem, a tak místo toho budeme druh vytvořit vlastní v tomto PSet. A tak se uživatel bude vstupní detektivka, pak stopa,. Bmp, tak to je infile, že je red dot zpráva, a pak říkají verdict.bmp bude náš outfile. Takže to bude vytvořit nový bitmapový obraz podobný vodítko jeden s výjimkou v čitelném formátu, kde můžeme vidět skrytou zprávu. Vzhledem k tomu, že budeme jednat s editaci a manipulaci s rastry nějakého druhu, budeme druhu ponoru v do struktury těchto bitmapové soubory. Šli jsme přes tyto trochou v přednášce, ale pojďme se podívat do nich něco víc. Rastry jsou v podstatě jen uspořádání bajtů kde jsme určit, která bytů říct, co. Takže tady je něco jako mapa bitmapového obrazu říká, že to začíná u některých hlavičkových souborů, začíná nějaké informace v tam. Můžete vidět, že asi na byte čísla 14 je velikost uvedena na bitmapového obrazu, a to pokračuje dál. Ale pak to, co jsme opravdu zajímá je zde začíná kolem bytového číslo 54. Máme tyto RGB trojčíslí. Co to udělá, je obsahují skutečné pixely, barevné hodnoty. Vše výše, že v záhlaví je nějaké informace odpovídající velikosti obrazu, šířkou obrazu, a výšky. Když jdeme do polstrováním později, uvidíme, proč je velikost obrazu se může lišit od šířky nebo výšky. Takže pak představují tyto - tyto bitmapové obrázky jsou sekvence bajtů - co bychom mohli udělat, je říct jo, budu si pamatovat, že v indexu 14, že je-li velikost, například, ale to, co budeme dělat, aby to jednodušší je zapouzdřit do struct. A tak máme dvě structs vyrobené pro nás, BITMAPFILEHEADER a BITMAPINFOHEADER, a tak vždy, když jsme si do tohoto souboru, ve výchozím nastavení to bude jít v pořádku, a tak, aby to také bude vyplňovat do proměnných, jako je biWidth a biSize. A pak konečně, je každý pixel reprezentován třemi bajty. První z nich je množství modré pixelu, druhý je množství zeleně, a konečně, množství červené, kde 0 znamená v podstatě žádné modrá nebo zelená ani žádný červený a pak ff je maximální hodnota. Jedná se o hexadecimální hodnoty. Takže pokud máme FF0000, pak to odpovídá maximální výši modré a pak už zelené a ne červený, tak pak by to bylo nám Blue Pixel. Pak máme-li FF je po celé desce, pak to znamená, že máme bílý pixel. To je druh naproti obvykle, když řekneme, RGB. Je to vlastně děje BGR. Takže pokud se skutečně podívat do příkladu bitmapového obrazu - dovolte mi, abych vytáhnout jeden až sem. Je to trochu malé. Jsem přiblížení, a my můžeme vidět to pixelated. Vypadá to, že bloky barvy. Máte bílé bloky a pak červené bloky. Pokud budete hrát v programu Malování, například, mohl byste udělat něco takového by v podstatě jen malovat některé čtverce v určitém pořadí. Tak co to znamená v bitmapě je následující. Zde máme první bílé pixely, které všechny 6 jsou f je, a pak máme červené pixely, indikován 0000FF. A tak posloupnost bajtů, které máme ukazuje, jak bitmapový obraz bude vypadat. Takže to, co jsem tady udělal je právě napsal všechny ty bajty a poté je barvená v červené takže můžete trochu vidět, když šprtů trochu, jak tento druh označuje smajlíky. Způsobem, že bitmapový obrázků práce je, že jsem si ho asi představovali v podstatě jako mřížku. A tak ve výchozím nastavení, každý řádek mřížky musí být násobkem 4 bytů. Podíváme-li se na bitmapový obraz, budete vyplňovat každé hodnotě. Například, můžete mít červenou tady, zelenou tady, modrá zde, ale musíte se ujistit, že obraz je vyplněna násobek čtyř bajtů. Takže když chci svůj obraz na tři bloky široký, pak bych musel dát prázdnou hodnotu v posledním, aby bylo násobkem čtyř. Tak pak bych přidat do něčeho, co jsme volajícího polstrování. Jdu jen ukázat, že tam s x. Teď říkají, že chtějí obraz, který je 7 pixelů dlouho, například. Máme 1, 2, 3, 4, 5, 6, 7, a to vše se vyplní barvou. Způsobem, že bitmapové obrázky fungovat, je, že musíme 8.. Právě teď máme 1, 2, 3, 4, 5, 6, 7. Potřebujeme 8 prostory pro bitmapového obrazu číst správně. Takže to, co musíme udělat, je přidat jen trochu vycpávky Ujistěte se, že všechny šířky jsou jednotné a že všechny šířky jsou násobkem 4.. A tak jsem již dříve uvedla, polstr jako X nebo zakroucený linky, ale ve skutečných bitmapových obrázků je padding indikován hexadecimálním 0. Tak, že by byl jeden znak, 0. Co se může hodit, je xxd příkaz. Co to udělá, je ve skutečnosti ukazuje, rádi podobný tomu, co jsem dělal předtím, než se na smajlík když jsem ve skutečnosti vytiskne, co každá barva by pro pixel a pak barevně, tak při spuštění xxd s následujícími příkazy, pak to bude skutečně vytisknout, jaké barvy jsou pro ty pixelů. Co musíte udělat, je tady mám označit, jako-S 54 říká, že budu začínat 54. bajtu protože před tím, si vzpomenout, jestli se podíváme zpět na mapu bitmapy, to je vše, informace v hlavičce a podobné věci. Ale to, co jsme opravdu záleží, je skutečné obrazové body, které označují barvu. Takže tím, že do té vlajky,-s 54, pak jsme schopni vidět barevné hodnoty. A nebojte se o složité vlajek a podobné věci. V spec problému nastavené, budete mít pokyny, jak používat xxd k zobrazení pixelů. Takže pokud uvidíte zde, docela to vypadá jako zelené pole, tento malý věc. Já jsem barevně kódovány 00ff00 jako v podstatě říká, žádnou modrou, hodně zeleně, a ne červený. Tak, že odpovídá zelené. Jak vidíte zde, vidíme zelený obdélník. Tento zelený obdélník je jen 3 pixelů široký, takže pak to, co musíme udělat, Ujistěte se, že obraz je násobkem 4 široký, je přidat v extra polstrování. A pak se to, jak vidíte tyto 0s zde. To bude skutečně výsledek vašeho Resize PSet, v podstatě brát malou bitmapu a pak rozšíření ji 4. A tak to, co vidíme, je, že ve skutečnosti tento obrázek 12 pixelů široký, ale 12 je násobkem 4, a tak jsme vlastně nevidím žádný 0s na konci, protože nepotřebujeme přidat jakékoli protože je to zcela vypolstrovaná. To nemá žádné větší prostor. Dobře. Máte otázky k čalounění? Dobře. Cool. Jak jsem již zmínil dříve, bitmapy jsou jen sled bajtů. A tak to, co máme, je místo museli sledovat přesně, jaké množství byte odpovídá na konkrétní prvek, jsme vlastně vytvořili struct reprezentovat, že. Takže to, co máme, je RGBTRIPLE struct. Kdykoli máte instanci RGB trojici, protože to je typ definovat struct, pak můžete přistoupit k rgbtBlue proměnné, Podobně Zelené a červené proměnné, které bude uvádět, kolik modrá, zelená a červená, respektive, máte. Takže pokud máme modrou proměnná nastavena na hodnotu 0, zelená nastavena na FF, což je maximální hodnota, kterou může mít, a potom červený proměnná nastavena na hodnotu 0, pak jakou barvu by to zejména RGB triple představují? >> [Student] Green. Green. Přesně tak. Je to bude užitečné vědět, že kdykoli budete mít instanci RGB trojici, můžete skutečně přístup k množství barvy - modrá, zelená, červená a - zvlášť. Teď, když jsme hovořili o struktuře, která, pojďme se podívat na BMP souboru. Jedná se o structs vyrobené pro vás. Zde máme BITMAPFILEHEADER struct. Zajímavá je velikost. Později, máme informační hlavičku, která má několik dalších věcí, které jsou pro nás zajímavý, totiž velikost, šířka a výška. Jak půjdeme do později, když budete číst do souboru, automaticky načte, protože jsme nastavili pořadí být stejný. Takže biSize bude obsahovat správné bajtů, které odpovídají skutečné velikosti obrázku. A pak je tu, konečně, jak jsme mluvili o tom, máme RGBTRIPLE typedef struct. Máme rgbtBlue, zelené a červené s ním spojené. Great. Dobře. Nyní, když jsme pochopili rastrové obrázky trochu, pochopit, že máme hlavičku souboru a info hlavička s ním spojené, a pak po tom, máme zajímavé věci, z barev, a tyto barvy jsou zastoupeny RGBTRIPLE structs, a ty zase mají tři hodnoty spojené k modré, zelené a červené. Takže teď, můžeme trochu přemýšlet o tom, Recover trochu. Promiňte. Přemýšlejte o tom, detektivka. Když máme stopa soubor, pak to, co chceme udělat, je přečíst v ní pixel po pixelu a pak nějak změnit ty pixely, takže můžeme výstupu do čitelného formátu. A tak do výstupu, budeme psát pixel po pixelu do verdict.bmp souboru. To je trochu moc co dělat. Uvědomujeme si, že. Takže to, co jsme udělali je, že jsme skutečně poskytovány vám copy.c. Co copy.c dělá, je jen udělá přesnou kopii daného rastrového souboru a pak výstup do. Tak to už otevírá soubor pro vás, čte v pixel po pixelu, a zapíše jej do do výstupního souboru. Pojďme se na to podívat. Toto je zajistit řádné využití, jak k souborům zde. Co to však je, že nastaví vstupní soubor bude to, co jsme prošel v v vstupni_soubor zde, což je náš druhý argument příkazového řádku. Kontroly se ujistit, že můžeme otevřít soubor. Zkontroluje, zda můžeme vytvořit nový outfile zde. Tak co to dělá tady, to prostě v podstatě začne číst do bitmapy od začátku. Začátek, jak víme, obsahuje BITMAPFILEHEADER, a tak tyto sekvence bitů se přímo vyplnit BITMAPFILEHEADER. Takže to, co tu máme, je říkat, že BITMAPFILEHEADER BF - to je naše nová proměnná typu BITMAPFILEHEADER - budeme dát dovnitř bf, co čteme z ukazovátko, což je naše infile. Jak moc jsme si? Čteme v kolik bytů budeme muset obsahovat celou BITMAPFILEHEADER. Podobně, to je to, co děláme pro info záhlaví. Takže jsme dále po našem souboru v soubor_se_hrou a my čtete tyto bity a bajty, a my jsme zapojení je přímo v do těchto instancí proměnných, které děláme. Zde jsme jen ujistit, že je bitmapa rastrový obrázek. Nyní máme outfile, že jo? Tak, jak to stojí, když jsme ji vytvořit, je to v podstatě prázdné. Takže máme v podstatě vytvořit nový rastrový obrázek od začátku. Co děláme je, že jsme se ujistit, že jsme zkopírujte do záhlaví souboru a info záhlaví stejně jako vstupni_soubor má. Co máme udělat, je budeme psát - a pamatujte, že bf je proměnná typu BITMAPFILEHEADER, takže to, co děláme, je, že jsme prostě použít tento obsah zapsat do outfile. Zde, si, jsme hovořili o polstrováním, jak je to důležité, aby se ujistil, že množství pixelů, které máme, je násobkem 4. To je docela užitečné vzorec pro výpočet, kolik padding máte vzhledem šířka souboru. Chci jste si uvědomit, že v copy.c máme vzorec pro výpočet odsazení. Dobře? Takže každý si to pamatovat. Great. Tak co copy.c dělá dál, je to iteruje přes všechny scanlines. To projde řádky a poté uloží každý triple, že to čte a zapíše jej do outfile. Takže tady čtete jen jeden RGB Triple v době a pak uvedení, že stejné Triple do outfile. Choulostivé části je, že výplň není RGB trojnásobný, a tak můžeme nejen číst, že padding množství trojic RGB. Co musíme udělat, je ve skutečnosti jen přesunout naše soubor ukazatel polohy, přesunout naše kurzor, na druhu přeskočit všechny polstrování, takže jsme na dalším řádku. A pak, co to dělá, je kopie ukazuje, jak budete chtít přidat výplň. Takže jsme vypočítá, kolik padding potřebujeme, tak to znamená, že musíme čalounění počet 0s. Co to však je pro smyčce, která klade čalounění počet 0s do našeho outfile. A pak konečně, zavřete oba soubory. Zavřete soubor_se_hrou stejně jako outfile. Tak to je, jak funguje copy.c, a že to bude docela užitečné. Místo toho jen skutečně přímo zkopírovat a vložit nebo jen při pohledu na něj a zadáním, co chcete, můžete jen chcete provést tento příkaz v terminálu, cp copy.c whodunit.c, která vytvoří nový soubor, whodunit.c, , který obsahuje přesně stejný obsah jako kopie dělá. Takže to, co můžeme udělat, je použít jako rámec, na kterém je možné budovat a upravovat pro naše detektivka souboru. To jsou naše to-dos udělat pro detektivka, ale to, co dělá copy.c je vlastně stará o většinu z nich pro nás. Takže všechno, co je třeba dělat, je změnit pixely podle potřeby skutečně provést soubor čitelný. Si uvědomit, že pro daný obrazový bod trojitým, tak pro danou proměnné typu RGBTRIPLE, můžete přistupovat k modré, zelené a červené hodnoty. To bude hodit, protože pokud k nim máte přístup, to znamená, že můžete také zkontrolovat, a to znamená, že můžete také změnit. Takže když jsme se vrátili do našeho červeného například lupy, v podstatě, že se choval jako jakýsi filtr pro nás. Takže to, co chceme udělat, je chceme filtrovat všechny trojic, které jsou přicházet Existuje několik různých způsobů, jak to udělat. V podstatě, můžete mít bez ohledu na typ filtru chcete. Možná budete chtít změnit všechny červené pixely nebo možná budete chtít změnit jiný barevný pixel na jinou barvu. To záleží na vás. Nezapomeňte, že můžete zjistit, jakou barvu pixel je a pak můžete také změnit, jak si procházíš. Dobře. Tak to je detektivka. Po spuštění detektivka, budete vědět, kdo viníkem zločinu byl. Teď jsme jít na Změnit velikost. Budeme ještě jednat s rastrovými obrázky. Co budeme dělat, je budeme mít vstupní bitmapu a pak budeme předávat v řadě a pak dostanete outfile bitmapu kde to je v podstatě náš infile zmenšen n.. Řekni můj soubor byl jen jeden pixel velký. Pak, pokud má n byl 3, odstupňováním po 3, pak bych zopakovat, že pixel n kolikrát, tak 3 krát, a pak také měřítko ho 3 krát stejně. Tak vidíte jsem měřítka vertikálně i horizontálně. A pak je tu příklad. Máte-li n = 2, zjistíte, že první modrý pixel tam opakovat dvakrát horizontálně i vertikálně dvakrát. A pak, že pokračuje, a tak budete mít přímý měřítko původního obrazu pomocí dvou. Takže pokud bychom měli upřesní Pseudokód pro to, chceme soubor otevřít. A pak s vědomím, že pokud se vrátíme sem, vidíme, že šířka pro outfile bude jiný, než je šířka pro infile. Co to znamená? To znamená, že naše informace v hlavičce se změní. A tak to, co budeme chtít udělat, je aktualizovat záhlaví informace, s vědomím, že když čteme ve spisech, pokud pracujete na copy.c rámce, již máme proměnnou, která označuje to, co je velikost a podobné věci. Takže až budete mít to, co budete chtít udělat, je změnit tyto konkrétní proměnné. Pamatujte, že pokud máte struct, jak přistupovat k proměnné v rámci které. Pomocí operátoru tečka, ne? Takže použití, víte, že budete muset změnit záhlaví info. Tak tady je to jen seznam skutečných prvků, které mají v úmyslu se mění v souboru. Velikost souboru se bude měnit, obraz, stejně jako šířku a výšku. Takže pak jít zpět na mapu bitmapy, podívejte se na to, zda je to soubor záhlaví nebo info záhlaví, který obsahuje tyto informace a pak se změnit podle potřeby. Opět platí, že říkají, cp copy.c resize.c. To znamená, že resize.c nyní obsahuje vše, co je obsažené v kopii protože kopie umožňuje nám způsob čtení v každé scanline pixel po pixelu. Kromě nyní, místo toho, aby jen změnou hodnot, jako jsme to udělali v detektivka, to, co chceme udělat, je chceme psát ve více pixelů tak dlouho, jak náš n je vyšší než 1. Pak to, co chceme udělat, je chceme natáhnout ho vodorovně n, stejně jako natáhnout svisle n.. Jak můžeme udělat? Řekněme, že váš n je 2, a máte tento daný soubor_se_hrou. Váš kurzor se chystá začít v první, a to, co chcete dělat, když n je 2, chcete-li tisknout v 2 z nich. Takže tisku v 2 z nich. Pak kurzor se bude pohybovat na další pixel, což je červený, a bude to vytisknout 2 těchto červených, připojí ho na to, co se stalo předtím. Pak se kurzor přesune na další pixel a kreslit 2 z nich. Když se podíváte zpět na copy.c rámce, co to dělá tady je to vytvoří novou instanci RGB trojici, nové proměnné názvem triple. A tady, když to čte do ní, čte z infile 1 RGBTRIPLE a uloží jej v této trojité proměnné. Takže pak máte skutečně proměnnou představující konkrétní pixel. Pak, když píšete, co budete chtít udělat, je uzavřete fwrite prohlášení do smyčky for , který píše do svého outfile tolikrát, kolikrát je potřeba. To je dost jednoduché. Stačí v podstatě zopakovat psaní proces n kolikrát škálovat vodorovně. Ale pak musíme mít na paměti, že naše padding se změní. Dříve, říct, že jsme měli něco o délce 3. Pak bychom jen přidat v tom, jak moc padding? Jen jeden víc, aby se to násobkem 4. Ale říct, že jsme škálování tento konkrétní snímek n = 2. Takže, kolik modrých pixelů budeme mít na konci? Budeme mít 6. 1, 2, 3, 4, 5, 6. Dobrá. 6 není násobkem 4. Jaký je nejbližší násobek 4? To bude mít 8. Takže jsme vlastně bude mít 2 znaky polstrováním tam. Pamatuje si někdo, pokud máme vzorec pro výpočet odsazení a kde by to mohlo být? [Neslyšitelné Student odpověď] >> Jo, copy.c. Právo. Tam je vzorec v copy.c spočítat, kolik padding máte daný konkrétní šířku bitmapového obrazu. Takže, co se děje, že je užitečné, pokud potřebujete přidat v určitém množství polstrování skutečně zjistit, kolik padding budete muset přidat. Ale jedna poznámka, však je, že chcete, aby se ujistil, že používáte správnou velikost. Jen si dejte pozor, protože jste v podstatě bude zabývat dvěma bitmapových obrázků. Chcete, aby se ujistil, že používáte ten správný. Když jste výpočtu odsazení pro outfile, který chcete použít na šířku outfile a ne šířka předchozí. Great. Tento druh se stará o protahování a celou bitmapový obraz horizontálně. Ale to, co chceme udělat, je skutečně natáhnout svisle stejně. To bude trochu složitější, protože když jsme dokončení kopírování řádek a psaní, že řádek, naše kurzor bude na konci. Takže když jsme znovu číst, pak je to jen přečtu do dalšího řádku. Takže to, co chceme udělat, je druh najít nějaký způsob, jak kopírovat ty řádky znovu nebo tak nějak, aby takový řádek a potom přepsat znovu. Jak jsem tak trochu zmínil, existuje několik různých způsobů, jak to udělat. Co můžete udělat, je, jak si teď procházíš a čtení přes konkrétní scanline a mění ho podle potřeby, pak druh obchodu všech těchto bodů v matici. Později na vás vím, že budete muset vytisknout, že pole znovu, a tak stačí použít tuto matici udělat. Dalším způsobem, jak to udělat, je můžete zkopírovat dolů o jeden řádek, pochopit, že musíte zkopírovat to znovu, takže vlastně pohybujte kurzorem, a že se bude používat metodu fseek. Dalo by se pohybovat kurzor celou cestu zpět a opakujte proces kopírování znovu. Takže pokud naše měřítko číslo n, pak kolikrát budeme muset vrátit a přepsat řádek? >> [Student] n - 1. >> Jo, perfektní. n - 1. Dokázali jsme to už jednou, takže pak budeme chtít zopakovat Going Back proces n - 1 množství časů. Dobře. Tak tady máte resize funkce. Nyní se dostaneme k opravdu zábavné části, můj oblíbený PSet, který je obnovit. Místo bitmapy, tentokrát máme co do činění s JPEG. My vlastně ne, stejně soubor jen pro JPEG, jsme stejně v podstatě syrové paměťové karty formátu. A tak to obsahuje trochu info a odpadky hodnot na začátku, a pak to začne a má spoustu souborů JPEG. Nicméně, to jsme předali kartu, kde jsme odstranili fotografie; podstatě, jsme zapomněli, kde jsou fotografie umístěny v kartě. Takže naším úkolem v Recover je projít tímto karty formátu a najít ty fotky znovu. Naštěstí, struktura souborů JPEG a kartotéka je trochu užitečná. Rozhodně by bylo trochu složitější, kdyby to nebylo v tomto konkrétním formátu. Každý soubor JPEG skutečně začíná se dvěma možnými sekvencemi, které jsou uvedeny výše. V podstatě, když máte nový soubor JPEG, začíná buď sekvence ffd8 ffe0 nebo druhý, ffd8 ffe1. Další užitečné věc je vědět, je, že JPEG jsou uloženy souvisle. Takže vždy, když jeden soubor JPEG končí, druhý začíná. Takže tam není žádný druh in-mezi hodnotami tam. Jakmile narazí na začátek JPEG, pokud jste již čtení JPEG, víte, že jste narazila na konec předchozího a začátkem toho příštího. Chcete-li druhu si to představit, jsem schéma. Další věc, o JPEG je, že můžeme číst v sekvencích 512 bajtů v době, podobně se začátkem karty. Nepotřebujeme být kontroly jednotlivých bajt, protože by to za prd. Takže místo toho, co můžeme udělat, je ve skutečnosti jen číst 512 bajtů v době, a pak, místo kontroly mezi ty, v těchto malinké plátky, můžeme jen zkontrolovat na začátku 512 bajtů. V podstatě v obrázku, co vidíte, je na začátku karty, budete mít hodnoty, které jsou ve skutečnosti relevantní pro skutečné JPEG samotných. Ale pak to, co mám, je hvězda uvést jednu ze dvou výchozích sekvencí ve formátu JPEG. Takže pokaždé, když uvidíte hvězdu, víte, že máte soubor JPEG. A pak každý soubor JPEG se bude nějaký násobek 512 bajtů ale ne nutně stejný násobek. Způsob, že víte, že jste hit jiný formát JPEG je, pokud jste hit jinou hvězdu, další výchozí posloupnost bajtů. Pak to, co jste tady, je, že máte červené JPEG pokračující dokud nenarazíte na hvězdu, který je označen na novou barvu. Můžete pokračovat a pak stisknete jinou hvězdu, narazíš další JPEG, budete pokračovat celou cestu až do konce. Jste na posledním obrázku zde, růžový. Můžete přejít na konec, dokud nenarazíte na konec souboru znak. To bude opravdu užitečné. Několik hlavních takeaways zde: Karta Soubor nezačíná s JPEG, ale jakmile JPEG začne, jsou všechny JPEGu uloženy vedle sebe navzájem. Někteří pseudokód pro obnovení. Za prvé, budeme otevřít naše karty soubor, a že to bude pomocí našeho souboru I / O funkce. Budeme opakovat následující postup, dokud jsme došli na konec souboru. Budeme číst 512 bajtů najednou. A to, co jsem řekl, je zde budeme ukládat do vyrovnávací paměti, tak v podstatě drží na těch 512 bajtů, dokud nebudeme přesně vědět, co s nimi mají dělat. Pak to, co chceme udělat, je chceme zjistit, zda jsme hit hvězdu nebo ne. Pokud jsme hit hvězdu, pokud jsme hit jeden z výchozích sekvencí, pak víme, že jsme hit nový soubor JPEG. To, co budete chtít udělat, je budeme chtít vytvořit nový soubor v našem pset4 adresáři pokračovat v tvorbě tohoto souboru. Ale také, pokud jsme již udělali JPEG dříve, pak chceme ukončit tento soubor a zatlačte jej do pset4 složky, kde budeme mít tento soubor uložit, protože pokud nebudeme specifikovat, že jsme skončil tento soubor JPEG, pak budeme mít de facto neurčitý částku. Tyto JPEG nikdy neskončí. Takže chceme, aby se ujistil, že když jsme čtení do souboru JPEG a písemně, chceme konkrétně blízko, že s cílem otevřít další. Budeme chtít, aby zkontrolovat několik věcí. Chceme zjistit, zda jsme na začátku nového formátu JPEG s naší paměti a také pokud jsme již našli JPEG do proto, že se bude měnit proces mírně. Takže poté, co jste projít celou cestu a narazí na konec souboru, pak to, co budete chtít udělat, je, že budete chtít uzavřít všechny soubory, které jsou v současné době otevřít. To bude pravděpodobně poslední JPEG soubor, který máte, stejně jako karty soubor, který jste se zabýváme. Poslední překážkou, která se musíme vypořádat, je, jak vlastně udělat souboru JPEG a jak se vlastně tlačit do složky. The Pset vyžaduje, aby každá JPEG že najít být v následujícím formátu, kde máte číslo. jpg. Číslo, i když je to 0, říkáme, že 000.jpg. Kdykoliv najdete JPEG v programu, budete chtít pojmenovat ji v pořadí, že je to bylo. Co to znamená? Musíme druhu sledovat, kolik jsme našli a co číslo každého JPEG by měl být. Zde budeme využít sprintf funkce. Podobně jako printf, který jen tak výtisků hodnota ven do terminálu, sprintf vytiskne soubor ven do složky. A tak, co to bude dělat, jestli jsem měl sprintf, titul, a pak retezec, to by vytisknout 2.jpg. Za předpokladu, že jsem zavřel mé soubory správně, které bude obsahovat soubor, který jsem byl při zápisu. Ale jedna věc je, že kód, který mám tady není zcela uspokojit co Pset vyžaduje. The Pset vyžaduje, aby druhý JPEG soubor by měl být jmenován 002 místo toho jen 2. Takže, když vytisknout název, pak možná budete chtít změnit zástupný symbol mírně. Pamatuje si někdo, jak jsme umožňují přebývajících mezer, když jsme vytisknout něco? Jo. >> [Student] Dal jsi 3 mezi znakem procenta a 2. >> Jo, perfektní. Budete dát 3 v tomto případě, protože chceme, aby prostor pro 3. % 3d by pravděpodobně vám 002.jpg místo 2. První argument do funkce sprintf je vlastně char pole, které jsme dříve znali jako řetězce. Ti vůle, trochu více jako dočasné úložiště, stačí uložit výsledný řetězec. Budete opravdu bude zabývat, ale je třeba zahrnout. S vědomím, že každý název souboru má číslo, které trvá až tři znaky, a pak. jpg, by jak dlouho to pole bude? Vyhodit číslo. Kolik znaků v nadpisu, v názvu? Takže tam je 3 hashtags, období, jpg. >> [Student] 7. 7 >>. Ne tak docela. Budeme chtít 8, protože chceme, aby bylo možné null zakončení stejně. Konečně, jen vytáhnout proces, který budete dělat pro obnovení, máte nějaké počáteční informace. Můžete pokračovat, dokud nenajdete začátek souboru JPEG, a že může být buď jeden ze dvou výchozích sekvencí. Pořád na čtení. Každý lomítko zde představuje 512 bajtů. Nechte si na čtení, mějte na čtení, dokud se setkáte s jinou startovní pořadí. Jakmile budete mít to, že jste-li ukončit aktuální JPEG - v tomto případě, je to červené, takže chcete ukončit to. Chcete-li sprintf název, který do vašeho pset4 složky, pak chcete otevřít novou JPEG a potom se držet na čtení dokud se setkáte s další. Mějte na čtení, mějte na čtení, a pak konečně, nakonec, budete k dosažení konce souboru, a tak se budete chtít uzavřít poslední JPEG, že jste pracoval s, sprintf, že do pset4 složky, a pak se podívejte na všechny obrázky, které jste dostali. Tyto fotografie jsou vlastně obrazy CS50 zaměstnanců, a tak to je místo, kde bonus zábavné část PSet přijde je to, že jste v soutěži ve svých oddílech najít TFS v obrazech a fotit se s nimi dokázat, že jste udělali PSet a tak můžete vidět, které zaměstnanci jsou na obrázcích. Takže pak si fotit se zaměstnanci. Někdy budete muset honit je. Pravděpodobně někteří z nich se pokusí utéct od tebe. Můžete pořizovat snímky s nimi. To probíhá. Není to z důvodu, kdy Pset splatná. Termín bude oznámen v spec. Pak společně s vaší sekce, podle toho, co oddíl se nejvíce fotografie s nejvyšším počtem zaměstnanců vyhraje docela úžasné cenu. To je druh motivace, aby se vaše pset4 skončil tak rychle, jak je to možné protože pak se můžete pustit do práce stopovat všech různých CS50 zaměstnanců. To není povinné, i když, takže jakmile se dostanete na obrázky, pak jste hotovi s pset4. A já jsem skončil s Walkthrough 4, takže děkuji všem za účast. Hodně štěstí s Forenzní. [Potlesk] [CS50.TV]