[Powered by Google Translate] [Walkthrough - Problem Set 4] [Zamyla Chan - Harvard University] [To je CS50. - CS50.TV] V redu. Pozdravljeni, vsi, in dobrodošli potopis 4. Danes je naša pset je forenzika. Forenziki je res zabavno pset ki vključuje stik z bitne datoteke ugotoviti kdo storil kaznivo dejanje. Potem bomo nekaj spremeniti velikost bitne datoteke potem bomo tudi dogaja, da se ukvarjajo z zelo zabavni del se imenuje obnovitev, , v katerem smo v bistvu predali spominsko kartico , v katerem je nekdo zbrisal vse svoje datoteke, in smo prosili, da si opomore te datoteke. Ampak najprej, preden smo prišli v pset, res samo želim čestitati vsem. Mi smo približno na polovici tega predmeta. Kviz 0 je za nami in smo na pset4, tako da v bistvu smo na polovici poti. Prišli smo daleč, če pogledaš nazaj v svoje psets, pset0 in pset1, zato se čestitam za to, in bomo dobili v nekaj res zabavno stvari. Torej, naša orodjarna za to pset, še enkrat, namesto da teče sudo yum-y posodobitev, bomo lahko šele teči update50 če ste na različico 17,3 in več od aparata. Torej, se prepričajte, da delujejo update50 - to je veliko lažje, nekaj manj znakov - se prepričajte, da ste v najnovejši različici aparata. Še posebej je pomembno, da update50, ko smo začeli uporabljati CS50 Check. Torej, se prepričajte, da to storite. Za vse dele za to pset, bomo morali ukvarjati z datoteko vhodov in izhodov, vložite I / O. Bomo šli skozi veliko programov, ki se ukvarjajo z nizi kaže, da datoteke in stvari, kot je ta, zato želimo zagotoviti, da smo res pozna in udobno , ki se ukvarjajo s tem, kako vhod in izhod v datotekah. V distribucijskem oznake za to pset je datoteka z imenom copy.c, in to je tisto, kar bomo našli se bo res koristno za nas ker bomo na koncu dejansko kopiranje datotek copy.c in samo nekoliko spremenila, da bi lahko dosegli prva 2 del problema niza. In tako je, kot sem že omenil, imamo opravka z bitne slike kot tudi JPEG. Torej, res razumevanju strukture, kako so organizirane te datoteke, kako lahko resnično prevesti 0s in 1s v konstrukti in stvari, ki jih lahko dejansko razumejo in interpretirajo in uredi, da bo zelo pomembno, Tako bo v JPEG in bitne datoteke in razumevanju strukture teh. Pset4, kot ponavadi, prične z delom vprašanj. Tisti, ki se bo ukvarjal z datoteko I / O in dobili boste navadili na to. Potem del 1, je Whodunit, v kateri ste dobili datoteko z bitno sliko , ki izgleda nekako kot rdeče pike povsod. In potem v bistvu tisto, kar smo naredili, je, da to datoteko in jo uredite tako malo v različici, ki se lahko prebere. V bistvu, ko končamo, bomo imeli isto datoteko, razen bomo lahko videli skrite sporočilo skriva za vsemi temi rdečimi pikami. Potem Resize je program, ki se glede na datoteko in nato glede na ime datoteke, da realizacij in nato dati več, kot tudi, bo dejansko velikost bitne slike, s tem, da je celo vrednost. Potem končno, imamo izterjati pset. Mi smo dobili pomnilniško kartico, nato pa morajo izterjati vseh fotografij , ki so bile pomotoma izbrisane, vendar, kot bomo učili, dejansko ne izbriše in odstrani iz spisa; smo kar nekako izgubili, kjer so bili v spisu, vendar se bomo, da si opomore, da je. Čudovito. Torej gre v datoteko I / O Natančneje, gre za celoten seznam funkcij, ki jih boste uporabljali. Ste že videli malo osnove fopen, fread in fwrite, ampak gremo pogledati še v kakšno datoteko I / O funkcije, kot so fputc, v katerem si napisati en znak naenkrat, da fseek, kjer si nekako premaknete kazalnik datoteke položaja naprej in nazaj, in še nekaj drugih. Ampak bomo šli v to, nekoliko kasneje pa še v pset. Torej, najprej, samo da bi dobili v datoteki / I, preden gremo v pset, Če želite odpreti datoteko, na primer, je tisto, kar morate storiti, je dejansko nastavite kazalec na datoteko. Torej imamo kazalec datoteki *. V tem primeru, kličem, da v kazalca, kajti to se dogaja, da se moja INFILE. In tako bom uporabiti funkcijo fopen in potem ime datoteke in nato Način, v katerem bom lahko ukvarjajo z datoteko. Torej je "r" v tem primeru za branje, "w" za pisanje, nato pa "" za slepič. Na primer, če imate opravka z INFILE in vse, kar želite storiti, je prebral bitov in bajtov shranjene tam, potem ste verjetno boš želel uporabiti "r" kot svoj način. Če želite dejansko napisati, nekako narediti novo datoteko, potem kaj bomo storiti je, da bomo odprli novo datoteko in uporabo "w" način pisanja. Torej, če ste dejansko branje v datoteke, struktura je, kot sledi. Najprej so kazalec na struct, ki bo vseboval bajte, da bereš. Tako, da se bo konec lokacija bajte, da bereš. Saj potem pa navesti velikosti, kot v bistvu koliko bajtov vaš program mora brati v spis, velikost bistvu en element je, in potem boš določite, koliko elementov želite prebrati. In potem končno, morate vedeti, kje berete iz, tako da se bo vaš v kazalec. Jaz obarvani, saj po fread je tudi zelo podoben fwrite, razen hočeš prepričati, da uporabljate pravi ukaz, se prepričajte, da ste dejansko pisanje ali branje z desne datoteke. Torej tako kot prej, če imamo na velikost elementa, kot tudi število elementov, potem lahko igramo tukaj malo. Recimo imam psa struct, zato pa hočem, da se glasi dva psa naenkrat. Kaj lahko storim je rekel velikost enega elementa se bo velikost enega psa in jaz bom prebral dve. Druga možnost je, kar sem lahko naredil je reči, da sem le, da bo prebral en element in da je eden od elementov, se bo v velikosti dveh psov. Torej, to je podobno, kako lahko nekako igral z velikostjo in številom odvisno od tega, kaj je bolj intuitiven za vas. V redu. Zdaj smo prišli do pisanja spisov. Če želite napisati spis, prva trditev je dejansko, če bereš iz. Torej, to je v bistvu podatki, ki jih boste napisali v datoteko ki je od kazalec na koncu. Torej, če ste se ukvarjajo z pset, poskrbite, da ne boste dobili zmeden. Mogoče imajo definicije drug ob drugem. Lahko potegnite opredelitev v priročniku, ki jih vnesete moškega in nato fwrite, na primer, v terminalu, ali se lahko vrne na ta diapozitiv in se prepričajte, da ste z uporabo pravega. Torej, še enkrat, za fwrite, ko imate datoteko, ki jo želite pisati v, da bo še zadnji argument in da se bo kazalec na datoteko. Torej to je, kako smo se ukvarjajo s pisanjem morda več zlogov, v času, ampak da želite samo napisati v samo enem značaja. Kot bomo videli kasneje, v tem primeru v bitne slike bomo morali uporabiti, da. Takrat bomo lahko uporabite fputc, v bistvu samo polaganje en znak naenkrat, chr, v datoteko kazalec, in to je naša kazalec od tam. Potem, ko smo iskali ali pisati v datoteko, datoteka sledenja, kje smo. Torej je to neke vrste kazalca, datoteka položaj kazalca. In tako, ko smo pisati ali brati znova v datoteko, datoteka dejansko spomni, kje je, in tako se nadaljuje od kjer je kazalec. To je lahko koristno, če želite, da, recimo, preberite v določenem znesku nekaj storiti nato pa preberite v naslednji višini, ampak včasih se želimo iti nazaj ali dejansko začeti iz neke referenčne vrednosti. Torej je funkcija fseek, kaj počne, je nam omogoča, da premaknete kazalec na določeno datoteko določeno število bajtov. In potem, kaj moramo storiti, je določiti, kje je referenčna vrednost. Torej, ali se premika naprej ali nazaj, od koder je kazalec trenutno je, ali pa lahko določi, da mora le korak od začetka datoteke ali od konca datoteke. In tako se lahko prenese na negativne ali pozitivne vrednosti za znesek, in da bo nekako premaknite kazalec bodisi naprej ali nazaj. Preden smo prišli v drugi psets, vsa vprašanja o datoteki / I? Ok. Kot smo dobili v več primerih, vas prosimo, da me ustavi za vprašanja. Torej, v Whodunit, ste predali datoteko z bitno sliko, podobno tej rdečega na diapozitivu in izgleda, da je to - kup rdeče pike - in res ne vem, kaj je napisano. Če škiljenje, boste morda lahko videli modro barvo rahlo v notranjosti sredini. V bistvu, to je, če je shranjena besedilo. Prišlo je umor, ki se je zgodilo, zato moramo ugotoviti, kdo je to storil. Da bi to dosegli, moramo nekako pretvoriti sliko v berljivi obliki. Če vi že kdaj naleteli to, včasih bi bilo malo kompleti če bi imeli povečevalno steklo z rdečim filmom. Kdorkoli? Ja. Zato bi vam roko kaj takega, bi si morali s povečevalnim steklom z rdečim filmom nad njim, bi ga dal čez sliko in ti bi lahko videli sporočilo skrit v njej. Mi nimamo povečevalno steklo z rdečo folijo, tako da namesto da bomo nekako ustvarijo sami V tem pset. In tako si bo whodunit vhod, potem pojma. Bmp, tako da je INFILE, da je rdeča pika sporočilo in potem pravijo verdict.bmp se bo naša izhodna_datoteka. Torej, da se bo ustvaril novo podobo bitno podobno clue 1 razen v berljivi obliki, kjer lahko vidimo skrito sporočilo. Ker bomo morali ukvarjati z urejanjem in manipuliranja bitne slike za neke vrste, bomo vrste potop v strukturi teh bitne datoteke. Šli smo v teh malo v predavanju, pa poglejmo v njih nekaj več. Bitne slike so v bistvu samo razporeditev bajtov kjer smo natančno navedli, kateri bajti pomeni kaj. Torej, tukaj je nekako kot zemljevidu bitno sliko pravijo, da se začne z nekaterimi glavi datoteke, se začne z nekaj informacij tam. Vidiš, da okoli bajt številko 14 je velikost navedeno v bitne slike, in se nadaljuje. Toda kaj potem smo res zanima, je tu začetkom okoli bajt številko 54. Imamo teh RGB trojice. Kaj se dogaja, da storiti, je, vsebuje dejanske slikovnih pik, barvnih vrednosti. Vse zgoraj, v glavi je nekaj informacij ustreza velikosti slike, širino slike, in višine. Ko smo šli v polnilu kasneje, bomo videli, zakaj je velikost slike lahko drugačen od širine ali višine. Torej, da predstavljajo ti - ti bitne slike so zaporedja bajtov - kaj, kar lahko storimo je rekel v redu, bom se spomnite, da je na indeksu 14, to je, če je velikost, na primer, ampak kaj bomo storili, da bi to lažje se jo zajame v struct. In tako imamo dve konstrukti naredili za nas, BITMAPFILEHEADER in BITMAPINFOHEADER, in tako, ko smo brali v tem spisu, ki ga privzeto, da se dogaja, da se bo v redu, in tako, da se je tudi dogaja, da izpolnite v spremenljivkah, kot so biWidth in biSize. In potem končno, vsak pixel predstavlja s tremi zlogi. Prvi je znesek modra v piko, drugi je količina zelene barve, in končno višino rdeče, pri čemer 0 pomeni v bistvu ni modro ali zeleno ali ne ni rdeča in nato ss je najvišja vrednost. To so šestnajstiške vrednosti. Torej, če imamo FF0000, nato pa, da ustreza najvišjim zneskom modra in potem ni zelena in rdeča ne, tako da potem bi to nam modro piko. Potem, če imamo vse FF je povsod, potem to pomeni, da imamo belo piko. To je nekako nasprotni ponavadi, ko smo rekli RGB. To se dejansko dogaja BGR. Torej, če bi dejansko preuči primer bitne slike - Naj 1 potegnite gor. To je malo majhen. Jaz sem povečave, pa smo lahko videli, da je pixelated. Izgleda, bloki barve. Imate bele kocke, potem pa rdeči bloki. Če boste igrali v Microsoft Paint, na primer, lahko narediš kaj takega ki jih v bistvu samo slikarstvo nekatere kvadratke v določenem vrstnem redu. Torej, kaj to pomeni v bitne slike je, kot sledi. Tukaj imamo bele pike 1., da so vsi 6 so f-ih, nato pa smo imeli rdeče pike, označuje 0000FF. In tako zaporedje bajtov, ki jih imamo nakazuje, kako bitna slika bo pogledati. Torej je to, kar sem tukaj naredil samo izpisati vse te bajte in nato obarvani rdeče tako da lahko nekako vidim, če škiljenje malo, kako se je to nekako kaže smeška. Tako, da bitne slike delo sem ga zamislili predvsem kot mrežo. In tako je privzeto, vsaka vrsta mreže mora biti večkratnik 4 bajte. Če se ozremo na bitno sliko, ki ste ga izpolnite vsako vrednost. Na primer, boste morda morali rdeči tukaj, tukaj je zeleno, modro tukaj vendar se morate prepričati, da je slika zapolnimo z večkratnikom 4 bajtov. Torej, če hočem sliko, ki jo trije bloki svetu, potem bi morali dati prazno vrednost v zadnjem 1, da bi bilo več od štirih. Torej, potem bi dodali v nekaj, kar smo kliče oblazinjenje. Grem kar pomeni, da je z x. Zdaj pravijo, da si želijo sliko, ki je 7 točk dolgo, na primer. Imamo 1, 2, 3, 4, 5, 6, 7, in vsi, ki izpolnijo z barvo. Tako, da bitne slike delo je, da moramo 8.. Zdaj imamo 1, 2, 3, 4, 5, 6, 7. Potrebujemo 8 prostore za bitne slike, da pravilno glasi. Torej, kaj moramo storiti, je dodajanje v samo malo oblazinjenje zagotoviti, da so vsi širine enotna in da so vsi širin so večkratnik 4. In tako sem že navedel, oblazinjenje kot x ali vijugasto črto, ampak v dejanskih bitnih slik je polnilo označuje šestnajstiško 0. Torej bi bilo to sam znak, 0. Kaj bi lahko prišel prav, je xxd ukaz. Kaj pa je dejansko vam pokaže, rad podoben temu, kar sem prej s smiley ko sem dejansko natisnjena, kaj bi vsaka barva za piko in potem z barvno lestvico, ko zaženete xxd z naslednjimi ukazi, potem bo dejansko izpisal kaj so barve za tiste slikovnih pik. Kaj morate storiti, je, tukaj sem navesti, tako kot 54-ih pravi, da bom začela na 54. bajtu ker pred tem, ne pozabite, če se ozremo nazaj na zemljevidom rastrske to je vse informacije v glavi in ​​podobno. Toda tisto, kar resnično skrbi, je dejanska točk, ki označujejo barvo. Torej, z dodatkom v tej zastavo, s 54, potem smo lahko videli barvne vrednosti. In ne skrbite za zapletene zastavami in takih stvari. V spec problem set, boste imeli navodila, kako uporabljati xxd za prikaz slikovnih pik. Torej, če vidite tukaj, je nekako izgleda zelenem polju, ta mala stvar. Sem barvno kodiranje 00ff00 v bistvu rekel, ni modro, veliko zeleno in rdečo ne. Tako, da ustreza zeleno. Kot vidite tukaj, smo videli zeleno kvadrat. Ta zelena pravokotnik je le 3 slikovnih pik, tako da potem, kaj moramo storiti se prepričajte, da je slika večkratnik 4 široka je dodati v podaljšku oblazinjenja. In tako je to, kako vidiš te 0s tukaj. To bo dejansko rezultat vašega Resize pset, predvsem pri čemer majhno bitno sliko in jo nato z razširitvijo 4. In kaj vidimo, da je pravzaprav ta slika 12 slikovnih pik, ampak 12 je večkratnik števila 4, in tako smo dejansko ne vidim nobene 0S na koncu, ker nam ni treba dodati vse zato, ker je v celoti podložena. To nima nobene več prostora. Ok. Vsa vprašanja v zvezi s polnilom? Ok. Kul. Kot sem že omenil, so bitne slike so le zaporedje bajtov. In kaj imamo, namesto da bi morali slediti točno kateri števila bajt ustreza določenemu elementu, smo dejansko ustvarili struct, ki zastopa to. Torej, kaj imamo, je RGBTRIPLE struct. Kadarkoli imate primerek RGB trojico, ker je to tip opredeliti struct, potem lahko dostopate do rgbtBlue spremenljivko, Podobno je zelena in rdeča spremenljivke, ki kažejo na to, koliko modra, zelena, rdeča, oziroma, da si. Torej, če imamo modro nastavljeno na 0, zelena nastavljena na FF, kar je najvišja vrednost lahko imate, nato pa rdeče nastavljeno na 0, potem kakšne barve bi to predvsem trojni RGB predstavlja? >> [Študent] Green. Green. Točno tako. To se dogaja, da je koristno vedeti, da vsakič, ko se primerek RGB trojico, lahko dejansko dostop do višine barva - modra, zelena in rdeča - ločeno. Zdaj, ko smo se pogovarjali o strukturi, da pa si oglejte datoteke BMP. To so konstrukti, ki za vas. Tukaj imamo BITMAPFILEHEADER struct. Zanimiva je velikost. Kasneje smo imeli info glavo, ki ima še nekaj stvari, ki so zanimive za nas, in sicer velikost, širina in višina. Ker bomo šli v kasneje, ko ste prebrali, da bi spis, samodejno prebere, ker smo se določi vrstni red mora biti enako. Tako bo biSize vsebuje prave bajte, ki ustrezajo dejansko velikost slike. In potem sem na koncu, kot smo govorili, da imamo RGBTRIPLE typedef struct. Imamo rgbtBlue, zelena, rdeča, povezane z njo. Čudovito. Ok. Zdaj, ko razumemo bitne malo, razumemo, da imamo glavo datoteke in info glava, povezana z njim, nato pa po tem, da imamo zanimive stvari V barvah, in so te barve zastopa RGBTRIPLE konstrukti, in tiste, v zameno tri vrednote, povezane z modro, zeleno in rdečo. Torej, zdaj, bomo lahko nekako razmišljam o zopet malo. Žal mi je. Pomislite Whodunit. Ko imamo datoteko pojma, kaj potem smo želeli storiti, je brati z njim piko po piko in potem nekako spremeniti tiste pike, tako da bomo lahko proizvodnja v berljivi obliki. In tako, da se proizvodnja, gremo pisati pik, ki jih pixel v verdict.bmp datoteke. To je neke vrste veliko storiti. Zavedamo se, da. Torej, kaj smo naredili, je, da smo dejansko vam z copy.c. Kaj copy.c ne le omogoča natančno kopijo določeno datoteko bitnih in jo oddaja. Torej, to je že odpre datoteko za vas, bere pik, ki jih pixel, in potem piše v izhodni v datoteko. Oglejmo pogled na to. To zagotavlja pravilno uporabo, dobili imena datotek tukaj. Kaj to je, da določa vhodno datoteko za kar smo opravili v na INFILE tukaj, ki je naš drugi argument v ukazni vrstici. Pregledi zagotoviti, da bomo lahko odprete. Pregledi zagotoviti, da bomo lahko novo izhodna_datoteka tukaj. Torej, kaj to počne tu, je samo v bistvu začne branja do datoteke bitnih od začetka. Na začetku je, kot vemo, vsebuje BITMAPFILEHEADER, in tako bodo ta zaporedja bitov neposredno izpolnite BITMAPFILEHEADER. Torej, kaj imamo tukaj je povedal, da BITMAPFILEHEADER BF - To je naša nova spremenljivka BITMAPFILEHEADER tipa - bomo pa je v bf kar prebere v kazalec, ki je naš INFILE. Koliko beremo? Prebrali smo v bajti, koliko moramo, da vsebujejo celo BITMAPFILEHEADER. Prav, to je tisto, kar počnemo za info glavo. Torej smo naprej po našem spisu v INFILE, in smo branju teh bitov in bajtov, in smo jih priključite neposredno v v teh primerih spremenljivk, ki jih uvajamo. Tukaj smo samo pazite, da je bitna slika bitna slika. Zdaj imamo izhodna_datoteka, kajne? Torej, kakršen je, ko smo jo ustvarili, to je v bistvu prazna. Zato moramo v bistvu ustvariti nov bitmap iz nič. Kaj moramo storiti, je, da moramo poskrbeti, da bomo kopirali v glave datoteke in informacije glave tako kot je INFILE. Kaj moramo storiti, je, da smo napisali - in ne pozabite, da bf je spremenljivka od BITMAPFILEHEADER tipa, tako da tisto, kar počnemo je, da smo samo uporabo te vsebine pisati v outfile. Tu ne pozabite, smo se pogovarjali o polnilu, kako pomembno je, da se prepričajte, da je znesek točk, ki jih imamo, je večkratnik števila 4. To je zelo koristno formula za izračun, koliko ste oblazinjenje glede na širino datoteke. Želim vama, da se spomnimo, da je v copy.c imamo formulo za izračun odmika. V redu? Torej, vsi se spomnim. Čudovito. Torej, kaj potem počne copy.c Naslednji je ponovi čez vse scanlines. To gre skozi vrstice in šele nato shrani vsako trojico, ki se glasi in ga nato zapiše v outfile. Torej tukaj smo berete samo eno triple RGB naenkrat nato pa damo to isto Triple v outfile. Prepreden del je, da podloga ni RGB potrojil in zato ne moremo samo brati, da oblazinjenja znesek trojic RGB. Kaj moramo storiti, je pravzaprav samo premaknete kazalnik naše datoteke stališča, premaknite kazalec naš, na vrsto preskočite vse oblazinjenje, tako da smo v naslednji vrstici. In potem, kaj to počne, je kopija vam pokaže, kako boste morda želeli dodati polnilo. Zato smo se izračuna, koliko oblazinjenje moramo, tako da pomeni, da moramo oblazinjenja število 0s. Kaj to je za zanke, ki postavlja oblazinjenja število 0s v našo outfile. In potem na koncu, ko zaprete obe datoteki. Zaprete INFILE kot tudi izhodna_datoteka. Torej, to je, kako copy.c dela, in da se bo zelo koristno. Namesto, da se dejansko neposredno kopirate in prilepite ali pa samo gledaš na to in tipkanje na karkoli želite, boste morda samo želim, da izvedete ta ukaz v terminal, cp copy.c whodunit.c, ki bo ustvaril novo datoteko, whodunit.c, , ki vsebuje natančno isto vsebino, kot kopija ne. Torej, kaj lahko storimo, je, da uporabite, da kot okvir, na podlagi katerega gradnjo in urejanje za naše whodunit datoteke. To so naši za-dos storiti za Whodunit, ampak kaj počne copy.c dejansko skrbi za večino izmed njih za nas. Torej, vse kar morate storiti, je spremeniti naslednje slikovnih pik, kot je potrebno dejansko bo datoteka berljiva. Ne pozabite, da za določeno piko trojno, da za določeno spremenljivko RGBTRIPLE tipa, lahko dostopate do modre, zelene, rdeče in vrednote. To bo prišel prav, ker če jih lahko dostopate, to pomeni, da jih lahko tudi preverite, kar pomeni, da jih lahko tudi spremenite. Torej, ko smo šli nazaj na našo rdečo primer povečevalno steklo, v bistvu, da je deloval kot nekakšen filter za nas. Torej, kaj želimo narediti, je, da smo želeli izločiti vse trojic, ki prihajajo noter Obstaja več različnih načinov, da to storijo. V bistvu, lahko imate kakršno koli filtra želite. Morda boste želeli spremeniti vse rdeče pike ali morda želite spremeniti drugačno barvo piko na drugo barvo. To je odvisno od vas. Ne pozabite, da lahko preverite, kakšne barve je pixel in potem jih lahko tudi spremeni, ko greste skozi. Ok. Tako da je Whodunit. Ko zaženete Whodunit, boste vedeli, kdo je krivec kaznivega dejanja je bilo. Zdaj bomo šli Resize. Mi bomo še vedno ukvarjajo z bitne slike. Kaj bomo naredili, je da bomo imeli vhodno bitno sliko in potem se bomo mimo v številnih in nato dobili izhodna_datoteka bitno sliko če to je v bistvu naša INFILE normira s n. Povejte mi datoteka je bila le ena pika velika. Potem, če je moja n je 3, luščenje s 3, potem bi ponovil, da je piko n število krat, tako da 3-krat, nato pa ga tudi 3-krat lestvici navzdol, kot dobro. Torej vidite, da sem ga normiranje vertikalno kot tudi horizontalno. In potem tukaj je primer. Če imate n = 2, boste videli, da je prva modra pika ponovi 2 krat horizontalno kot tudi vertikalno dvakrat. In potem se še nadaljuje, zato imate neposredno krčenje izvirnega slike z dva. Torej, če bi podrobno določa psevdokod za to, da želimo odpreti. In potem vemo, da če gremo nazaj, vidimo, da je širina za outfile se bo drugačen od širine za INFILE. Kaj to pomeni? To pomeni, da naše informacije v glavi se bo spremenilo. In kaj bomo želeli storiti, je posodobiti glavo informacij, vedoč, da ko beremo v spise, če ste delujejo na copy.c okvira, že imamo spremenljivko, ki kaže, kaj je velikost in take stvari. Torej, ko ste, da je tisto, kar boste morda želeli storiti, je spremeniti te posebne spremenljivke. Ne pozabite, če imate struct, kako dostopati do spremenljivke v to. Uporabite dot operaterja, kajne? Torej uporabi, da veste, da boste morali spremeniti header info. Torej, tukaj je samo seznam dejanskih elementov, ki se bodo spreminjali v datoteki. Velikost datoteke se bo spreminja podobo, kot tudi širino in višino. Torej grem nazaj na zemljevid na rastrske pogled na to, ali je glava datoteke ali informacije glava, ki vsebuje te informacije in nato spremenite, kot je potrebno. Še enkrat, recimo cp copy.c resize.c. To pomeni, da resize.c zdaj vsebuje vse, kar se nahaja znotraj izvod ker je kopija omogoča nam način branja za vsak piksel scanline s piko. Razen zdaj, in ne le spreminjanje vrednot, kot smo to storili v Whodunit, kaj želimo storiti, je, da smo želeli napisati v več pik tako dolgo, kot je naša n večji od 1. Potem, kaj želimo narediti, je, da želimo, da se raztezajo vodoravno z n, kot se raztezajo navpično n. Kako lahko to storimo? Recimo, da imate n 2 in imate to določeno INFILE. Vaš kazalec se bo začelo v prvem, in kaj želite storiti, če je n 2, ki jih želite natisniti v tistih 2. Torej tiskate v tistih 2. Nato kazalec se bo premaknil na naslednjo piko, ki je rdeče 1, in da se bo izpisal 2 teh rdečih in ga dodajo na tisto, kar je bilo storjeno. Potem se bo kazalec premaknete na naslednjo piko in risanje v tistih 2. Če pogledate nazaj na copy.c okvira, kaj počne tukaj se ustvari nov primerek RGB trojico, novo spremenljivko imenovano trojno. In tukaj, ko se bere v to, da se glasi od INFILE 1 RGBTRIPLE in ga shrani v notranjosti te trojne spremenljivke. Torej ste dejansko imajo spremenljivke, ki predstavlja to posebno piko. Potem, ko pišete, kaj bi si želeli storiti, je Obložite fwrite izjavo v zanki za , ki ga je napisal v svoj outfile tolikokrat, kot je potrebno. To je enostavno dovolj. Samo v bistvu ponovite postopek pisanja n število krat, da jo lestvici vodoravno. Ampak potem se moramo zavedati, da naša oblazinjenje se bo spremenilo. Prej, da smo imeli nekaj dolžine 3. Potem bi samo dodati v koliko polnilo? Samo še eno, da bo večkratnik 4. Ampak pravijo, da smo normiranje to posebno sliko, ki jih je n = 2. Torej, koliko modrih pik bi imeli na koncu? Radi bi imeli 6. 1, 2, 3, 4, 5, 6. V redu. 6 ni večkratnik 4. Kaj je najbližji večkratnik 4? To se dogaja, da je 8. Torej smo dejansko dogaja, da imajo 2 znakov oblazinjenje tam. Ali kdo spomnite, če imamo formulo za izračun odmika in če bi to lahko bilo? [Neslišno študentski odziv] >> Ja, copy.c. Prav. Obstaja formula v copy.c za izračun, koliko ste oblazinjenje s posebno širino bitmap slike. Torej, da se dogaja, da je uporabno, če želite dodati v določenem znesku oblazinjenja dejansko ugotoviti, koliko oblazinjenje boste morali dodati. Ampak ena opomba, čeprav je, da želite, da se prepričajte, da ste z uporabo prave velikosti. Samo biti previdni, ker ste v bistvu dogaja, da se ukvarjajo z dvema bitne slike. Hočeš, da poskrbite, da boste uporabljali pravega. Ko ste izračun odmika za outfile, ki jo želite uporabiti širino outfile in ne širina prejšnjega. Čudovito. Takšen skrbi za raztezanje celo bitno sliko vodoravno. Ampak, kaj hočemo storiti, je dejansko razteza navpično, kot dobro. To bo malo težje, ker ko smo končali kopiranje vrstico in pisanje to vrstico, naša kazalec se bo ob koncu leta. Torej, če bomo želeli ponovno prebrati, potem pa se je le, da bo prebral, da bi v naslednji vrstici. Torej, kaj želimo narediti, je nekako najti način razmnoževanja te vrstice še enkrat ali pa samo nekako ob to vrstico in ga reportaža znova. Kot sem nekako namiguje, da obstaja več različnih načinov, da to storijo. Kaj lahko narediš, je, kot da greš skozi in skozi branje zlasti scanline in ga spreminja, kar je potrebno, potem nekako trgovine vseh teh pik v matriki. Potem kasneje, veste, da boste morali natisniti, da je niz spet in tako lahko le uporabite ta niz za to. Drug način za to je, da bi prepišite eno vrstico, Razumem, da morate kopirati še enkrat, tako da dejansko premakniti kazalec, in to se dogaja, da se z metodo fseek. Lahko premaknete kazalec vso pot nazaj in ponovite postopek kopiranja znova. Torej, če je naš luščenje število n, potem kolikokrat bomo morali vrniti in znova črto? >> [Študent] n - 1. >> Ja, odlično. n - 1. Mi smo to storili že enkrat, tako da potem bomo želeli ponoviti postopek gredo nazaj n - 1 količina časa. Ok. Torej imate spreminjanje velikosti funkcijo. Zdaj bomo lahko prišli do res zabavni del, moj najljubši pset, kar je zopet. Namesto bitne slike, tokrat imamo opravka z JPEG. Mi smo dejansko niso dobili datoteko samo za JPEG, saj smo v bistvu surovo obliko pomnilniško kartico. In tako ta vsebuje nekaj vrednosti informacijskih in smeti na začetku, in potem se začne in ima kup datotek JPEG. Vendar pa smo predali kartico, kjer smo izbrisali fotografije; v bistvu smo pozabili, kjer so fotografije, ki je v njej. Torej naša naloga v Zopet je iti skozi to obliko kartice in našli tiste slike znova. Na srečo se je struktura datoteke JPEG in kartice spis je malo koristno. To bi vsekakor bilo malo težje, če ne bi bilo v tem formatu. Vsaka datoteka JPEG dejansko začne z dvema možnima sekvenc, ki so našteti zgoraj. V bistvu, ko imate novo datoteko JPEG, začne bodisi z zaporedjem ffd8 ffe0 ali druga, ffd8 ffe1. Še ena koristna stvar je vedeti, da so JPEG shranjene contiguously. Torej, ko se konča 1 JPEG, druga pa se začne. Torej ne obstaja nobena vrsta vmes vrednosti tam. Ko zadeti začetek JPEG, če ste že bral JPEG, veste, da ste zadeli konec prejšnjega in začetek naslednjega. Za vrste predstavljate tako, sem shematično. Druga stvar je, JPEG, da jih lahko preberete v zaporedja 512 bajtov hkrati, podobno z začetkom njene veljavnosti. Mi ni treba, da preveri vsak zlog, ker bi bilo to slabo. Torej, namesto, kaj lahko storimo, je pravzaprav zgolj brati v 512 bajtov hkrati in potem, namesto da preverjam med tistimi, ki v tistih drobcenih rezine lahko samo preverite na začetku 512 bajtov. V bistvu, na tej sliki, kar vidite, je v začetku kartice imate vrednote, ki jih v resnici pomembne dejanske JPEGs sami. Ampak potem kaj imam, je zvezda, ki označuje eno od dveh začetnih zaporedja za JPEG. Torej, ko vidiš zvezdo, veste, da imate datoteko JPEG. In potem vse datoteke JPEG se bo nekaj več od 512 bajtov vendar pa ni nujno enak mnogokratnik. Tako, da veste, da ste zadeli še JPEG je, če ste zadeli še eno zvezdo en začetni zaporedje bajtov. Potem, kaj imate tukaj, je, da imate rdeče JPEG datoteko trajno, dokler ne dosežete zvezda, , ki je označen z novo barvo. Še naprej in potem ste zadeli še eno zvezdo, ste zadeli še JPEG, boste nadaljevali vse do konca. Ste na zadnjem slike tukaj, roza 1. Ti pojdi do konca, dokler ne dosežete konec značaja datoteke. To bo res koristno. Nekaj ​​glavnih takeaways tukaj: Kartica datoteka ne začne z JPEG, ko pa se začne JPEG, so vsi shranjeni JPEGs vzporedno drug drugemu. Nekateri psevdokod za obnovitev. Najprej bomo odprli našo kartico datoteko in to se dogaja, da se z našo sliko I / O funkcije. Bomo ponovili naslednji postopek, dokler ne bomo prišli do konca datoteke. Bomo prebrati 512 bajtov hkrati. In tisto, kar sem rekel, tukaj je bomo, da jo shranite v pomnilnik, tako da v bistvu imajo na teh 512 bajtov, dokler ne bomo vedeli, kaj storiti z njimi. Torej, kaj želimo narediti, je, da smo želeli preveriti, ali smo zadeli zvezdo ali ne. Če smo zadeli zvezdo, če smo zadeti enega od vhodnih zaporedij, potem vemo, da smo zadeli novo JPEG datoteko. Kaj bomo želeli storiti, je bomo želeli ustvariti novo datoteko v naši pset4 imenik da želite nadaljevati s to datoteko. Ampak tudi, če smo že naredili JPEG prej, Nato smo želeli končati to datoteko in jo potisnite v pset4 mapo Tam bomo imeli, da je shranjena kajti če ne podate, da smo to končalo JPEG datoteko potem bomo imeli v bistvu neomejeno količino. V JPEG ne bo nikoli konec. Zato želimo, da se prepričajte, da ko bereš se v datoteko JPEG in pisno izjavi, želimo posebej blizu, da z namenom, da se odpre naslednjo. Bomo želeli preveriti nekaj stvari. Želimo, da bi preverili, ali smo na začetku novega JPEG naš pufrom in tudi, če smo že našli pred JPEG ker to se bo spremenilo vaš proces malo. Torej, potem, ko si šel skozi vse poti in se odpravite na konec datoteke kaj potem boste želeli storiti, je, da boste želeli, da zaprete vse datoteke, ki so trenutno odprta. To bo verjetno zadnja datoteka JPEG imate, kot tudi kartice datoteko, ki ste se ukvarjajo s. Zadnja ovira, da moramo obravnavati, je, kako dejansko lahko datoteko JPEG in kako pravzaprav ga potisnite v mapo. The pset zahteva, da vsak JPEG, ki jih najdete v naslednji obliki, če imate številko. jpg. Število, tudi če je 0, pravimo 000.jpg. Kadarkoli boste našli JPEG v vaš program, boste želeli, da ga imenujejo v vrstnem redu, ki je bil to. Kaj to pomeni? Moramo vrste spremljali, koliko smo ugotovili, in kaj je treba številko vsake JPEG biti. Tu bomo izkoristiti sprintf funkcije. Podobno kot printf, ki nekako odtisov vrednost ven v terminal, sprintf natisne datoteko ven v mapo. In kaj bi to storil, če bi imel sprintf, naslov, nato pa niz tam, bi izpisal 2.jpg. Ob predpostavki, da sem zaprl datoteke pravilno, , ki bi vsebovala datoteko, ki mi je bilo pisanje ven. Ampak ena stvar je, da je koda, da imam tukaj ne povsem zadovoljiti, kaj pset zahteva. The pset zahteva, da je treba drugi JPEG datoteko z imenom 002 namesto samo 2. Torej, ko natisnete ime, potem bi morda želite spremeniti ogrado malo. Ali kdo spomnite, kako smo lahko za dodatne prostore, ko natisnete nekaj? Ja. >> [Študent] Ti dal 3-odstotnim med znakom in 2. >> Ja, odlično. Boste dal 3 v tem primeru, ker želimo, prostor za 3. % 3d bi verjetno dal 002.jpg namesto 2. Prvi argument v funkciji sprintf je dejansko char array, ki smo jih prej poznali kot strune. Tisti, volja, nekako bolj kot začasnega skladiščenja, samo shranite dobljeni niz. Ne boste res morali ukvarjati s tem, ampak jo morate vključiti. Vemo, da ima vsaka datoteka ime ima številko, ki traja največ tri znake, in potem. jpg, kako dolgo naj bi to polje lahko bilo? Vrzi ven številko. Koliko znakov v naslovu, v imenu? Torej je 3 hashtags, obdobje, jpg. >> [Študent] 7. >> 7. Ne čisto. Bomo želeli 8, ker želimo, da se omogoči null terminator, kot dobro. Končno, samo da bi potegnili proces, ki boste opravljali za obnovitev, imate kakšno začetno informacije. Še naprej, dokler ne najdete začetek datoteke JPEG, in da se lahko bodisi eno od dveh vhodnih sekvenc. Si še vedno preberejo. Vsak poševnica tukaj predstavlja 512 bajtov. Če boš na obravnavi, še vedno preberejo, dokler ne boste naleteli drugega startnega vrstnega reda. Ko ste, da končate trenutni JPEG - v tem primeru je to rdeča 1, tako da boste želeli, da končate. Hočeš, da sprintf ime, ki v vašo pset4 mapo, potem pa želite odpreti novo JPEG, nato pa vedno preberejo dokler ne naletite na naslednjo. Hranite na obravnavi, hraniti na obravnavi, in končno, na koncu, boš dosegel konec datoteke in tako boste želeli, da zaprete zadnji JPEG, ki ste delali z njimi sprintf, da v svoj pset4 mapo, nato pa poiščite na vse slike, ki ste jih dobila. Te slike so pravzaprav slike CS50 osebja, in tako je to, če bonus zabaven del pset prihaja v je, da tekmujejo v vaših delih, da bi našli TFS v slikah in slikal z njimi, da dokaže, da ste storili pset in tako lahko vidite, katere uslužbenci so v slikah. Torej si lahko slike z osebjem. Včasih boste morali, da jih lovil. Verjetno bodo nekateri izmed njih poskušajo pobegniti od vas. Si slikal z njimi. To je v teku. To ni potrebno, kadar pset je posledica. Rok se bo objavljen v spec. Nato skupaj s svojim oddelkom, pri čemer oddelek ima največ slike z večino članov osebja bo dobil precej super nagrado. To je neke vrste spodbuda, da se vaš pset4 končal čim prej ker potem lahko preidemo na posel lov določitvi vseh različnih CS50 članov osebja. To ni obvezno, čeprav, tako da, ko boste dobili fotografije, potem ste končali s pset4. In sem končal s potopis 4, tako da hvala vsem za obisk. Vso srečo pri forenzike. [Aplavz] [CS50.TV]