[MUZIKO Ludanta] ZAMYLA CHAN: Ĝi estis Miss Scarlett kun la kandelabro. Whodunit? Nu, ni tuj ekscias. En la tabulludo Clue, vi eble estos donita fizika ruĝa bildo. Kaj tiu bildo estas tre ruĝa kaj spotty, kaj via laboro estas malkaŝi la kaŝita mesaĝo. Kaj kutime vi provizis kun ruĝa grandiga vitro, aŭ ruĝa ekrano por malkaŝi, ke kaŝita mesaĝo. Nu, ni tuj imiti tion. En whodunit, vi donita bitmap image ke aspektas tre spotty kaj ruĝa, kaj poste ruli la whodunit programo riveli kaŝitan mesaĝon. Do ni rompos tiu enen paŝoj. Unue, vi volas malfermi la dosieron - la indikon ke vi jam donis. Kaj tiam ankaŭ krei verdikto bitmap dosiero. Tiam vi volas aktualigi la bitbildo header info por la verdikto outfile. Pli pri tio poste. Kaj poste vi legos en la postsigno, scanline, rastrumero per rastrumero, ŝanĝi la rastrumero koloroj necesa, kaj skribado tiuj en la verdikto - rastrumero por pixel en la verdikto scanline. Kiel do ni komencu rondirante tio? Nu, feliĉe, ni havas copy.c en la dissendo-kodo. Kaj tio estas iri pruvi sufiĉe utila por ni. Copy.c malfermas dosieron, legas en tiu infile la kaplinio, poste ĝisdatigas la outfile la kaplinion. Kaj tiam ĝi legas ĉiu rastrumero en la scanline, rastrumero per rastrumero, kaj poste skribu ke rastrumero en la outfile. Do, via unua ŝtupo multobligita estu por ruli la sekvan komandon en la fina - cp copy.c whodunit.c. Tio kreos kopion de copy.c nomata whodunit.c. Do nia unua paŝo por malfermi la dosiero, bone, ne estas akurata repliko de tiu en copy.c. Do mi lasos vin rigardi tion. Kion ni pritraktas en ĉi PSET estas dosiero I / O, esence prenante dosieroj, legado, verkado, redaktado ilin. Kiel vi unue malfermi dosieron? Nu, vi tuj deklari dosieron montrilo, kaj tiam vi nomas la funkcio fopen. Iam en la vojo, aŭ la nomo de tiu fajliloj, kaj tiam la reĝimo, ke vi volas malfermi tiun dosieron in Pasante en r malfermos foo.bmp por legado. Dum fopen kun pasi en w volo malfermita bar.bmp, por skribi la dosieron kaj efektive redaktis ĝin. Do nun, ke ni jam malfermis la dosieron, nia sekva paŝo estas ĝisdatigi la kaplinion info cxar la outfile. Kio estas header info? Nu, unue ni bezonas scii kia bitmap estas. A bitmap estas nur simpla aranĝo de bajtoj. Kaj ili estas deklarita en ĉi dosieron ĉi tie, bmp.h, kun fasko da informo de kia bitmap Estas efektive farita el. Sed kion ni vere zorgas pri estas la bitmap dosieron kaplinio, ĝuste ĉi tie, kaj la bitmap info kaplinio, ĉi tie. La kaplinio konsistas el paro de variabloj kiuj pruvos tre utila. Ekzistas biSizeImage, kiu estas la tutan grandecon de la bildo en bajtoj. Kaj tio inkludas rastrumeroj kaj Plenigado. Plenigado estas tre grava, sed ni ricevos por ke poste. BiWidth reprezentas la larĝeco de la bildo en pikseloj minus la Plenigado. BiHeight estas tiam ankaŭ la alteco de la bildo en pikseloj. Kaj tiam la BITMAPFILEHEADER kaj la BITMAPINFOHEADER, kiel mi menciis pli frue, tiuj estas reprezentitaj kiel structs. Do, vi ne povas aliri la dosieron kaplinio sin, sed vi volas atingi tiuj variabloj enen. OK. Do kiel fari ni ĝisdatigi la header info? Nu, unue ni devas vidi ĉu ni bezonas ŝanĝi ajnan informon de la infile, la indikon, ke la outfile, la verdikto. Estas io ŝanĝas en tiu kazo? Nu, ne vere, ĉar ni iras esti simple ŝanĝi la kolorojn. Ni ne tuj estos ŝanĝo de la dosiero grandeco, la bildo grandeco, la larĝa, aŭ la alteco. Do vi estas tute bona por nun por nur kopiante unu bildero. OK. Do nun ni rigardu kiom ni efektive povas legi ĉiun rastrumero de la dosiero. Alia dosiero / el funkcio venos en teatraĵo - fread. Ĝi portas en montrilon al la struct kiu enhavos la bajtoj ke vi legas. Do vi legas en tiun. Kaj tiam vi pasos en grandeco, kiu estas la grandeco de ĉiu elemento kiu vi deziras legi. Tie, la funkcio sizeof venos en oportuna. Tiam vi pasas en numero, kiu reprezentas la nombro de eroj de grandeco legi. Kaj tiam fine, inptr, kiu estas la dosiera montrilo ke vi estas tuj legis el. Do ĉiu el tiuj elementoj estas interne inptr kaj ili tuj datumojn. Ni rigardu iom ekzemplo. Se mi volas legi enen datuma du hundoj, bone, mi povos fari tion unu el du manieroj. Mi povas ĉu legi en du celoj de grandeco hundo de mia inptr, aŭ mi povos legi en unu kontestas la grandeco de du hundoj. Do vi vidas, ke depende de la vojo ke vi aranĝi grandeco kaj kvanto, vi povas legi en la sama nombro da bajtoj. Do nun, ni ŝanĝas la rastrumero koloron kiel ni bezonas. Se vi rigardas bmp.h denove, tiam vi vidos, ke sur la fundo RGBTRIPLEs estas alia struct, kie Ili estas formitaj el tri bitokoj. Unu, rgbtBlue, rgbtGreen kaj rgbtRed. Do ĉiu el tiuj reprezentas la kvanton el blua, la kvanto de verdo, kaj la kvanto da ruĝa ene ĉi bildero, kie ĉiu kvanto estas reprezentita de deksesuma nombro. Do FF0000 estos blua koloro, ĉar ĝi iras de bluaj, al verda, ruĝa. Kaj tiam ĉiuj f informoj estos blanka. Ni rigardu smiley.bmp, kiuj vi havas en via distribuo kodo. Se vi malfermas ĝin en nur bildo spektanto, do vi devos nur vidas ruĝa ridetanta. Sed havante profundan dive en, ni vidas, ke la strukturo de ĝi estas simple rastrumeroj. Ni havas blankajn rastrumeroj, kaj poste ruĝan rastrumeroj. La blankaj, FFFFFF, kaj tiam ĉiuj el la ruĝa rastrumeroj mi kolorigita en por vi ĉi tie, kaj vi vidos ke ili estas 0000ff. Nulo blua, nulo verda, kaj plena ruĝa. Kaj ĉar smiley estas ok rastrumeroj larĝa, ni ne havas ajnan Plenigado. Ĉiuj pravas. Do se mi estus atribui malsamajn valorojn al RGBTRIPLE kaj mi volis fari verdan, tiam kion mi devus fari estas Mi raportus al RGBTRIPLE, nomata triobla, kaj poste aliri ĉiu bajto ene de tiu struct mi uzus la skalara operatoro. Do triple.rgbtBlue, mi povas asigni, ke al 0. Verda Mi povas atribui ĝin al plena - ĉiuj nombro, vere, inter 0 kaj ff. Kaj poste ruĝaj, mi ankaŭ intencas diri 0. Tial do tio donas al mi verdan bildero. Tuj poste, kion, se mi volas kontroli la valoro de io? Mi povus havi iun kiu kontrolas ĉu la trioblon de rgbtBlue valoro estas ff kaj poste presas ", mi sentas min blua! ", kiel rezulto. Nu, tio ne nepre signifas ke la rastrumero estas blua, ĉu ne? Ĉar la rastrumero estas verda kaj ruĝa valoroj povus havi ankaŭ ne-0 valoroj. Ĉio, kion tio signifas, kaj cxiujn, kiuj tio estas kontrolanta por trovas por plena blua koloro. Sed ĉiuj rastrumeroj povus havi ankaŭ parta koloro valoroj, kiel tiu sekvanta ekzemplo tie ĉi. Ĝi estas iom pli malfacile vidi kion ĉi bildo estas nun. Tio aspektas iom pli kiel la clue.bmp ke vi estos donitaj. Nun, fizike, vi eble solvos ĉi, ĉar estas multe da ruĝaj, per forte tenante ruĝa ekrano la bildo tiel ke la aliaj koloroj povas aperi. Do kiel fari ni imitas ĉi kun c? Nu, ni povus forigi cxiujn ruĝa de la bildo komplete. Kaj fari tiel, ke ni volonte turnis rastrumero ruĝajn valoro al 0. Kaj tial la bildo aspektus iom iom kiel tio, kie ni ne havas ruĝa kion ajn. Ni povas vidi la kaŝitajn mesaĝon a iomete pli klare nun. Ĝi estas alia smiley face. Aŭ eble ni povus uzi alian metodon. Eble, ni povus identigi ĉiuj el la ruĝa rastrumeroj - tio estas, ĉiu el la rastrumeroj kun 0 blua, 0 verdaj, kaj 0 ruĝa - kaj ŝanĝi tiujn al blanko. Kaj nia bildo povus rigardi iu kiel ĉi tio. Iom pli facile vidi. Ekzistas multaj aliaj manieroj por malkovri La sekreta mesaĝo tiel, kontraktanta kun la koloro manipulado. Eble vi povus uzi unu el la metodoj kiun mi menciis supre. Kaj aldone, vi eble volas plibonigi iuj koloroj kaj alporti tiujn eksteren. Do nun, kiam ni ŝanĝis la rastrumero koloro, apud ni nur bezonas skribi ilin en la scanline, rastrumero per bildero. Kaj plue, vi volas rerigardi al copy.c, se vi ne kopiitaj Jam, kaj rigardu la fwrite funkcio, kiu prenas datumojn, puntero al la struct kiu enhavas la bajtoj ke vi legas el, la grandeco de la artikoloj, la nombro de artikoloj, kaj tiam la outptr - La destino de tiuj dosieroj. Poste vi skribas en la rastrumeroj, vi ankaŭ devas skribi en la Plenigado. Kio estas Plenigado? Nu, ĉiu rgbt rastrumero Estas tri bitokoj longa. Sed, la scanline di bitmap image Devas esti oblo de kvar bajtojn. Kaj se la nombro de rastrumeroj estas ne oblo de kvar, do ni bezonas aldoni ĉi Plenigado. Plenigado estas ĝuste reprezentita de _0s_. Do, kial ni skribu, aŭ legu ĉi tion? Nu, tio rezultas, ke vi ne povas reale fread Plenigado, sed vi povas kalkuli ĝin. En ĉi tiu kazo, la indikon kaj la verdikto havi la sama larĝa, do la Plenigado estas la sama. Kaj la Plenigado, kiel vi vidos en copy.c, kalkuliĝas kun la sube formulo - bi.biWidth fojojn sizeof (RGBTRIPLE) volo donu al ni, kiom da bitokoj la bmp havas en ĉiu vico. De tie, la modulos kaj subtrahoj kun 4 povas kalkuli kiom multaj bitokoj devas esti adiciita por ke la oblo de bajtoj en ĉiu vico estas kvar. Nun ke ni havas la formulon por kiom Plenigado ni bezonas, nun Ni povas skribi ĝin. Nun, mi menciis antaŭ, Plenigado estas nur _0s_. Do, en tiu kazo, ni nur metante a char, en tiu kazo oni 0, en nian outptr - nia outfile. Do kiu povas esti simple fputc 0, komo outptr. Do, dum ni estis legante en nian dosiero, dosiero / Aŭ gardis spuro de nia pozicio en tiuj dosieroj kun ion nomis la dosieron pozicio indikilo. Pensu pri ĝi kiel kursoro. Esence, ĝi antaŭas ĉiufoje ke ni fread, sed ni havas kontrolon pri ĝi, ankaŭ. Por movi la dosiero pozicio indikilo, vi povas uzi la funkcion fseek. Kie la inptr reprezentas la dosiero montrilo, ke vi sercxas en la kvanto estas la nombro de bitokoj, ke vi volas movi la kursoron, kaj tiam el rilatas al la referenca punkto de kie via kursoro estas. Se vi pasas en SEEK_CUR, ke reprezentas la aktualan pozicio en la dosiero. Aŭ vi povas uzi iujn aliajn parametrojn. Do, ni eble volos uzi fseek salti super la Plenigado de la en dosiero. Kaj cetere, se vi estas hokita, ekzistas ekzemplo de tiu en copy.c. Do nun ni jam malfermis la dosieron, la postsigno, kaj la verdikton. Ni ĝisdatigis la header info por nia verdikto, ĉar ĉiu bitmap bezonas kaplinion. Ni legis en la postsigno de scanline, rastrumero per rastrumero, ŝanĝante ĉiu koloro kiel necesa, kaj skribi tiujn en la verdikto, rastrumero per bildero. Kiam vi malfermos verdikto, vi povas vidi, kiuj la kulpa aux kia estas la sekreta mesaĝo estas. Mia nomo estas Zamyla, kaj tiu estis whodunit.