[Powered by Google Translate] [Walkthrough - Tatizo Set 4] [Zamyla Chan - Chuo Kikuu cha Harvard] [Hii ni CS50. - CS50.TV] Wote haki. Hello, kila mtu, na kuwakaribisha kwa walkthrough 4. Leo pset yetu ni Forensics. Forensics ni pset kweli fun kwamba inahusisha kushughulika na files bitmap kugundua waliofanya uhalifu. Kisha tunakwenda resize files baadhi bitmap, basi tuko pia kwenda kukabiliana na sehemu ya kweli fun kuitwa Kuokoa, ambayo sisi ni kimsingi kukabidhiwa kadi ya kumbukumbu ambayo mtu ana ajali ilifutwa yote ya faili zao, na sisi ni aliuliza kuokoa files wale. Lakini kwanza, kabla ya sisi kupata katika pset, mimi kwa kweli nataka tu kumpongeza kila mtu. Sisi ni kuhusu saa midpoint ya kozi hii. Quiz 0 nyuma yetu, na sisi ni saa pset4, hivyo kimsingi, sisi ni nusu. Tumekuwa kuja njia ya muda mrefu kama wewe kuangalia nyuma psets yako, pset0 na pset1, hivyo kumpongeza mwenyewe juu ya kwamba, na sisi ni kwenda kupata katika baadhi ya mambo kweli fun. Hivyo toolbox yetu kwa pset hii, tena, badala ya mbio Sudo yum-y update, sisi ni uwezo wa kukimbia tu update50 kama wewe ni katika toleo 17.3 na juu ya appliance. Hivyo kuwa na uhakika ya kuendesha update50 - ni rahisi sana, wachache chini ya wahusika - kuhakikisha kwamba uko katika toleo la karibuni la appliance. Hasa ni muhimu update50 wakati sisi kuanza kutumia CS50 Check. Hivyo kuhakikisha kwamba kufanya hivyo. Kwa sehemu zote kwa pset hii, tunakwenda kuwa kushughulika na pembejeo faili na matokeo, faili I / O. Sisi ni kwenda kuwa kwenda juu ya mengi ya mipango ya kwamba kukabiliana na arrays akizungumzia files na mambo kama hayo, hivyo tunataka kuhakikisha kwamba sisi ni kweli familiar na starehe kushughulika na jinsi ya pembejeo na pato katika files. Katika code usambazaji kwa pset hii ni faili inayoitwa copy.c, na kwamba ni nini sisi ni kwenda kupata ni kwenda kuwa kweli muhimu kwetu kwa sababu tunakwenda kuishia kweli kuiga faili copy.c na tu Kubadili ni kidogo kuweza kufikia kwanza sehemu ya 2 ya kuweka tatizo. Na hivyo basi kama nilivyoeleza hapo awali, sisi ni kushughulika na bitmaps kama vile JPEGs. Hivyo kweli kuelewa muundo wa jinsi files wale ni kupangwa, jinsi gani tunaweza kweli kutafsiri sekunde 0 na 1s katika structs na mambo ambayo tunaweza kweli kuelewa na kutafsiri na kuhariri, kwamba itakuwa kweli muhimu, hivyo kwenda katika JPEG na files bitmap na kuelewa muundo wa wale. Pset4, kama kawaida, kuanza na sehemu ya maswali. Wale atapambana na faili I / O na wewe kupata accustomed kwamba. Kisha sehemu 1 ni Whodunit, ambayo wewe ni kupewa faili bitmap kwamba inaonekana kama aina ya dots nyekundu yote juu ya. Na kisha kimsingi nini sisi ni kwenda kufanya ni kuchukua faili hii na tu hariri ni kidogo katika toleo kwamba tunaweza kusoma. Kimsingi, mara sisi kumaliza, tutaweza kuwa na faili moja, ila tutaweza kuwa na uwezo wa kuona ujumbe siri siri kwa wale wote dots nyekundu. Kisha resize ni mpango kwamba, kutokana na faili na kisha kupewa jina la faili kwamba matokeo na kisha kupewa namba kama vile, mapenzi kweli resize kwamba bitmap na thamani kwamba integer. Kisha mwisho, tuna pset ya Kuokoa. Tumepewa kadi ya kumbukumbu na kisha kuwa na kupona zote za picha ambayo yamekuwa ajali imefutwa, lakini, kama tutaweza kujifunza, si kweli ilifutwa na kuondolewa kutoka faili; sisi tu aina ya waliopotea ambapo walikuwa katika faili, lakini sisi ni anaenda kuokoa kwamba. Mkuu. Hivyo kwenda katika faili I / O hasa, haya ni orodha nzima ya kazi ya kwamba wewe utakuwa kutumia. Tayari umeziona kidogo misingi ya fopen, fread, na fwrite, lakini sisi ni kwenda kuangalia zaidi katika baadhi ya faili I / O kazi kama vile fputc, ambayo wewe andika tu mhusika mmoja kwa wakati, kwa fseek, ambapo aina ya hoja nafasi faili kiashiria mbele na nyuma, na kisha baadhi ya watu wengine. Lakini tutaweza kwenda katika kwamba kidogo baadaye wakati pset. Hivyo kwanza, tu kupata ndani ya faili I / O kabla ya sisi kwenda katika pset, kufungua faili, kwa mfano, una nini cha kufanya ni kweli kuweka pointer faili hilo. Hivyo tuna * JALADA pointer. Katika kesi hiyo, mimi nina wito ni katika pointer sababu itakuja kuwa infile yangu. Na hivyo mimi nina kwenda kutumia fopen kazi na kisha jina la faili na kisha mode ambayo mimi nina kwenda kuwa kushughulika na faili. Hivyo kuna "r" katika kesi hii kwa kusoma, "w" kwa maandishi, na kisha "a" kwa appending. Kwa mfano, wakati wewe ni kushughulika na infile na wote unataka kufanya ni kusoma na bits ka kuhifadhiwa huko, basi pengine wewe kwenda kutaka kutumia "r" kama mode yako. Wakati unataka kweli kuandika, aina ya kufanya faili mpya, basi nini tunakwenda kufanya ni tunakwenda kufungua faili mpya na kutumia "w" mode kwa ajili ya kuandika. Hivyo basi wakati wewe ni kweli ya kusoma katika files, muundo ni kama ifuatavyo. Kwanza wewe ni pamoja pointer struct kwamba mapenzi yana ka kwamba wewe ni kusoma. Ili kwenda kuwa mahali mwisho ya ka kwamba wewe ni kusoma. Wewe kisha kwenda zinaonyesha ukubwa, kama kimsingi ngapi ka mpango wako ana kusoma katika na faili, ukubwa kimsingi moja kipengele ni, na kisha utaenda bayana jinsi wengi vipengele unataka kusoma. Na kisha hatimaye, una kujua ambapo wewe ni kusoma kutoka, ili kwenda kuwa pointer yako katika. Mimi rangi-coded haya kwa sababu fread pia ni sawa na fwrite, ila wewe unataka kuhakikisha kwamba matumizi ili haki, kuhakikisha kwamba wewe ni kweli kuandika au kusoma kutoka faili haki. Hivyo basi kama kabla, kama tuna kawaida ya kipengele kama vile idadi ya vipengele, basi tunaweza kucheza karibu hapa kidogo. Sema nina struct DOG na hivyo basi mimi nataka kusoma mbwa wawili kwa wakati. Nini mimi naweza kufanya ni kusema ukubwa wa kipengele moja ni kwenda kuwa ukubwa wa DOG moja na mimi naenda kwa kweli kusoma wawili. Vinginevyo, kitu ambacho ninaweza kufanya ni kusema mimi tu kwenda kusoma moja ya kipengele na kwamba moja ya kipengele ni kwenda kuwa ukubwa wa mbwa wawili. Basi hiyo ni sawa jinsi gani unaweza aina ya kucheza karibu na ukubwa na idadi kutegemea nini zaidi Intuitive na wewe. Wote haki. Hivyo sasa sisi kupata files kuandika. Wakati unataka kuandika kwenye faili, hoja ya kwanza ni kweli ambapo wewe ni kusoma kutoka. Basi hiyo ni kimsingi data kwamba wewe ni kwenda kuandika ndani ya faili, ambayo ni pointer nje mwishoni. Hivyo wakati wewe ni kushughulika na pset, kuhakikisha huna kupata kuchanganyikiwa. Labda kuwa na upande ufafanuzi kwa upande. Unaweza kuvuta ufafanuzi juu katika mwongozo na kuandika mtu na kisha fwrite, kwa mfano, katika terminal, au unaweza rejea nyuma kwenye slide huu na kuhakikisha kwamba unatumia moja ya haki. Hivyo tena, kwa fwrite, wakati una faili kwamba unataka kuandika katika, ambayo inaenda kuwa hoja ya mwisho na kwamba itakuja kuwa pointer faili hilo. Hivyo basi hiyo ni jinsi sisi kukabiliana na kuandika labda bytes kadhaa kwa wakati, lakini kusema unataka kuandika tu katika tabia tu mmoja. Kama tutaweza kuona baadaye katika mfano huu, katika bitmaps sisi itabidi kutumia. Kwamba wakati tunaweza kutumia fputc, kimsingi kuweka tu mhusika mmoja kwa wakati, CHR, ndani ya pointer faili, na kwamba ni wetu nje pointer huko. Hivyo basi popote kutafuta au kuandika kwenye faili, faili ni kuweka wimbo wa tulipo. Hivyo ni aina ya mshale, nafasi ya faili kiashiria. Na hivyo wakati sisi kuandika au kusoma tena ndani ya faili, faili kweli anakumbuka ambako ni, na hivyo anaendelea kutoka ambapo mshale ni. Hii inaweza kuwa ya manufaa wakati unataka, kusema, kusoma katika kiasi fulani kufanya kitu na kisha kusoma katika kiasi zifuatazo, lakini wakati mwingine sisi kutaka kurudi nyuma au kweli kuanza kutoka thamani fulani ya kumbukumbu. Hivyo basi kazi fseek, kile yake ni inaruhusu sisi hoja ya cursor katika faili fulani idadi fulani ya ka. Na kisha nini sisi kufanya ni bayana ambapo thamani ya kumbukumbu ni. Hivyo pengine ni hatua mbele au nyuma kutoka ambapo mshale sasa ni, au tunaweza bayana kwamba ni lazima tu hoja katika mwanzo wa faili au kutoka mwisho wa faili. Na hivyo unaweza kupita katika maadili hasi au chanya kwa kiasi, na kwamba itakuwa aina ya panya ama mbele au nyuma. Kabla ya sisi kupata katika psets mengine, maswali yoyote juu ya faili I / O? Sawa. Kama sisi kupata katika mifano zaidi, jisikie huru kunizuia kwa maswali. Hivyo katika Whodunit, wewe mitupu faili bitmap sawa na moja hii nyekundu kwenye slide, na inaonekana kama hii - rundo la dots nyekundu - na wewe kwa kweli sijui ni nini imeandikwa. Kama wewe kengeza, unaweza kuwa na uwezo wa kuona kidogo kibluu rangi ndani ya katikati. Kimsingi, hiyo ambapo Nakala inahifadhiwa. Kulikuwa na mauaji yaliyotokea, na tunahitaji kujua nani alifanya hivyo. Ili kufanya hivyo, tunahitaji aina ya kubadilisha picha hii katika format someka. Kama wewe guys milele wamekutana hii, wakati mwingine kutakuwa kidogo kits ambapo ingekuwa kioo wakimtukuza na filamu nyekundu. Mtu yeyote? Yeah. Hivyo itakuwa mitupu kitu kama hii, ungependa kuwa kioo wakimtukuza na filamu nyekundu juu yake, bila kuweka ni zaidi ya picha, na ungependa kuwa na uwezo wa kuona ujumbe siri humo. Hatuna kioo wakimtukuza na filamu nyekundu, hivyo badala tunakwenda aina ya kujenga yetu wenyewe katika pset hii. Na hivyo user ni kwenda pembejeo whodunit, basi kidokezo, bmp., hivyo ndiyo infile, hiyo ni nyekundu dot ujumbe, na kisha wao ni kusema verdict.bmp ni kwenda kuwa outfile yetu. Hivyo ni kwenda kujenga mpya bitmap sanamu sawa na kidokezo moja isipokuwa katika format someka ambapo tunaweza kuona ujumbe siri. Tangu sisi ni kwenda kuwa kushughulika na editing na manipulating bitmaps ya aina fulani, tunakwenda aina ya kupiga mbizi katika ndani ya muundo wa files haya bitmap. Sisi akaenda juu kidogo kidogo haya katika hotuba, lakini hebu tuangalie katika wao baadhi zaidi. Bitmaps kimsingi tu mpangilio wa ka ambapo tumekuwa maalum ambayo ka maana gani. Hivyo hapa ni aina ya kama ramani ya picha bitmap akisema kwamba huanza na baadhi ya faili header, huanza na baadhi ya taarifa katika huko. Unaweza kuona kwamba katika idadi kuhusu Byte 14 ukubwa wa picha unahitajika bitmap, na inaendelea. Lakini basi nini tuko kweli nia hapa ni kuanzia karibu idadi Byte 54. Tuna triples haya RGB. Nini kwamba kinaendelea kufanya ni vyenye saizi halisi, maadili rangi. Kila kitu juu ya kwamba katika header ni baadhi ya habari sambamba na ukubwa wa picha, upana wa sanamu, na urefu. Wakati sisi kwenda katika padding baadaye, tutaweza kuona nini ukubwa wa picha inaweza kuwa tofauti kuliko upana au urefu. Hivyo basi kuwakilisha hizi - picha hizo bitmap ni Mwandamano ya ka - nini tunaweza kufanya ni kusema sawa, mimi naenda kukumbuka kwamba katika index 14, hiyo ambapo kawaida ni, kwa mfano, lakini badala yake nini tunakwenda kufanya ili kufanya hii rahisi ni kurejelea katika struct. Na hivyo tuna structs mbili kwa ajili yetu, BITMAPFILEHEADER na BITMAPINFOHEADER, na hivyo wakati tunasoma katika faili la kwamba, kwa default itakavyo kuwa kwenda katika utaratibu, na hivyo ili ni pia kwenda kujaza katika ndani ya vigezo kama vile biWidth na biSize. Na kisha hatimaye, pixel kila ni kuwakilishwa na ka tatu. moja ya kwanza ni ya kiasi cha bluu katika pixel, ya pili ni ya kiasi cha kijani, na hatimaye, kiasi ya nyekundu, ambapo 0 ni kimsingi hakuna kijani bluu au hakuna au hakuna nyekundu na kisha ff ni thamani upeo. Hizi ni hexadesimoli maadili. Hivyo basi kama tuna ff0000, basi kwamba sambamba na kiasi cha juu cha bluu na kisha hakuna kijani na hakuna nyekundu, hivyo basi kwamba atatupa pixel bluu. Kisha kama tuna ff yote ya hela bodi, basi hiyo ina maana kwamba tuna pixel nyeupe. Hii ni aina ya kinyume na kawaida wakati sisi kusema RGB. Ni kweli kwenda BGR. Hivyo kama sisi kweli kuangalia katika mfano wa sanamu bitmap - ngoja nikuondoe moja hapa. Ni kidogo kidogo. Mimi nina zooming katika, na tunaweza kuona ni pixelated. Inaonekana kama vitalu wa rangi. Una vitalu nyeupe na kisha nyekundu vitalu. Kama wewe kucheza katika Paint Microsoft, kwa mfano, unaweza kufanya kitu kama hicho na kimsingi tu uchoraji mraba fulani ili maalum. Hivyo basi nini hii inasababisha na katika bitmap ni kama ifuatavyo. Hapa tuna saizi ya kwanza nyeupe, kwamba wote ni f 6, na kisha tuna saizi nyekundu, unahitajika kwa 0000ff. Na hivyo mlolongo wa bytes kwamba tuna inaonyesha jinsi picha bitmap ni kwenda kuangalia. Hivyo kile nimepata kufanyika hapa ni tu imeandikwa nje wale ka wote na kisha rangi nyekundu katika ili uweze aina ya kuona, kama wewe squint kidogo, jinsi ya aina hiyo inaonyesha uso smiley. njia ambayo bitmap images kazi ni mimi wanaangalia ni kimsingi kama gridi ya taifa. Na hivyo kwa default, kila mstari wa gridi ina kuwa nyingi ya ka 4. Kama sisi kuangalia picha bitmap, wewe ni kujaza thamani kila. Kwa mfano, unaweza kuwa nyekundu hapa, kijani hapa, bluu hapa, lakini wewe kuwa na kuhakikisha kwamba picha ni kujazwa na majina tofauti ya ka nne. Hivyo kama nataka picha yangu kuwa tatu vitalu pana, basi mimi ingekuwa kuweka thamani tupu katika moja ya mwisho ya kufanya hivyo nyingi ya nne. Hivyo basi napenda kuongeza katika kitu ambacho sisi ni wito padding. Mimi tu anaenda zinaonyesha kuwa kuna na x. Sasa wanasema tunataka picha kwamba ni 7 saizi ya muda mrefu, kwa mfano. Tuna 1, 2, 3, 4, 5, 6, 7, na yote ya kwamba ni kujazwa na Michezo katika. njia ambayo images bitmap kazi ni kwamba tunahitaji 8. Hivi sasa tuna 1, 2, 3, 4, 5, 6, 7. Tunahitaji 8 mazingira kwa ajili ya picha bitmap ya kusoma kwa usahihi. Hivyo basi nini sisi kufanya ni kuongeza katika kidogo tu ya padding kuhakikisha kwamba wote wa widths ni sare na kwamba wote wa widths ni nyingi ya 4. Na hivyo mimi awali zilionyesha, padding kama x au squiggly line, lakini katika picha halisi bitmap padding ni unahitajika kwa 0 hexadesimoli. Hivyo kwamba itakuwa tabia moja, 0. Nini kinaweza kuja Handy ni amri xxd. Kile yake ni kweli inaonyesha wewe, like sawa na nini mimi kabla na smiley wakati mimi kwa kweli kuchapishwa nini rangi ya kila itakuwa kwa pixel na kisha rangi-coded hivyo, wakati kukimbia xxd na amri zifuatazo, basi itakuwa kweli magazeti nje nini rangi ni kwa wale saizi. Nini wewe kufanya ni zaidi ya hapa mimi zinaonyesha, kama s-54 anasema kuwa mimi naenda kuanza saa Byte 54 kwa sababu kabla ya hapo, kumbuka kama sisi kuangalia nyuma na ramani ya bitmaps, kwamba taarifa zote header na mambo kama hayo. Lakini nini sisi kweli huduma kuhusu ni saizi halisi kwamba zinaonyesha rangi. Hiyo na kuongeza kwamba katika bendera,-s 54, basi sisi ni uwezo wa kuona maadili rangi. Na msiwe na wasiwasi juu bendera ngumu na mambo kama hayo. Katika spec kuweka tatizo, itabidi maelekezo ya jinsi ya kutumia xxd kuonyesha Ukubwa. Hivyo kama unaweza kuona hapa, ni aina ya inaonekana kama sanduku kijani, hii kitu kidogo. Nimekuwa rangi-coded 00ff00 kama kimsingi akisema hakuna bluu, mengi ya kijani, na hakuna nyekundu. Hivyo kwamba sambamba na kijani. Kama unaweza kuona hapa, tunaona Mstatili kijani. This Mstatili kijani ni 3 tu saizi mbalimbali, hivyo basi kile sisi kufanya kuhakikisha kwamba picha ni nyingi ya 4 ni mpana kuongeza katika padding ziada. Na hivyo basi hiyo ni jinsi ya kuona haya sekunde 0 hapa. Hii kweli kuwa matokeo ya resize pset yako, kimsingi kuchukua bitmap ndogo na kisha handla hivyo kwa 4. Na hivyo kile sisi kuona ni kwamba kweli picha hii ni 12 × pana, lakini 12 ni nyingi ya 4, na hivyo sisi kweli sioni sekunde 0 mwishoni kwa sababu hatuna haja ya kuongeza yoyote sababu ni kikamilifu padded. Haina lolote zaidi ya chumba. Sawa. Maswali yoyote kuhusu padding? Sawa. Cool. Kama nilivyoeleza hapo awali, bitmaps ni tu mlolongo wa bytes. Na hivyo kile sisi ni badala ya wanaohitaji kwa kuweka wimbo wa idadi hasa ambayo ya Byte sambamba na kipengele maalum, sisi kweli tumemuumba struct kuwakilisha kwamba. Hivyo kile sisi ni struct RGBTRIPLE. Wakati wowote na mfano wa triple RGB, kwa sababu hii ni aina define struct, basi unaweza kupata variable rgbtBlue, vile vile vigezo Green na Red, ambayo yanaonyesha jinsi gani buluu, kijani, na nyekundu, mtiririko huo, una. Hivyo kama tuna bluu variable kuweka 0, seti ya kijani na ff, ambayo ni thamani ya kiwango cha unaweza kuwa, na kisha variable nyekundu kuweka 0, basi ingekuwa nini rangi maalum huu RGB triple kuwakilisha? >> [Mwanafunzi] Green. Green. Hasa. Ni kwenda kuwa na manufaa kwa kujua kwamba wakati wowote una mfano wa triple RGB, unaweza kweli kupata kiasi cha Michezo - buluu, kijani, na nyekundu - tofauti. Sasa kwa kuwa tumekuwa aliyesema kuhusu muundo wa kwamba, hebu kuchukua kuangalia faili BMP. Hizi ni structs alifanya kwa ajili yenu. Hapa tuna struct BITMAPFILEHEADER. Wa maslahi ni kawaida. Baadaye, tuna header info, ambayo ina wachache na mambo zaidi ya kuwa ni ya kuvutia kwa sisi, yaani ukubwa, upana, na urefu. Kama tutaweza kuingia katika baadaye, wakati wewe kusoma katika na faili, ni moja kwa moja anasoma katika sababu tumekuwa kuweka ili kuwa sawa. Hivyo biSize yana ka haki kwamba yanahusiana na ukubwa halisi wa picha. Na kisha hapa, mwisho, kama tumekuwa kuongelea, tuna RGBTRIPLE typedef struct. Tuna rgbtBlue, Green, na Red yanayohusiana na hayo. Mkuu. Sawa. Sasa kwa kuwa tunaelewa bitmaps kidogo, kuelewa kwamba tuna header faili na header info yanayohusiana na hayo na kisha baada ya sisi kuwa na mambo ya kuvutia ya rangi, na rangi hizo ni kuwakilishwa na structs RGBTRIPLE, na wale, kwa upande mwingine, kuwa na maadili tatu zinazohusika na bluu, kijani, na nyekundu. Hivyo sasa, tunaweza kufikiri kuhusu aina ya Kuokoa kidogo. Sorry. Fikiria kuhusu Whodunit. Wakati sisi kuwa kidokezo yetu ya SVG, basi ni nini tunataka kufanya ni kusoma katika hilo pixel kwa pixel na kisha kubadili namna fulani saizi wale ili tuweze pato ndani format someka. Na hivyo kwa pato hilo, sisi ni kwenda kuandika pixel kwa pixel katika faili verdict.bmp. Hiyo ni aina ya mengi ya kufanya. Tunatambua kwamba. Hivyo kile ambacho tumefanya ni kweli tumekuwa zinazotolewa kwa copy.c. Nini copy.c gani ni tu hufanya nakala halisi ya faili aliyopewa bitmap na kisha matokeo yake. Hivyo hii tayari kufungua faili kwa ajili yenu, wasomaji katika pixel kwa pixel, na kisha anaandika katika ndani ya faili pato. Hebu tuangalie kwamba. Hii ni kuhakikisha matumizi sahihi, kupata filenames hapa. Nini hii unaweka faili pembejeo kuwa kile ambacho tumekuwa kupita katika katika infile hapa, ambayo ni amri ya mstari wa pili yetu hoja. Hundi ya kuhakikisha kwamba tunaweza kufungua faili. Hundi ya kuhakikisha tunaweza kufanya outfile mpya hapa. Kisha nini hii haina hapa, ni tu kimsingi kuanza kusoma katika faili la bitmap tangu mwanzo. mwanzo, kama tujuavyo, ina BITMAPFILEHEADER, na hivyo wale Mwandamano wa bits itakuwa moja kwa moja kujaza BITMAPFILEHEADER. Hivyo nini sisi hapa ni kusema kwamba bf BITMAPFILEHEADER - hiyo ni variable wetu mpya wa BITMAPFILEHEADER aina - sisi ni kwenda kuweka ndani ya bf nini sisi kusoma kutoka katika pointer, ambayo ni infile yetu. Kiasi gani sisi kusoma? Tunasoma katika ngapi ka tunahitaji vyenye BITMAPFILEHEADER nzima. Vile vile, kwamba ni nini tunaweza kufanya kwa ajili header info. Hivyo sisi ni kuendelea pamoja faili wetu katika infile, na sisi ni kusoma bits wale na ka, na sisi ni plugging yao moja kwa moja katika katika haya matukio ya vigezo kwamba sisi ni maamuzi. Hapa tuko tu kuhakikisha kuwa bitmap ni bitmap. Sasa tuna outfile, haki? Hivyo kama ulivyo wakati sisi kujenga hilo, ni kimsingi tupu. Hivyo inabidi kimsingi kuunda bitmap mpya kutoka mwanzo. Tunachofanya ni sisi kuhakikisha kwamba sisi nakala katika header faili na header info tu kama infile ana. Tunachofanya ni sisi kuandika - na kukumbuka kwamba bf ni variable ya BITMAPFILEHEADER aina, ili kile sisi kufanya ni sisi tu kutumia kwamba maudhui kuandika katika outfile. Hapa, kumbuka kuongelea padding, jinsi ni muhimu ili kuhakikisha kuwa kiasi ya saizi ya kwamba sisi ni nyingi ya 4. Hii ni formula pretty manufaa kwa mahesabu ni kiasi gani padding una aliyopewa upana wa faili yako. Mimi nataka wewe guys kukumbuka kwamba katika copy.c tuna formula kwa ajili ya kuhesabu padding. Sawa? Hivyo kila mtu kukumbuka kwamba. Mkuu. Hivyo basi nini copy.c gani ijayo ni iterates juu ya yote ya scanlines. Ni inakwenda kupitia safu ya kwanza na kisha maduka kila mara tatu kwamba wasomaji na kisha anaandika ndani outfile. Hivyo basi hapa sisi ni kusoma tu moja RGB triple wakati na kisha kuweka triple huo katika outfile. sehemu Tricky ni kwamba padding si triple RGB, na hivyo hatuwezi kusoma tu kwamba kiasi padding ya triples RGB. Tunachotakiwa kufanya ni kweli tu hoja faili wetu nafasi kiashiria, hoja ya cursor yetu, kwa aina ya ruka juu ya padding yote ili sisi ni saa mstari unaofuata. Na kisha nini hii haina ni nakala inaonyesha jinsi unaweza kutaka kuongeza padding. Hivyo tumekuwa mahesabu kiasi gani padding tunahitaji, hivyo kwamba ina maana kuwa tunahitaji padding idadi ya sekunde 0. Nini hii ni kwa kitanzi kwamba unaweka padding idadi ya sekunde 0 ndani ya outfile yetu. Na kisha hatimaye, wewe karibu files wote. Wewe karibu infile kama vile outfile. Basi hiyo ni jinsi copy.c matendo, na kwamba kinaendelea kuwa pretty muhimu. Badala ya moja kwa moja tu kwa kweli kuiga na pasting ni au tu kuangalia ni na kuandika katika chochote unataka, unaweza tu wanataka nitafanya amri hii katika terminal, linganisha copy.c whodunit.c, ambayo itakuwa kuunda faili mpya, whodunit.c, kwamba ina exact maudhui kama nakala gani. Hivyo basi nini tunaweza kufanya ni kutumia kama mfumo wa juu ambayo kujenga na kuhariri kwa whodunit faili wetu. Hizi ni yetu-dos kufanya kwa Whodunit, lakini kile copy.c gani ni kweli inachukua huduma ya wengi wao kwa ajili yetu. Basi wote tunahitaji kufanya ijayo ni kubadilisha saizi kama inahitajika kwa kweli kufanya faili someka. Kumbuka kwamba kwa pixel aliyopewa tatu, hivyo kwa variable fulani ya RGBTRIPLE aina, unaweza kupata bluu, maadili ya kijani, na nyekundu. Hiyo atakuja katika Handy kwa sababu kama unaweza kupata yao, hiyo ina maana kwamba unaweza pia kuangalia yao, na hiyo ina maana kwamba unaweza pia mabadiliko yao. Hivyo wakati sisi kurudi mfano wetu nyekundu magnifying kioo, kimsingi, kwamba alikuwa kaimu kama aina ya chujio kwa ajili yetu. Basi nini tunataka kufanya ni tunataka kuchuja wote wa triples zinazokuja in Kuna njia mbalimbali za kufanya hivi. Kimsingi, unaweza kuwa na kila aina ya chujio unataka. Labda unataka kubadilisha saizi wote nyekundu au labda unataka kubadilisha rangi tofauti pixel kwa rangi tofauti. Hiyo ni juu yako. Kumbuka kwamba unaweza kuangalia nini rangi pixel ni na kisha unaweza pia mabadiliko hayo kama wewe ni kwenda kupitia. Sawa. Basi hiyo ni Whodunit. Mara baada ya kukimbia Whodunit, utajua ambao culprit ya uhalifu ilikuwa. Sasa tunakwenda kwenda Resize. Sisi ni kwenda bado kuwa kushughulika na bitmaps. Nini sisi ni kwenda kufanya ni sisi itawabidi bitmap pembejeo na kisha tunakwenda kupita katika idadi na kisha kupata bitmap outfile ambapo kwamba kimsingi infile yetu kuongezwa kwa n. Sema faili yangu ilikuwa moja tu pixel kubwa. Kisha kama n yangu ilikuwa 3, scaling na 3, basi napenda kurudia kwamba pixel n idadi ya nyakati, hivyo mara 3, na kisha pia kuongeza ni chini mara 3 pia. Hivyo unaweza kuona mimi nina kuongeza kwa wima pamoja na usawa. Na kisha hapa ni mfano. Kama una n = 2, unaweza kuona kwamba kwanza pixel bluu kuna alirudia mara mbili usawa kama vizuri kama mara mbili wima. Na kisha kuwa inaendelea, na hivyo kuwa na kuongeza moja kwa moja ya picha yako ya awali na mbili. Hivyo basi kama tulikuwa na undani pseudocode kwa hili, tunataka kufungua faili. Na kisha kujua kwamba kama sisi kurudi nyuma hapa, tunaona kwamba upana kwa outfile kinaenda kuwa tofauti kuliko upana kwa infile. Hiyo ina maana gani? Hiyo ina maana kwamba header yetu habari ni kwenda na mabadiliko. Na hivyo kile tutaweza wanataka kufanya ni update info header, kujua kwamba wakati tunasoma katika files kama wewe ni uendeshaji juu ya mfumo copy.c, tayari tuna variable kwamba inaonyesha kile kawaida ni na mambo kama hayo. Hivyo mara tu una kwamba, nini unaweza kutaka kufanya mabadiliko vigezo wale fulani. Kumbuka, kama una struct, jinsi wewe kupata vigezo ndani ya kwamba. Wewe kutumia operator dot, haki? Hivyo basi kwa kutumia kwamba, unajua kwamba utasikia haja ya kubadili info header. Hivyo hapa ni tu orodha ya mambo ya halisi kwamba ni kwenda kuwa kubadilisha katika faili yako. ukubwa wa faili inaenda kubadilika, picha, kama vile upana na urefu. Hivyo basi kurejea ramani ya bitmaps, kuangalia kama ni header faili au header info kwamba ina taarifa kwamba na basi mabadiliko kama inahitajika. Tena, wanasema linganisha copy.c resize.c. Hiyo ina maana kwamba resize.c sasa ina kila kitu ambacho zilizomo ndani ya nakala kwa sababu nakala hutoa sisi njia ya kusoma katika kila pixel scanline kwa pixel. Ila sasa, badala ya kubadilisha maadili kama tulivyofanya katika Whodunit, nini tunataka kufanya ni sisi unataka kuandika katika saizi nyingi muda mrefu kama n wetu ni mkubwa kuliko 1. Kisha nini tunataka kufanya ni tunataka kunyoosha kwa usawa na n, kama vile kunyoosha kwa wima na n. Jinsi gani tunafanya hivi? Sema n yako ni 2 na una hii infile aliyopewa. Cursor yako ni kwenda kuanza saa moja ya kwanza, na nini unataka kufanya kama n ni 2, unataka magazeti katika 2 wa wale. Hivyo magazeti katika 2 wa wale. Kisha mshale wako ni kwenda hoja kwa pixel pili, ambayo ni moja nyekundu, na ni kwenda magazeti nje ya 2 ndio wale nyekundu, appending ni kwenye nini ni kufanyika kabla. Kisha mshale itahamia kwa pixel ijayo na kusogea katika 2 wa wale. Kama kuangalia nyuma kwa mfumo copy.c, nini hii haina haki hapa ni inajenga mfano mpya wa triple RGB, variable mpya iitwayo tatu. Na hapa wakati anasoma ndani yake, inasomeka kutoka infile 1 RGBTRIPLE na maduka ya kuwa ndani ya variable kwamba tatu. Hivyo basi wewe kweli kuwa kutofautiana anayewakilisha kwamba pixel fulani. Kisha wakati kuandika, nini unaweza kutaka kufanya ni encase kauli fwrite katika kwa kitanzi kwamba anaandika ndani outfile yako kama mara nyingi kama inahitajika. Hiyo ni rahisi ya kutosha. Tu kimsingi kurudia mchakato wa kuandika n idadi ya mara ya kuongeza kwa usawa. Lakini basi tunahitaji kukumbuka kwamba padding yetu ni kwenda na mabadiliko. Hapo awali, wanasema sisi na kitu fulani cha urefu 3. Basi tunataka kuongeza tu katika kiasi gani padding? Moja tu zaidi ya kufanya hivyo nyingi ya 4. Lakini kusema sisi ni kuongeza picha hii hasa kwa n = 2. Hivyo basi, jinsi wengi blue saizi ingekuwa tuna mwishoni? Tunataka kuwa na 6. 1, 2, 3, 4, 5, 6. Wote haki. 6 si nyingi ya 4. Nini nyingi karibu ya 4? Hiyo itakuwa 8. Hivyo sisi ni kweli kwenda na wahusika 2 padding huko. Je, mtu yeyote kumbuka kama tuna formula kwa mahesabu ya padding na ambapo ambayo inaweza kuwa? [Inaudible mwanafunzi majibu] >> Yeah, copy.c. Haki. Kuna formula katika copy.c kwa mahesabu ni kiasi gani padding una aliyopewa upana fulani ya sanamu bitmap. Hivyo basi, kwamba kinaendelea kuwa na manufaa wakati unahitaji kuongeza kwa kiasi fulani ya padding kwa kweli takwimu nje kiasi gani padding unahitaji kuongeza. Lakini moja kumbuka, ingawa, ni kwamba wewe unataka kuhakikisha kwamba unatumia haki ya kawaida. Kuwa makini tu kwa sababu wewe ni kimsingi kwenda kushughulika na picha mbili bitmap. Wewe unataka kuhakikisha kwamba unatumia moja ya haki. Wakati wewe ni kuhesabu padding kwa outfile, unataka kutumia upana wa outfile na si upana wa moja uliopita. Mkuu. Kwamba aina ya huduma inachukua kukaza nzima bitmap image usawa. Lakini nini tunataka kufanya ni kweli kunyoosha kwa wima pia. Hii ni kwenda kuwa kidogo trickier sababu wakati tumekuwa kumaliza kuiga mstari na kuandika kuwa mstari, mshale yetu ni kwenda kuwa mwishoni. Hivyo kama sisi kusoma tena, basi tu kwenda kusoma katika mstari wa pili. Basi nini tunataka kufanya ni aina ya kupata baadhi ya njia ya kuiga safu wale tena au aina tu ya kuchukua kwamba mstari na kisha kuandika tena. Kama mimi aina ya alluded, kuna tofauti ya njia ya kufanya hii. Nini unaweza kufanya ni kama utaenda kupitia na kusoma kupitia scanline fulani na kubadilisha kama ni lazima, basi aina ya kuhifadhi yote ya saizi ya wale katika safu. Kisha baadaye juu ya wewe kujua kuwa wewe utakuwa haja ya magazeti ya nje kwamba safu tena, na hivyo unaweza kutumia tu kwamba safu ya kufanya hivyo. Njia nyingine ya kufanya hivyo ni wewe wanaweza kunakili chini moja mstari, kuelewa kwamba unahitaji nakala kwamba tena, hivyo kwa kweli hoja cursor yako, na kwamba itakuwa ni ya kutumia fseek mbinu. Unaweza hoja cursor yako njia yote nyuma na kisha kurudia utaratibu nakala tena. Hivyo kama kuongeza idadi yetu ni n, basi ni mara ngapi itakuwa tuna kwenda nyuma na rewrite mstari? >> [Mwanafunzi] n - 1. >> Yeah, kamilifu. n - 1. Tumefanya hivyo mara moja tayari, hivyo basi tutaweza wanataka kurudia kurejea mchakato n - 1 kiasi cha mara. Sawa. Hivyo kuna una resize yako kazi. Sasa tunaweza kupata sehemu kweli fun, pset favorite, ambayo ni Kuokoa. Badala ya bitmaps, wakati huu sisi ni kushughulika na JPEGs. Sisi ni kweli si kupewa faili tu ya JPEGs, sisi ni kupewa kimsingi ghafi kumbukumbu kadi format. Na hivyo hii ina kidogo ya maadili info na takataka katika mwanzo, na kisha ni kuanza na ina rundo la files JPEG. Hata hivyo, sisi ni kukabidhiwa kadi ambapo tumekuwa ilifutwa photos; kimsingi, tumesahau ambapo picha ziko ndani ya kadi. Hivyo basi kazi yetu katika Kuokoa ni kwenda kupitia muundo huu kadi na kupata picha hizo tena. Kwa bahati, muundo wa files JPEG na faili kadi ni kidogo kusaidia. Ni dhahiri wangeweza kidogo trickier kama si katika format fulani. Kila faili JPEG kweli kuanza kwa Mwandamano mbili inawezekana, waliotajwa hapo juu. Kimsingi, wakati wowote una mpya JPEG faili, inaanza na mlolongo ama ffd8 ffe0 au nyingine moja, ffd8 ffe1. Jambo jingine kusaidia kujua ni kwamba JPEGs ni kuhifadhiwa contiguously. Hivyo kila mmoja JPEG faili mwisho, nyingine moja kuanza. Hivyo hakuna aina yoyote ya katika-kati ya maadili huko. Mara baada ya kuanza kwa hit JPEG, kama wameweza tayari kusoma JPEG, unajua kwamba ve hit mwisho wa mmoja uliopita na kuanza moja ijayo. Ili aina ya taswira hii, mimi alifanya schematic. Jambo jingine kuhusu JPEGs ni kwamba tunaweza kuzisoma katika mifuatano ya ka 512 kwa wakati mmoja, vile vile na mwanzo wa kadi. Hatuna haja ya kuwa na kuangalia kila Byte moja kwa sababu kwamba ingekuwa Suck. Hivyo badala yake, nini tunaweza kufanya ni kweli tu kusoma katika bytes 512 wakati na kisha, badala ya kuangalia katika kati ya wale katika vipande wale kidogo kidogo, tunaweza kuangalia tu mwanzo wa ka 512. Kimsingi, katika picha hii, nini kuona ni mwanzo wa kadi, una maadili ambayo ni kweli si muhimu kwa JPEGs halisi wenyewe. Lakini basi nini mimi ni nyota zinaonyesha moja ya Mwandamano mbili kuanzia kwa JPEG. Hiyo wakati wowote, unaweza kuona nyota, unajua kwamba una faili JPEG. Na kisha kila faili JPEG ni kwenda kuwa baadhi ya ka nyingi 512 lakini si lazima nyingi sawa. njia ambayo unajua kwamba ve hit nyingine JPEG ni kama hit mwingine nyota, mwingine mlolongo kuanzia ya ka. Kisha nini una hapa ni wewe kuwa nyekundu JPEG faili kuendelea mpaka hit nyota, ambayo ni unahitajika kwa rangi mpya. Wewe kuendelea na kisha hit mwingine nyota, wewe hit nyingine JPEG, wewe kuendelea njia yote hadi mwisho. Uko katika picha ya mwisho hapa, moja pink. Unaweza kwenda mpaka mwisho hit mwisho wa tabia ya faili. Hii ni kwenda kuwa muhimu kweli kweli. chache kuu takeaways hapa: faili kadi haina kuanza na JPEG, lakini mara moja JPEG kuanza, wote wa JPEGs ni kuhifadhiwa upande kwa upande mmoja na mwingine. Baadhi pseudocode kwa Kuokoa. Kwanza, sisi ni kwenda kufungua kadi yetu ya SVG, na kwamba itakuwa ni ya kutumia faili yetu I / O kazi. Sisi ni kwenda kurudia utaratibu zifuatazo mpaka tumekuwa kufikiwa mwisho wa faili. Sisi ni kwenda kusoma ka 512 wakati huo. Na kile Mimi alisema hapa ni tunakwenda kuhifadhi katika buffer, hivyo kimsingi kushikilia wale ka 512 mpaka sisi kujua hasa nini cha kufanya na wao. Kisha nini tunataka kufanya ni tunataka kuangalia kama tumekuwa hit nyota au la. Kama tumekuwa hit nyota, kama tumekuwa hit mmoja wa Mwandamano kuanzia, basi tunajua kwamba tumekuwa hit mpya JPEG faili. Nini sisi utasikia wanataka kufanya ni tunakwenda wanataka kujenga faili mpya katika directory yetu pset4 kuendelea kufanya kwamba faili. Lakini pia, kama tumekuwa tayari alifanya JPEG kabla, kisha tunataka kukomesha kwamba faili na kuiondoa kwa folder pset4, ambapo tutaweza kuwa na faili kwamba kuhifadhiwa kwa sababu kama hatuwezi bayana kwamba tumekuwa kumalizika kwamba JPEG faili, kisha tutaweza kimsingi kuwa kiasi indeterminate. JPEGs hautakuwa na mwisho. Hivyo tunataka kuhakikisha kwamba wakati sisi ni kusoma katika faili la JPEG na kuandika kwamba, tunataka hasa karibu kwamba ili kufungua moja ijayo. Tutaweza wanataka kuangalia mambo kadhaa. Tunataka kuangalia kama sisi ni wakati wa kuanza JPEG mpya na buffer wetu na pia kama sisi tayari wamegundua JPEG kabla kwa sababu hiyo itabadilisha mchakato wako kidogo. Hivyo basi baada ya wewe kwenda kupitia njia yote na wewe hit mwisho wa faili, basi kile utasikia wanataka kufanya ni wewe utakuwa unataka kufunga files wote kwamba sasa kufungua. Hiyo pengine kuwa mwisho JPEG faili kwamba una, kama vile faili kadi kwamba tumekuwa kushughulika na. kikwazo cha mwisho tunahitaji kukabiliana na ni jinsi gani ya kweli kufanya faili JPEG na jinsi ya kweli kuiondoa kwa folder. pset inahitaji kwamba kila JPEG kwamba kupata kuwa katika muundo ufuatao, ambapo una idadi jpg.. idadi, hata kama ni 0, sisi kuiita 000.jpg. Kila wewe kupata JPEG katika mpango wako, wewe ni kwenda kutaka jina hilo ili ni kupatikana. Hii ina maana gani? Tunahitaji aina ya kuweka wimbo wa jinsi wengi tumekuwa kupatikana na nini idadi ya kila JPEG lazima. Hapa sisi ni kwenda kuchukua faida ya kazi sprintf. Sawa na printf, ambayo tu aina ya prints thamani nje ndani ya terminal, sprintf Prints faili nje katika folder. Na hivyo kufanya nini hii ingekuwa kama alikuwa sprintf, cheo, na kisha kamba huko, ingekuwa magazeti nje 2.jpg. Kutokana kwamba nimepata imefungwa files yangu kwa usahihi, ambayo yana faili kwamba mimi alikuwa kuandika nje. Lakini jambo moja ni kwamba kificho kwamba mimi hapa haina kabisa kukidhi kile pset inahitaji. pset inahitaji pili faili JPEG lazima aitwaye 002 badala ya 2 tu. Hivyo wakati wewe magazeti nje jina, basi labda unaweza kutaka kubadilisha placeholder kidogo. Je, mtu yeyote kumbuka jinsi sisi kuruhusu kwa ajili ya maeneo ya ziada wakati sisi magazeti kitu? Yeah. >> [Mwanafunzi] Wewe kuweka 3 kati ya ishara na asilimia 2. >> Yeah, kamilifu. Wewe itabidi kuweka 3 katika kesi hii kwa sababu tunataka nafasi kwa 3. % 3d pengine kukupa 002.jpg badala ya 2. Hoja ya kwanza katika kazi sprintf ni kweli safu Char, ambayo sisi awali alijua kama masharti. Wale mapenzi, aina ya zaidi kama kuhifadhi muda, tu kuhifadhi string matokeo. Wewe si kweli kuwa kushughulika na hii, lakini unahitaji kwa pamoja. Kujua kwamba kila jina faili ina idadi, ambayo inachukua hadi herufi tatu, na kisha jpg., kwa muda gani lazima safu hii? Mfukuze idadi. Ngapi wahusika katika cheo, katika jina? Hivyo kuna 3 hashtags, kipindi, jpg. >> [Mwanafunzi] 7. >> 7. Si kabisa. Sisi ni kwenda wanataka 8 kwa sababu tunataka kwa ajili ya kuruhusu Terminator null pia. Hatimaye, ili tu kuteka mchakato kuwa wewe utakuwa kufanya kwa ajili ya Kuokoa, wewe na baadhi ya taarifa mwanzo. Wewe kuendelea mpaka kupata mwanzo wa faili JPEG, na kwamba inaweza kuwa ama moja ya Mwandamano mbili kuanzia. Wewe kuendelea kusoma. Kila slash hapa inawakilisha ka 512. Wewe kuendelea kusoma, kuendelea kusoma mpaka wakutane mwingine mlolongo kuanzia. Mara tu na kwamba, wewe mwisho JPEG sasa - katika kesi hii, ni moja nyekundu, hivyo unataka kukomesha hiyo. Unataka jina sprintf ya kwamba ndani ya folda yako pset4, kisha unataka kufungua JPEG mpya na kisha kuendelea kusoma mpaka wakutane ijayo. Endelea kusoma, kuendelea kusoma, na kisha hatimaye, hatimaye, utaenda kufikia mwisho wa faili, na hivyo utasikia wanataka kuifunga JPEG mwisho kwamba wewe walikuwa wakifanya kazi pamoja, sprintf kwamba ndani ya folda yako pset4, na kisha kuangalia aina ya picha kwamba ve Gotten. Wale picha ni kweli picha ya wafanyakazi CS50, na hivyo hii ni sehemu ambapo fun ziada ya pset inakuja katika ni kwamba wewe ni kushindana katika sehemu yako ya kupata TFS katika picha na kuchukua picha pamoja nao ili kuthibitisha kuwa umefanya kosa pset na hivyo unaweza kuona ambayo wafanyakazi wanachama ni katika picha. Hivyo basi wewe kuchukua picha na wafanyakazi. Wakati mwingine itabidi baada yao chini. Pengine baadhi yao kujaribu kukimbia mbali na wewe. Unaweza kuchukua picha na yao. Hii ni unaoendelea. Ni wakati si kutokana pset ni kutokana. tarehe ya mwisho yatatangazwa katika spec. Kisha pamoja na sehemu yako, kwa namna yoyote sehemu inachukua picha zaidi na wanachama wengi wafanyakazi kushinda tuzo pretty kutisha. Hiyo ni aina ya motisha ya kupata pset4 yako kumaliza kwa haraka iwezekanavyo kwa sababu basi unaweza kupata chini ya biashara wanawinda mbalimbali wanachama wote wafanyakazi CS50. Hiyo si lazima, ingawa, hivyo mara moja kupata picha, basi wewe ni kumaliza na pset4. Na mimi nina kumaliza na walkthrough 4, hivyo kuwashukuru wote kwa kuja. Bahati nzuri na Forensics. [Applause] [CS50.TV]