[Powered by Google Translate] [Walkthrough - Problemo Serio 4] [Zamyla Chan - Universitato Harvard] [Jen CS50. - CS50.TV] Bone. Saluton, ĉiuj, kaj bonvenon al Walkthrough 4. Hodiaŭ nia pset estas forensics. Forensics estas vere amuza pset ke engaĝas pritraktas bitmap dosieroj por malkovri kiu faris krimon. Tiam ni iras por regrandigi iuj bitmap dosieroj, tiam ni ankaŭ tuj trakti kun vere amuza parto nomata rekuperi, en kiu ni esence enmanigis memoro karto en kiu iu hazarde deleted ĉiuj siaj dosieroj, kaj ni demandis al reakiri tiujn dosierojn. Sed unue, antaŭ ol ni eniri la pset, mi vere volas nur gratuli al ĉiuj. Ni estas proksimume je la mezpunkto de ĉi kurso. Kvizo 0 estas malantaŭ ni, kaj ni estas en pset4, do esence, ni estas duonvoje. Ni venis longan vojon se vi retrorigardas al via psets, pset0 kaj pset1, do gratulas vin pri tio, kaj ni tuj eniri iun vere amuza stuff. Tiel niaj iloj por ĉi pset, denove, anstataŭ kuri ŝvitas yum-y ĝisdatigo, ni povis nur kuri update50 se vi estas ĉe versio 17.3 kaj supre de la aparaton. Do estu certa kuri update50 - estas multe pli facila, kelkaj malpli karakterojn - por certigi ke vi estas en la lasta versio de la aparaton. Speciale gravas por update50 kiam ni ekuzi CS50 Check. Do certigu ke vi faru tion. Por ĉiuj de la sekcioj por ĉi pset, ni iras al pritraktas dosieron eniroj kaj eliroj, enarkivigi mi / O. Ni tuj estos tuj super multaj programoj kiuj trakti arrays indikante dosierojn kaj aĵoj kiel tiu, do ni volas certigi, ke ni estas vere konataj kaj komforta pritraktas kiel enigo kaj eligo en dosieroj. En la dissendo kodo por ĉi pset estas dosiero nomata copy.c, kaj tio kion ni tuj trovos tuj estos vere utila por ni ĉar ni tuj finos vere kopiante la copy.c dosieron kaj nur ŝanĝi ĝin iomete por povi atingi la unuajn 2 partoj de la problemo aro. Kaj tiel do, kiel mi menciis antaŭe, ni traktas bitmaps tiel kiel JPEG-oj. Do vere kompreni la strukturon de kiel tiuj dosieroj estas organizitaj, kiel ni povas vere traduki la _0s_ kaj _1s_ en structs kaj tion, kion ni povas vere kompreni kaj interpreti kaj redakti, ke estos vere grava, tiel eniri en JPEG kaj bitmap dosierojn kaj komprenante la strukturon de tiuj. Pset4, kiel kutime, komenciĝas kun sekcio de demandoj. Tiuj agos kun dosieron I / O kaj iru alkutimiĝis al tio. Tiam parto 1 estas Whodunit, en kiu vi ricevis bitmap dosieron kiu similas specon de kiel ruĝa dots ĉie. Kaj tiam esence kion ni faros estas preni tiun dosieron kaj simple redakti ĝin iomete en versio kiu povas legi. Esence, iam ni fini, ni havas la saman dosieron, krom ni povos vidi la kaŝitan mesaĝon kaŝita de ĉiuj tiuj ruĝaj punktoj. Tiam Regrandigi estas programo kiu, donita dosiero kaj tiam ricevis la nomon de la dosiero kiun ĝi eligas kaj tiam donita nombro tiel, efektive regrandigi ke bitmap de tiu entjero valoro. Tiam laste, ni havas la reakiri pset. Ni estas donita memoro karton kaj tiam devas reakiri ĉiujn fotojn kiuj hazarde forviŝita, sed, kiel ni lernos, ne reale forviŝita kaj forigita de la dosiero; ni nur speco de perditaj kie estis en la dosiero, sed ni tuj reakiri tion. Granda. Do tuj en dosiero / S specife, tiuj estas tuta listo de funkcioj kiuj vi estos uzi. Vi jam vidis iom la bazojn de fopen, fread, kaj fwrite, sed ni tuj vidu plu en iuj dosiero / S funkciojn kiel fputc, en kiu vi ĵus skribi unu signo samtempe, al fseek, kie vi ia movi la dosiero pozicio indikilo antaŭen kaj malantaŭen, kaj tiam iuj aliaj. Sed ni iros en tiun iom poste dum la pset. Do unue, nur por eniri dosiero / S antaŭ ol ni iros en la pset, por malfermi dosieron, ekzemple, kion vi devas fari estas efektive starigis puntero al tiu dosiero. Do ni havas DOSIERO * puntero. En ĉi tiu kazo, mi vokas ĝin en puntero ĉar tio tuj estos mia infile. Kaj tiel mi tuj uzos la funkcio fopen kaj tiam la nomo de la dosiero kaj tiam la reĝimo en kiu mi tuj iros pritraktanta la dosiero. Do tie estas "r" en tiu kazo por legi, "w" por skribado, kaj poste "a" por appending. Ekzemple, kiam vi kontraktanta kun infile kaj cxiuj vi volas fari estas legi la bitoj kaj bajtoj stokita tie, tiam vi probable tuj volas uzi la "r" kiel via modo. Kiam vi volas reale skribi, ia fari novan dosieron, tiam tio, kion ni faros estas ni iras por malfermi la novan dosieron kaj uzi la "w" modo por skribi. Do tiam kiam vi efektive legas en la dosieroj, la strukturo estas kiel sekvas. Unue vi inkludas la sagon al la struct kiu enhavos la bajtoj ke vi legas. Por ke tuj estos la fino situo de la bajtoj ke vi legas. Vi tiam tuj indikas la grandecon, like esence kiom bitokoj via programo devas legi en la dosiero, la grandeco esence unu elemento estas, kaj tiam vi tuj precizigi kiom da elementoj vi volas legi. Kaj poste fine, vi devas scii, kie vi legas de, por ke tuj estos via en puntero. Mi koloro-koditaj tiuj ĉar fread estas ankaŭ tre simila al fwrite, krom vi volas certigi ke vi uzas la dekstran ordo, certigi ke vi fakte skribas al aŭ legas de dekstre dosiero. Tial, kiel antaŭe, se ni havas la grandecon de la elemento kaj ankaŭ la nombro de elementoj, tiam ni povas ludi ĉi tie iomete. Diru Mi havas HUNDO struct do tiam mi volas legi du hundoj samtempe. Kion mi povus fari estas diri la grandecon de unu elemento tuj estos la grandecon de unu HUNDO kaj mi tuj efektive legas du el ili. Alternative, kion mi povus fari estas diri ke mi nur iras por legi unu elemento kaj ke unu elemento tuj estos la grandeco de du hundoj. Do jen analoga kiel vi povas speco de ludo kun ĉirkaŭ grandeco kaj kvanto depende kio estas pli intuicia al vi. Bone. Do nun ni atingos skribo dosierojn. Kiam vi volas skribi dosieron, la unua argumento estas reale kie vi legas el. Do jen esence la datumoj kiuj vi iras por skribi en la dosiero, kiu estas la ekster puntero fine. Do kiam vi pritraktas la pset, certigu vi ne get konfuzita. Eble ili havas la difinoj apud la alia. Vi povas treni la difinoj supre en la manlibro tajpante viro kaj tiam fwrite, ekzemple, en la fina stacio, aŭ vi povas raporti al ĉi tiu bildo kaj certigi ke vi uzas la gxustan. Do denove, por fwrite, kiam vi havas dosieron kiun vi volas skribi al, ke tuj estos la lasta argumento kaj ke tuj esti puntero al tiu dosiero. Tial jen kiel ni pritrakti skribi eble pluraj bajtoj samtempe, sed diru vi volas nur skribi en ununuran karaktero. Kiel ni vidos poste en ĉi tiu ekzemplo, en la bitmaps ni devos uzi tiu. Tio estas, kiam ni povas uzi fputc, esence nur metante unu signo samtempe, chr, en la dosiero pointer, kaj tiu estas nia ekster puntero tie. Tial kiam ni serĉas aŭ skribi en dosiero, la dosiero estas konservanta trako de kie ni estas. Do ĝi estas speco de kursoro, la dosiero pozicio indikilo. Kaj tial kiam ajn ni skribi aŭ legi denove en dosiero, la dosiero efektive memoras kie estas, kaj tiel ĝi daŭre de kie la kursoro estas. Tio povas esti utila se vi volas, diri, legi en certa kvanto fari ion kaj poste legis en la sekvaj kvanto, sed kelkfoje oni eble volas reveni aŭ efektive komencos de iu referenco valoro. Do tiam la fseek funkcio, kio faras estas ni permesas movi la kursoron en certa dosieron iu numero de bajtoj. Kaj tiam tion, kion ni devas fari estas precizigi kie la referenco valoro estas. Do ĉu ĝi moviĝas antaŭen aŭ malantaŭen de kie la kursoro aktuale estas, aŭ ni povas specifi ke gxi simple movi en de la komenco de la dosiero aŭ de la fino de la dosiero. Kaj tiel vi povas pasi en negativa aŭ pozitiva valorojn al kvanto, kaj tio estos ia movi la kursoron ĉu antaŭen aŭ malantaŭen. Antaŭ ol ni eniri la aliajn psets, demandojn en dosiero / S? Okay. Kiel ni atingas en pli ekzemploj, bonvolu haltigi min por demandoj. Do en Whodunit, vi enmanigis al bitmap dosieron simila al tiu ruĝa sur la glito, kaj ĝi aspektas kiel tiu - faskon de ruĝa dots - kaj vi ne vere scias kio skribis. Se vi squint, vi eble povos vidi malpeza koloro azulado interne de la mezo. Esence, tio estas kie la teksto estas stokitaj. Okazis murdo kiu okazis, kaj ni devas malkovri kiu faris ĝin. Por fari tion, ni bezonas ia konverti ĉi bildon en legebla formato. Se vi infanoj iam renkontis tiun, kelkfoje estus iom kits kie vi havus lupeo kun ruĝa filmo. Iu? Yeah. Do vi estus manoj io tiamaniere, vi havus lupeo kun la ruĝa filmo pri gxi, vi metus gxin sur la bildo, kaj vi povos vidi la mesaĝo kaŝita en gxi. Ni ne havas lupeo kun ruĝaj filmo, tial anstataŭ ni iras al klaso de krei nian propran en ĉi pset. Kaj tiel la uzanto tuj enigo whodunit, tiam la postsigno,. Bmp, do jen la infile, jen la ruĝa punkto mesaĝo, kaj poste ili diras verdict.bmp tuj estos nia outfile. Do tuj krei novajn bitmap image simila al la postsigno unu krom en legebla formato, kie ni povas vidi la kaŝitajn mesaĝo. Ekde ni tuj estos kontraktanta kun redaktado kaj manipulanta bitmaps de iu varo, ni iras al klaso de pikita en en la strukturo de ĉi tiuj bitmap dosierojn. Ni iris super tiuj iomete en prelego, sed ni rigardu al ili iom pli. Bitmaps estas esence nur ordigo de bajtoj kie ni specifas kiun bitokoj signifi kion. Do jen estas ia kiel mapon de la bitmap image dirante ke startas kun iu header files, startas kun iu informo en tie. Vi vidas, ke ĉe proksimume bajto numero 14 de la grandeco estas indikita de la bitmap bildo, kaj daŭre plu. Sed tiam kion ni vere interesas tie komencas ĉirkaŭ bajto nombro 54. Ni havas ĉi tiujn RGB triopoj. Kion tio tuj fari estas enhavi la reala rastrumeroj, la koloro valoroj. Ĉio supre ke en la kaplinio estas iu informo responda al la grandeco de la bildo, la larĝo de la bildo, kaj la alto. Kiam ni iros en Plenigado poste, ni vidos kial la grandeco de la bildo povus esti malsamaj ol la larĝeco aŭ la alteco. Tial por reprezenti tiujn - tiuj bitmap bildoj estas sekvencoj de bajtoj - kion ni povus fari estas diri bone, mi tuj memoras ke en indekso 14, tie estas kie la grandeco estas, ekzemple, sed anstataŭ tio, kion ni faros al fari ĉi tiu pli facila estas encapsular ĝin en struct. Kaj tiel ni havos du structs faris por ni, BITMAPFILEHEADER kaj BITMAPINFOHEADER, kaj tiel ĉiufoje kiam ni legas en tiu dosiero, defaŭlte ĝi tuj iros en ordo, kaj tiel por ĝi estas same tuj plenigu en variabloj kiel biWidth kaj biSize. Kaj tiam finfine, ĉiu bildero estas reprezentita per tri bitokoj. La unua estas la kvanto de bluo en la rastrumeroj, la dua estas la kvanto de verdo, kaj fine, la kvanto de ruĝa, kie 0 estas esence ne blua aŭ neniu verda aŭ ne ruĝa kaj tiam ff estas la maksimuma valoro. Ĉi tiuj estas deksesuma valoroj. Se do ni havas FF0000, tiam kiu respondas al la maksimuma kvanto da blua kaj tiam ne verda kaj neniu ruĝa, do tiam kiu donus al ni blua bildero. Tiam se ni havas ff la tuta trans la tabulo, do tio signifas ke ni havas blankan bildero. Tio estas speco de kontraŭa al tipe kiam ni diras RGB. Ĝi estas vere tuj BGR. Do, se ni efektive rigardi en ekzemplo de bitmap image - lasu min eltiri unu ĝis ĉi tie. Ĝi estas iom malgranda. Mi zoom in, kaj ni povas vidi ĝi estas pixelated. Ĝi aspektas kiel blokoj de koloro. Vi havas blankajn blokojn kaj poste ruĝan blokoj. Se vi ludas en Microsoft Paint, ekzemple, vi povus fari ion tian per esence nur pentri iuj placoj en specifa ordo. Tial kion ĉi tradukas en la bitmap estas kiel sekvas. Jen ni havas unuaj blankaj rastrumeroj, ke ĉiuj 6 estas f estas, kaj tiam ni havas ruĝajn rastrumeroj, indikita de 0000ff. Kaj tial la vico da bajtoj, ke ni havas indikas, kiel la bitmap image tuj serĉos. Do kion mi faris tie ĵus skribis cxiujn tiujn bajtoj kaj tiam kolora en la ruĝa por ke vi povas ia vidas, se vi squint iomete, ke ia indikas smiley face. La vojo kiu bitmap bildoj laboro estas mi imagi ke esence kiel krado. Kaj tiel implicite, ĉiu vico de la krado devas esti oblo de 4 bitokoj. Se ni rigardas bitmap bildo, vi plenigi ĉiujn valoro. Ekzemple, vi povus havi ruĝan tie, verda tie, blua tie, sed vi devas certigi, ke la bildo estas plenigitaj per oblo de kvar bajtoj. Do se mi volas mian bildon esti tri blokoj larĝa, tiam mi devus meti malplena valoro en la lasta por fari ĝin oblo de kvar. Tial mi aldonus en io, kion ni nomas Plenigado. Mi nur tuj indikas ke tie kun x. Nun ke ni volas bildon kiu estas 7 rastrumeroj longe, ekzemple. Ni havas 1, 2, 3, 4, 5, 6, 7, kaj ĉiuj kiu plenigis per koloro. La vojo kiu bitmap bildoj labori estas ke ni bezonas 8a. Nun ni havas 1, 2, 3, 4, 5, 6, 7. Ni bezonas 8 spacoj por la bitmap image legi ĝuste. Tial, kion ni devas fari estas aldoni en nur iom de Plenigado certigi, ke ĉiuj el la larĝaj estas uniforma kaj ke ĉiuj el la larĝaj estas oblo de 4. Kaj do mi antaŭe indikis, padding kiel x aŭ squiggly linio, sed en la reala bitmap bildoj la Plenigado estas indikita per deksesumaj 0. Do kiu estus sola karaktero, 0. Kio povus veni en oportuna estas la xxd komando. Kion faras estas reale montras al vi, kiel simila al tio, kion mi faris antaŭe kun la smiley kiam mi efektive presitaj, kio ĉiu koloro estus por la pixel kaj tiam koloro-koditaj ĝin, kiam vi kuris xxd kun jenaj ordonoj, tiam estos reale presi kio la koloroj estas por tiuj bilderoj. Kion vi devas fari estas super tie mi indikas, kiel la-s 54 diras, ke mi tuj komencu ĉe la 54 bajtoj ĉar antaŭ tio, memoru, se ni retrorigardas al la mapo de la bitmaps, jen ĉiujn header informojn kaj aĵojn tiel. Sed kion ni vere zorgas pri estas la reala rastrumeroj kiu indikas la koloron. Do per aldono en tiu flago,-s 54, tiam ni povos vidi la koloron valoroj. Kaj ne zorgu pri la komplika flagoj kaj aĵoj tiel. En la problemon aro spec, vi devos direktoj pri kiel uzi xxd por montri la rastrumeroj. Do se vi vidas tie, ia aspektas kiel verda skatolo, tiu malgranda afero. Mi koloro-koditaj la 00ff00 kiel esence dirante neniu blua, tre verda, kaj neniu ruĝa. Do kiu respondas al verdo. Kiel vi vidas tie, oni vidas verdan ortangulon. Ĉi verda ortangulo estas nur 3 rastrumeroj larĝa, do tiam kion ni devas fari por certigi ke la bildo estas oblo de 4 larĝa estas aldoni en ekstra Plenigado. Kaj tiel do tiel estas kiel vi vidas tiujn _0s_ tie. Tiu fakte estos la rezulto de via Regrandigi pset, esence prenante la malgranda bitmap kaj poste pligrandigi ĝin per 4. Kaj tiel kion ni vidas estas ke en la praktiko tiu bildo estas 12 rastrumeroj larĝa, sed 12 estas oblo de 4, kaj tiel ni vere ne vidas ajnan _0s_ fine ĉar ni ne bezonas aldoni ajnan ĉar ĝi estas tute vatitaj. Ĝi ne havas plu ĉambro. Okay. Demandojn pri Plenigado? Okay. Cool. Kiel mi menciis antaŭe, la bitmaps estas nur vico da bajtoj. Kaj tiel kion ni havas estas Anstataŭ bezonado al konservi trako de ekzakte kion nombro de bajtoj respondas al specifa elemento, ni efektive kreis struct por reprezenti tion. Do kion ni havas estas RGBTRIPLE struct. Kiam ajn vi havas petskribon de RGB triobla, ĉar ĉi estas tipo difini struct, tiam vi povas aliri la rgbtBlue variablo, simile la Verda kaj ruĝa variabloj, kiu indikos kiom blua, verda, kaj ruĝa, respektive, kiun vi havas. Do, se ni havas la bluan variablo aro al 0, la verda aro al ff, kiu estas la maksimuma valoro vi povas havi, kaj tiam la ruĝa variablo starigis al 0, tiam kio koloro estus RGB tiu aparta triobla reprezenti? >> [Studento] Verdo. Verda. Ekzakte. Ĝi tuj estos utila por scii ke kiam vi havas petskribon de RGB triobla, vi povas reale atingi la kvanto de koloro - bluaj, verdaj, ruĝaj kaj - aparte. Nun ke ni jam parolis pri la strukturo de tiu, ni rigardu la BMP-dosiero. Ĉi tiuj estas structs faris por vi. Jen ni havas BITMAPFILEHEADER struct. De intereso estas la grandeco. Poste, ni havas la info header, kiu havas kelkajn pliajn aferojn, kiuj estas interesaj por ni, nome la grandecon, la larĝa, kaj la alto. Kiel ni iras en poste, kiam vi legas en la dosiero, ĝi aŭtomate legas en ĉar ni starigis la celo estu la sama. Do la biSize enhavos la dekstra bitokoj kiuj respondas al la reala grandeco de la bildo. Kaj tiam tie, laste, kiel ni jam parolis pri, ni havas la RGBTRIPLE typedef struct. Ni havas rgbtBlue, Verdo, kaj Reto asociita kun ĝi. Granda. Okay. Nun ke ni komprenas bitmaps iomete, kompreni, ke ni havas dosieron header kaj info header asociita kun ĝi kaj tuj poste, ni havas la interesan stuff de la koloroj, kaj tiuj koloroj estas reprezentitaj de RGBTRIPLE structs, kaj tiuj, siavice, havas tri valoroj asociitaj al la blua, la verda kaj la ruĝa. Do nun, ni povas ia pensas pri reakiri iom. Pardonu. Pensu pri Whodunit. Kiam ni havos niajn postsigno dosiero, tiam kion ni volas fari estas legita en ĝin rastrumeroj por pixel kaj poste iel ŝanĝi tiujn rastrumeroj tiel ke ni povas Eligo ĝin en legebla formato. Kaj tiel al eligo ĝin, ni tuj skribos rastrumeroj por pixel en la verdict.bmp dosiero. Tio estas speco de multe fari. Ni rimarkas tion. Do kion ni faris estas ni efektive provizis vin per copy.c. Kio copy.c faras estas nur faras ĝustan kopion de donita bitmap dosiero kaj tiam eligas ĝin. Do ĉi tiu jam malfermas la dosieron por vi, legas en rastrumeroj per rastrumeroj, kaj tiam skribas ĝin en enen eligo-dosiero. Ni rigardu tion. Ĉi tiu estas certigi taŭgan uzadon, atingi la dosiernomojn tie. Kion ĉi tio estas diferenco al la eniro dosieron por esti kio ni pasis en la infile tie, kio estas nia dua komand-linio argumento. Kontrolas por certigi ke ni povas malfermi la dosieron. Kontrolas por certigi ni povas fari novan outfile tie. Do kion ĉi faras ĉi tie, nur esence komencas legi en la bitmap dosiero de la komenco. La komenco, kiel ni scias, enhavas la BITMAPFILEHEADER, kaj tiel tiuj vicoj de bitoj estos rekte plenigi la BITMAPFILEHEADER. Do kion ni havas ĉi tie estas dirante ke BITMAPFILEHEADER bf - jen nia nova variablo de tipo BITMAPFILEHEADER - ni tuj metos ene bf kion ni legis el en pointer, kiu estas nia infile. Kiom ni legas? Ni legas en kiom da bajtoj necesas por enhavi la tutan BITMAPFILEHEADER. Simile, tio estas, kion ni faru kun la info kaploko. Do ni daŭrigis kune nia dosiero en la infile, kaj ni legas tiujn bitoj kaj bajtoj, kaj ni ŝtopanta ilin rekte en en tiuj kazoj de la variabloj kiuj ni faras. Jen ni simple certigi ke la bitmap estas bitmap. Nun ni havas outfile, ĉu ne? Do kiel ĝi staras, kiam ni krei ĝin, estas esence malplena. Do ni devas esence krei novan bitmap de nulo. Kion ni faras estas ni devas certigi, ke ni kopias en la dosiero header kaj la info header samkiel la infile havas. Kion ni faras estas ni skribi - kaj memoras, ke bf estas la variablo de tipo BITMAPFILEHEADER, do kion ni faras estas ni nur uzas tiun enhavon skribi al la outfile. Jen, memoru ni parolis pri Plenigado, kiom gravas por certigi ke la kvanto de rastrumeroj, ke ni havas estas oblo de 4. Ĉi tiu estas bela utila formulo por kalkuli kiom Plenigado vi havas donita la larĝo de viaj dosiero. Mi volas ke vi infanoj memori ke en copy.c ni havas formulon por kalkuli Plenigado. Okay? Do ĉiuj memoras tion. Granda. Tial kion copy.c faras sekva estas iterates super ĉiuj el la scanlines. Ĝi iras tra la vicoj unua kaj tiam stokas ĉiujn trioblo kiu legas kaj tiam skribas gxin en la outfile. Tial jen ni legas nur RGB triobla samtempe kaj poste meti tiu sama triopo en la outfile. La malfacila parto estas ke la Plenigado estas ne RVB triobla, kaj do ni ne povas simple legis tion Plenigado kvanto de RGB triopoj. Kion ni devas fari estas fakte nur movi nian dosieron pozicio indikilo, movi niajn kursoro, al ia salti super ĉiuj Plenigado por ke ni estas en la sekva vico. Kaj tiam kion ĉi faras estas kopio montras kiel vi eble volas aldoni la Plenigado. Do ni kalkulis kiom Plenigado ni bezonas, por ke signifas ke ni bezonas Plenigado nombro de _0s_. Kion ĉi tio estas por buklo kiu metas Plenigado nombro de _0s_ en niajn outfile. Kaj poste fine, vi fermas ambaŭ dosieroj. Vi fermas la infile tiel kiel la outfile. Do jen kiel copy.c verkoj, kaj tio tuj estos bela utila. Anstataŭ simple efektive rekte kopii kaj bati ĝin aŭ simple rigardante ĝin kaj tajpi en kion ajn vi volas, vi eble volas nur ekzekuti ĉi komandon en la fina stacio, cp copy.c whodunit.c, kiu kreos novan dosieron, whodunit.c, kiu enhavas la ĝusta sama enhavo kiel kopion faras. Tial kion ni povas fari estas uzi tion kiel kadro sur kiun konstrui kaj redakti por nia whodunit dosiero. Tio estas nia por-dos fari por Whodunit, sed kion copy.c faras Efektive oni prizorgas la plimulto de ili por ni. Do ni bezonas fari sekva estas ŝanĝi la rastrumeroj drajvo por fakte faras la dosieron legebla. Memoru ke por donita rastrumeroj triobla, do por donita variablo de tipo RGBTRIPLE, vi povas aliri al la blua, verda, ruĝa kaj valoroj. Tio tuj veni en oportuna ĉar se vi povas aliri ilin, tio signifas, ke vi povas ankaŭ kontroli ilin, kaj tio signifas ke vi povas ankaŭ ŝanĝi ilin. Do kiam ni reiris al nia ruĝa lupeo ekzemplo, esence, kiu agas kiel speco de filtrilo por ni. Do kion ni volas fari estas ni volas filtri ĉiujn triopoj kiuj eniranta Estas pluraj malsamaj manieroj fari tion. Esence, vi povas havi ajn tipo de filtrilo vi volas. Eble vi volas ŝanĝi ĉiuj ruĝa rastrumeroj aŭ eble vi volas ŝanĝi alian koloron rastrumeroj al malsama koloro. Tio dependas de vi. Memoru, ke vi povas kontroli kio koloro la pixel estas kaj tiam vi povas ankaŭ ŝanĝi ĝin kiel vi tuj tra. Okay. Do jen Whodunit. Kiam vi kuras Whodunit, vi scias kiu estas la kulpa de la krimo estis. Nun ni tuj iros al Regrandigi. Ni tuj ankoraŭ pritraktas bitmaps. Kion ni tuj ne estas ni tuj havos enigo bitmap kaj tiam ni tuj pasos en nombro kaj poste preni outfile bitmap kie tio estas esence nia infile grimpis per n. Diru mian dosiero estis nur unu bildero granda. Tiam se mia n havis 3, grimpita de 3, tiam mi ripetus ke rastrumeroj n plurfoje, tiom 3 fojojn, kaj tiam ankaŭ grimpi gxin 3 fojoj tiel. Do vi vidas min grimpi ĝin vertikale tiel kiel horizontale. Kaj poste jen ekzemplo. Se vi havas n = 2, vi vidos ke la unua blua rastrumeroj tie ripetis du fojojn horizontale tiel kiel du fojojn vertikale. Kaj tiam kiu daŭrigas plu, kaj tiel vi havos rektan grimpita de via originala bildo por du. Se do ni devis detale la _pseudocode_ por tio, ni volas malfermi la dosieron. Kaj tiam sciante ke se ni reiros tien, ni vidas ke la larĝa por la outfile tuj estos malsama ol la larĝeco de la infile. Kion tio signifas? Tio signifas, ke nia header informon tuj ŝanĝos. Kaj tiel kion ni volas fari estas ĝisdatigi la header info, sciante, ke, kiam ni legas en la dosieroj se vi operacias en la copy.c kadro, ni jam havas variablo kiu indikas, kion la grandeco estas kaj aĵoj tiel. Do iam vi havas tion, kion vi eble volas fari estas ŝanĝi tiujn apartajn variabloj. Memoru, se vi havas struct, kiel vi aliri la variabloj ene de tiu. Vi uzas la skalara operatoro, ĉu ne? Tial uzante tion, vi scias ke vi devas ŝanĝi la header info. Do jen estas nur listo de la reala elementoj kiuj tuj estos ŝanĝanta en via dosiero. La grandeco de dosiero tuj estos ŝanĝanta, la bildo, tiel kiel la larĝa kaj la alteco. Tial tuj reen al la mapo de la bitmaps, rigardu, ĉu ĝi estas la dosiero header aŭ info header kiu enhavas tiun informon kaj poste ŝanĝi drajvo. Denove, diru cp copy.c resize.c. Tio signifas ke resize.c nun enhavas ĉiun ke tio enhavita ene kopion ĉar kopio havigas al ni vojon de legado por ĉiu scanline rastrumeroj per rastrumeroj. Krom nun, anstataŭ nur modifi la valorojn kiel ni faris en Whodunit, kion ni volas fari estas ni volas skribi en multnombraj rastrumeroj tiel longe kiel niaj n estas pli granda ol 1. Do kion ni volas fari estas ni volas tiri ĝin horizontale per n, tiel kiel etendos ĝin vertikale per n. Kiel povus ni faru tion? Diru vian n estas 2 kaj vi havas ĉi donitaj infile. Via kursoron tuj starti je la unua, kaj kion vi volas fari se n estas 2, vi volas presi en 2 el tiuj. Do vi presi en 2 el tiuj. Tiam via kursoron tuj movi al la sekvanta rastrumeroj, kiu estas la ruĝa, kaj tuj presi 2 el tiuj ruĝaj, appending ĝin sur kio ĝi estas farita antaŭe. Tiam la kursoro moviĝas al la sekvanta pixel kaj desegni en 2 el tiuj. Se vi retrorigardas al la copy.c kadro, kio estas tiu faras ĉi tie Estas ĝi kreas novan petskribon de RGB triobla, nova variablo nomas triobla. Kaj tie, kiam ĝi legas en ĝin, ĝi legas el la infile 1 RGBTRIPLE kaj stokas ĝin ene de tiu triobla variablo. Tial vi efektive havas variablo reprezenti tiun apartan bildero. Tiam kiam vi skribas, kion vi eble volas fari estas encase la fwrite deklaron en por buklo kiu skribas ĝin en vian outfile tiom da fojoj kiel bezonataj. Tio estas sufiĉe simpla. Nur esence ripetos la skribo procezo n plurfoje grimpi ĝin horizontale. Sed tiam ni devas memori, ke nia kompletigo tuj ŝanĝos. Antaŭe, diru ni havis iom da longo 3. Tiam ni simple aldoni en kiom Plenigado? Nur unu pli por fari ĝin oblo de 4. Sed diru ni grimpante tiu aparta bildo por n = 2. Tial, kiom da bluaj pixeles estus ni havas en la fino? Ni havus 6. 1, 2, 3, 4, 5, 6. Bone. 6 ne estas oblo de 4. Kio estas la plej proksima oblo de 4? Tio tuj estos 8. Do ni vere havos 2 signoj de Plenigado tie. Ĉu iu memoras se ni havas formulon por kalkuli Plenigado kaj kie, ke povus esti? [Inaudible studento respondon] >> Jes, copy.c. Ĝuste. Estas formulo en copy.c kalkuli kiom Plenigado vi havas donita aparta larĝa de la bitmap bildo. Tial ke tuj estos utila kiam vi bezonas aldoni en certa kvanto de Plenigado al reale kalkuli kiom Plenigado vi bezonas aldoni. Sed unu noton, tamen, estas ke vi volas certigi ke vi uzas la dekstran grandeco. Nur atentu ĉar vi esence tuj estos kontraktanta kun du bitmap bildoj. Vi volas certigi ke vi uzas la gxustan. Kiam vi kalkulanta la Plenigado por la outfile, vi volas uzi la larĝeco de la outfile kaj ne la larĝo de la antaŭa. Granda. Tia prizorgas etendinte tuta bitmap image horizontale. Sed kion ni volas fari estas vere etendos ĝin vertikale tiel. Ĉi tuj estos iom trickier ĉar kiam ni finis kopii vico kaj skribante ke vico, nia kursoron tuj estos en la fino. Do, se ni legas denove, tiam ĝi estas ĝuste tuj legos en la sekva linio. Do kion ni volas fari estas speco de trovi iun manieron de kopiado tiuj vicoj denove aŭ nur ia porti tiun vico kaj tiam reverkada ĝi denove. Kiel mi specon de aluditaj, estas pluraj malsamaj manieroj fari tion. Kion vi povus fari estas kiel vi tuj tra kaj legante tra la aparta scanline kaj ŝanĝante ĝin kiel necesa, tiam ia vendejo ĉiuj el tiuj bilderoj en tabelo. Tiam vi poste estu kiu vi devas presi tiu tabelo denove, kaj tiel vi povas simple uzi tiun tabelo por fari tion. Alia maniero por fari ĝin estas vi povus kopii malsupren unu vico, komprenas, ke vi bezonas kopii tion denove, do fakte movi vian kursoron, kaj ke tuj uzos la metodo fseek. Vi povus kopii vian kursoron tuta vojo reen kaj poste ripeti la kopion procezo denove. Do, se nia skalo nombro estas n, tiam kiel multfoje estus ni devas iri reen kaj reverki linion? >> [Studento] n - 1. >> Jes, perfekta. n - 1. Ni faris tion unufoje jam, do tiam ni deziras ripeti la reiros procezo n - 1 kvanto de fojoj. Okay. Do jen vi havas vian Regrandigi funkcio. Nun ni povas atingi vere amuza parto, mia preferita pset, kiu estas rekuperi. Anstataŭ bitmaps, ĉifoje ni pritraktas JPEG-oj. Ni fakte ne donita dosiero nur de JPEG-oj, ni donita esence kruda memoro karto formato. Kaj tiel ĉi enhavas iom da informoj kaj rubo valorojn en la komenco, kaj tiam komenciĝas kaj ĝi havas aron de JPEG-dosierojn. Tamen, ni transdonis karton kie ni forviŝita la fotojn; esence, ni forgesis kie la fotoj estas lokitaj ene de la karto. Tial nia tasko en reakiri estas iri tra ĉi karto formato kaj trovi tiujn bildojn denove. Bonŝance, la strukturo de JPEG-dosierojn kaj la karto dosiero estas iom utila. Ĝi certe povintus esti iom trickier se ne estus en ĉi tiu aparta formato. Ĉiu JPEG dosiero fakte komencas kun du eblaj vicoj, listita supre. Esence, ĉiufoje vi havas novajn JPEG-dosiero, ĝi komenciĝas per ĉu la vico ffd8 ffe0 aŭ la alia, ffd8 ffe1. Alia utila afero scias nur ke JPEG-oj estas konservataj contiguously. Do kiam ajn oni JPEG dosiero finiĝas, la alia unu komenciĝas. Do ne ekzistas ia ajn en-inter valoroj tie. Kiam vi batis la komenco de JPEG, se vi jam legis JPEG, vi scias, ke vi batis la fino de la antaŭa kaj la komenco de la sekva. Al ia bildigi ĉi, mi faris esquemáticas. Alia afero pri JPEG-oj estas ke ni povas legi ilin en vicoj de 512 bitokoj samtempe, simile kun la komenco de la karto. Ni ne bezonas esti kontrolanta ĉiu unuopa bajto ĉar tio suck. Do anstataŭe, kion ni povas fari estas fakte nur legas en 512 bitokoj samtempe kaj poste, anstataux kontroli en inter tiuj en tiuj etaj iom tranĉaĵoj, ni povas simple kontroli la komenco de la 512 bajtoj. Esence, en ĉi tiu bildo, kion vi vidas estas la komenco de la karto, vi havas valorojn kiuj ne estas vere grava por la efektiva JPEG-oj mem. Sed tiam kion mi havas estas stelo por indiki unu el la du startanta sekvencoj por JPEG. Do kiam ajn vi vidas stelon, vi scias ke vi havas JPEG dosiero. Kaj tiam ĉiu JPEG dosiero tuj estos iu multaj de 512 bitokoj sed ne nepre la samajn multnombraj. La vojo, kiun vi scias, ke vi batis alia JPEG estas se vi batis alia stelo, alia komencante vico de bajtoj. Do kion vi havas tie estas vi havas la ruĝajn JPEG dosiero daŭrigi ĝis vi batis stelo, kiu estas indikita per nova koloro. Vi daŭrigu kaj tiam vi batis alia stelo, vi batis alia JPEG, vi daŭras la tutan vojon ĝis la fino. Vi estas en la lasta foto tie ĉi, la rozkolora. Vi iru al la fino, ĝis vi batis la fino de dosiero karaktero. Ĉi tuj estos vere utila. Kelkaj ĉefaj takeaways tie: La karto dosiero ne komenci per JPEG, sed unufoje JPEG startas, ĉiuj de la JPEG-oj estas konservataj flank unu al la alia. Iuj _pseudocode_ por la rekuperi. Unue, ni tuj malfermu niajn karto dosiero, kaj tio tuj estos uzante nia dosiero / S funkcioj. Ni tuj ripeti la sekva procezo ĝis ni atingis la finon de la dosiero. Ni tuj legos 512 bitokoj samtempe. Kaj kion mi diris tie estas ni iras por stoki ĝin en bufro, do esence tenadi tiujn 512 bitokoj ĝis ni scias precize kion fari kun ili. Do kion ni volas fari estas ni volas kontroli ĉu ni batis stelo aŭ ne. Se ni batis stelon, se ni batis unu el la komenca sekvencoj, tiam ni scias ke ni atingis novan JPEG dosiero. Kion ni volas fari estas ni tuj volas krei novan dosieron en nia pset4 katalogo daŭre fari tiu dosiero. Sed ankaŭ, se ni jam faris JPEG antaŭ, tiam ni volas fini tiu dosiero kaj puŝi ĝin al la pset4 dosierujo, kie ni devos tiu dosiero stokita ĉar se ni ne specifas kiun ni finiĝis ke JPEG-dosiero, tiam ni esence havas argumenta kvanto. La JPEG-oj neniam finiĝi. Do ni volas certigi, ke kiam ni legas en al JPEG dosieron kaj skribas ke, ni volas specife fermi, ke por malfermi la proksima. Ni volas kontroli plurajn aferojn. Ni volas kontroli ĉu ni estas je la komenco de nova JPEG per niaj buffer kaj ankaŭ se ni jam trovis JPEG antaux ĉar tio ŝanĝos vian procezon iomete. Tial post vi iros tra la tuta vojo, kaj vi batis la fino de la dosiero, tiam kion vi volas fari estas vi volas fermi ĉiujn dosierojn kiuj aktuale malfermos. Tio verŝajne estos la lasta JPEG dosiero kiun vi havas, tiel kiel la karto dosieron ke vi estis pritraktas. La lasta obstaklo ke ni bezonas pritrakti estas kiel vere fari JPEG dosieron kaj kiel vere puŝi ĝin al la dosierujo. La pset postulas, ke ĉiu JPEG, kiun vi trovos esti en la jena formato, kie vi havas la numeron. jpg. La nombro, eĉ se ĝi estas 0, ni nomas ĝin 000.jpg. Kiam ajn vi trovas JPEG en via programo, vi tuj volas citi ĝin en la ordo kiu ĝi estas trovitaj. Kion tio signifas? Ni bezonas ia konservi trako de kiom ni trovis kaj kion la nombro de ĉiu JPEG devas esti. Jen ni iras al utiligi la sprintf funkcio. Simila al printf, kiu ĵus speco de gravuraĵoj valoro eksteren en la fina stacio, sprintf presas la dosieron el la interna dosierujo. Kaj tiel kion ĉi farus se mi havus sprintf, titolo, kaj poste la kordo tie, estus presi 2.jpg. Supozante ke mi fermis miajn dosierojn ĝuste, kiu enhavus la dosiero, kiun mi estis skribante eksteren. Sed unu afero estas ke la kodo kiun mi havas ĉi tie ne tute kontentigas kion la pset postulas. La pset postulas ke la dua JPEG dosiero devus esti nomata 002 anstataŭ nur 2. Do kiam vi presi la nomon, tiam eble vi povus voli ŝanĝi la lokokupilo iomete. Ĉu iu memoras kiel ni permesi por ekstra spacoj, kiam ni presi ion? Yeah. >> [Studento] Vi metis 3 inter la procentoj signo kaj la 2. >> Jes, perfekta. Vi metis 3 en ĉi tiu kazo ĉar ni volas spaco por 3. % 3d probable vin 002.jpg anstataŭ 2. La unua argumento en la sprintf funkcio estas fakte char tabelo, kiuj ni antaŭe sciis kiel kordoj. Tiuj volo, ia pli kiel portempa stokado, nur gardi la rezulta cxeno. Vi ne vere pritraktas tion, sed vi bezonas inkluzivi ĝin. Sciante, ke ĉiu dosiero nomo havas la numeron, kiu okupas tri karakteroj, kaj tiam. jpg, kiom longe devas ĉi tabelo estas? Elĵetas nombro. Kiom da signoj en la titolo, en la nomo? Do ekzistas 3 hashtags, periodo, jpg. >> [Studento] 7. >> 7. Ne tute. Ni tuj volas 8 ĉar ni volas enkalkuli la nula Terminator tiel. Fine, nur por desegni la procezo kiu vi faros por rekuperi, vi havas iujn komenco informo. Vi daŭrigu ĝis vi trovas la komencon de JPEG-dosiero, kaj kiu povas esti aŭ unu el du startanta sekvencoj. Vi daŭre legi. Ĉiu oblikvo tie reprezentas 512 bajtoj. Vi daŭre legado, daŭre legi ĝis vi renkontos alian ekde sekvenco. Kiam vi havas tion, vi finos la nunan JPEG - en ĉi tiu kazo, ĝi estas la ruĝa, tiel vi volas fini tion. Vi volas sprintf la nomo de tiu en viajn pset4 dosierujo, tiam vi volas malfermi novan JPEG kaj tiam daŭre legi ĝis vi renkontas la sekvantan. Konservu en legado, daŭre legado, kaj tiam fine, finfine, vi tuj atingi la finon de dosiero, kaj tiel vi volas fermi la lastan JPEG, ke vi laboras kun, sprintf ke en viajn pset4 dosierujo, kaj tiam rigardi ĉiujn fotojn kiujn vi alveninta. Tiuj fotoj estas vere pentraĵoj de CS50 bastonon, kaj tiel ĉi tiu estas kie la bonus amuza parto de la pset venas en estas, ke vi estas rivalaj en via sekcioj por trovi la TFs en la fotoj kaj fari fotojn kun ili por pruvi, ke vi faris la pset kaj tiel vi povas vidi kion bastonon membroj estas en la pentraĵoj. Tial vi preni fotojn per la bastono. Kelkfoje vi devos postkuri ilin malsupren. Probable iuj el ili provos forkuri de vi. Vi preni fotojn kun ili. Ĉi tiu estas daŭranta. Ne pro kiam la pset estas pro. La limdato estos anoncitaj en la specifon. Tiam kune kun via sekcio, kiom sekcio prenas la plej fotojn kun la plej stabanojn gajnos belan awesome premion. Tio estas speco de stimulo por ke via pset4 finis kiel eble plej rapide ĉar tiam vi povas akiri malsupren en business ĉasi sur la tuta malsama CS50 bastonon membroj. Tio ne deviga, tamen, do iam vi havos la bildojn, tiam vi finis kun pset4. Kaj mi finis kun Walkthrough 4, tiel dankas vin ĉiujn pro veni. Bonŝancon kun forensics. [Aplaŭdo] [CS50.TV]