>> [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.