[MUZIKO Ludanta] ZAMYLA CHAN: Ni pritrakti resanigxos. Reakiri verŝajne estas mia plej ŝatata PSET, kaj ĉefe ĉar mi pensas, ke estas vere, vere malvarmeta. Esence, vi donita memoro karto dosieron en kiu bildoj estis forigita. Sed kion vi tuj fari estas forprenis ilin ĉiujn. OK. Do estas vere ekscita, sed eble iom timiga, ĉar vi estas donis malplenan C dosieron kaj vi devas plenigi it in OK, do ni rompi ĉi en regebla partoj. Vi volas malfermi la memoro karto dosiero. Tio ŝajnas sufiĉe simpla. Tiam, trovi la komenco el JPG bildo. Ĉiuj dosieroj en tiu memoro karto tuj estos JPGs. Tiam, kiam vi trovos la komenco, Vi iras malfermi novan JPG, ke estas, kiel, krei JPG, kaj skribu 512 bajto je tempo ĝis nova JPG estas trovi, kaj finante la programo, unufoje vi detektas la fino de la dosiero. Do unue paŝojn unua estas malfermi la memoro karto dosiero. Sed vi scias ĉi jam, kaj tie estas dosiero / Aŭ funkcio kiu tuj montrigxos tre utila. OK. Do kio estas JPGs? Ĉar ni bezonas la komenco. Nu, JPGs, samkiel iom mapoj, estas nur sekvencoj de bajtoj. Bonŝance, cxiun JPG komenciĝas per ĉu 0xff, 0xd8, 0xff, 0xe0, unu vico de bajtoj, aŭ alia sekvencon da bajtoj. Do tiuj kvar bajtojn indiki la komencon de JPG. Neniu alia ol tiuj du kombinaĵoj de kvar bajtojn. Kaj bonŝance por ni, alia fakto, ke ni povas utiligi estas ke ĉiu JPG estas stokita flanko al flanko en la memoro karto. Mi reprezentis la strukturo de memoro karto esquemáticamente sur tiu gliti tien. Ĉi tie, ĉiu kvadrata, ĉiu ortangulo, reprezentas 512 bajtoj, kaj gxi startas kun griza en kiuj ni ne vere havas JPG. Sed tiam ni fine trafis bloko kun stelo. Tio signifas, ke la unuaj kvar bajtojn ekstere de tiuj 512 estas unu el tiuj du komencante sekvencoj de JPG. Kaj ni iru el tie, kaj tiam unufoje unu JPG finiĝas, la sekvanta oni komencas. Ni ne iam havos plu griza spaco en-inter. Sed kiel do ni efektive legas ĉi tion, kaj legi la 512 bitokoj tiel ke ni povas fari la komparo la unua loko? Nu, ni reiru al fread, kiuj preno en la struct kiu enhavos la bajtoj ke vi legas. Do vi iras meti tiuj en tie - la grandecon, la nombro, kaj tiam inpointer ke vi legas el. Nun, ni deziras legi 512 samtempe, kaj ni volas konservi tion en buffer, Mi iras por voki lin. Esence, ni iras al teni sur tiuj 512 bitokoj kaj fari aferojn kun ĝi, ĉu ne? Ni ĉu tuj kompari la unua kvar bajtojn, aŭ ni iras al legi ĝin en: OK? Do tiam la datumoj montrilon estos tiam servi kiel via kuseneto, kaj la inpointer, nu, tio estas nur irante por esti via memoro karto. Reen al nia memoro karto grafika dokumento. Ni legos 512 bitokoj samtempe, stokante ĉiun 512-bajto bloko en buffer, tenante sur tiuj buffer, tiuj 512 bitokoj, ĝis ni scias ekzakte kion fari ilin. Do la komenco ne estas io, tiom ni legu la buffer, komparu ĝin, kaj ni ne bezonas fari ion kun tio. Kaj tiam, ni fine trafis stelo bloki, signifanta, ke ni trovis nian unuan JPG. Do la bufro nun tenas bajtoj el tiu JPG. La venonta fojo 512 bitokoj, ĉar ili estas ne stelo bloko, estas ankaŭ parton de tiu JPG. Kaj JPGs estas kontinua de tie sur en, ĝis ni batis la sekvanta JPG. Kaj tiam la buffer tiam tenas 512 bajtoj por ke JPG, kaj tiel plu, kaj tiel plu. OK. Do iam vi batis la unua frakasita bloko, la unua JPG, kiel do vi fakte, nu, malfermi ĝin? Ni faru novan JPG. La dosiernomoj por JPG tuj esti en la formato, nombro, numero, number.jpg, en kiu ili estas nomata en la ordo en kiu ili troviĝas, startanta je 0. Do la unua JPG ke vi trovi estos 000.jpg. Do, verŝajne estas bona ideo konservi trako de kiom JPGs vi trovis ĝis nun. Do tio estas la dosiernomo. Sed kiel vi efektive faras tion? Nu, ni tuj uzi funkcio nomita sprintf. Iom simila al printf, kie vi povas uzi anstataŭiloj por kordoj, krom en tiu kazo, sprintf presos la dosiero eksteren en la nuna dosierujo, ne en la terminalo. OK. Do ĉi tie ni vidas ke ni havas titolon, a char tabelo kiu stokas la rezulta cxeno, kaj ni pasas en la titolo de la efektiva kordo kun lokokupilo, simple ŝatas ni lernis fari per printf. Sed tiu kodo, ke mi havas ĉi tie donos 2.jpg, ne 002.jpg. Do mi lasos al vi, por eltrovi, kiel modifi la lokokupilo fari la korekta nomo. OK. Do iam vi sprintf'd tiam vi povas malfermu tiun dosieron, ĉar ĝi ekzistas en vian dosierujon, kun fopen, uzante la titolo, kaj poste ajn moduso vi volas malfermi tiun dosieron in Do nun, ke ni jam malfermis novan JPG-dosiero, Nun ni povas skribi 512 bitokoj ĉe tempo, ĝis nova JPG estas trovitaj. Do ni prenu alian rigardon ĉe la sintakso de fwrite. Mi scias ke mi montras ĉi slide a multe, sed mi nur volas certigi ke vi uloj ne ricevas tro konfuza, ĉar Mi scias ke ĝi estas tre facile konfuziĝas inter la unua kaj la lasta argumento, en aparta. Sed memoru, ke vi skribas de via bufro en la ekster-dosiero bildoj. Nun ke vi sciigxos, kiel la registran 512 bajtoj en viajn JPG-dosiero kiun vi jam kreita, bone, ni volas halti tiun procezo iam ni atingis la finon de nia karto, ĉar tie ne estos plu bildojn por esti trovita. Do ni revenu al fread ankoraŭfoje, mi promesas. fread revenas kiom erojn de grandeco, grandeco, estis preta en sukcese. Ideale, tiu tuj estos ajn vi pasas en por nombro, ĉu ne? Ĉar vi provas legi nombro de eroj de grandeco, amplekso. Sed se fread ne povis legi ke nombro de elementoj, do ĝi revenos kion ajn nombro legis sukcese. Nun, unu grava afero por noti estas ke se vi uzas alian dosieron I / O funkcio kiel fgetc, ĝi havos ankaŭ revenos kiom da aĵoj legis sukcese. Kio estas utilaj pri tiu funkcio estas ke se vi uzas funkcioj ene de kondiĉo, ĝi devos ekzekuti sin mem dum determinante ke kondiĉo, kiu estas nur vere utila. Do se vi havas ĉi kondiĉoj, ekzemple, se fread buffer, sizeof HUNDO, 2, montrilo, egalas egalas 1, ke signifas ke mi ŝatus legi 2 hundoj ĉe la tempo. Sed se fread redonas 1 anstataŭ 2 kiel atendis, tio signifas ke estas 2 hundoj lasita en mia dosiero, sed prefere 1. Sed se ĝi redonas 2, tiam mi ankoraŭ havas tiuj 2 hundoj interne de mia bufro. Do nun tiu donas senton pri kiel kontroli por la fino de la dosiero, sed ni iru tra nun la logiko. Kiel do ni efektive peco ĉiuj de ĉi tiuj elementoj kune? Iam ni trafis nian unuan JPG, ekde Ni scias ke JPGs estas stokitaj contiguously, ni skribos ĝis Ni atingas la finon de la karto dosiero. Sed ni ne volas skribi nenion ĝis tiam. Do ĝi importas, ne nur ke ni estas ĉe la komencon de nova JPG, sed ĉu Ni jam trovis JPG aŭ ne. Se temas pri la komenco de nova JPG, ni ĉu fermi nian aktualan JPG-dosiero, se ni havos unu malferma kaj libera nova skribi en. Se ĝi ne estas la komenco de la nova JPG, kvankam, ni observu la sama jpg dosieron malfermi kaj skribi en tiu. Ni skribas nia bufro en kiu ajn Jpg-dosiero, ni havas malferman, kondicxe ke Ni havas unu libera, kompreneble. Se ni ne trovis nian unuan JPG tamen, ni ne skribas ion ajn. Kaj ĉi procezo daŭras ĝis vi atingi la finon de la karto dosiero. Kaj fine, vi volas fari certa, ke vi fclose ajna dosierojn kiujn vi jam fopened. Iam vi estas komforta kun la konceptoj, rigardu en iu _pseudocode_, kiun mi inkludis cxi tie. Unue, vi volas malfermi la karto-dosiero, kaj tiam ripeti la sekva procezo ĝis kiam vi mem atingis la Fine de la karto. Vi volas legi 512 bitokoj en bufron. Uzanta ke bufron, vi volas kontroli ĉu vi estas je la komenco de nova JPG aŭ ne. Kaj la respondo al tiu demando estos tuŝas vian dosieron mastrumado - kio dosierojn vi malfermos, kiuj ones vi fermas. Poste, ĉu vi jam trovis JPG? Kiel vi estis gardante spuro de tiu? Tiam, depende de tio, vi trovos ĉu skribu en la nuna JPG ke vi havas malferman, aux ne skribi ĝin ĉe ĉiuj, cxar vi ne trovis JPG ankoraŭ. Finfine, iam vi jam atingis la finon de la dosieron, vi volas fermi ajnan restantaj dosieroj kiujn vi havas malfermita. Ni volas esti ordigita tie. Kaj kun tio, kiun vi savis cxion de la mankantajn dosierojn de tiu memoro karto, kiu estas bela miriga heroaĵo. Do frapeti mem sur la dorso. Sed, estas unu malpli ero al la PSET, kiu estas la konkurso. Vi trovos, ke ĉiuj el la staloj ke vi reakiris estas reale bildoj de CS50 bastono. Do se vi estas en kampuso aŭ ie proksime, do vi povas fari fotojn kun la bastonon, kaj la sekcio kiu havas la plej bildoj kun stabanojn el iliaj rekuperis dosieroj get imponega premion. Kun tio, tiam vi jam finita la reakiri PSET. Mia nomo estas Zamyla, kaj ĉi tiu estas CS50.