[Music kucheza] ZAMYLA CHAN: Hebu kukabiliana na kupona. Kuokoa pengine ni pset favorite, na hasa kwa sababu mimi nadhani ni kweli, kweli baridi. Kimsingi, wewe ni kupewa kumbukumbu faili kadi ambayo picha kuwa imefutwa. Lakini nini ni kwenda kufanya ni kuokoa yao yote. OK. Hivyo ni kweli kusisimua, lakini labda kidogo vitisho, kwa sababu wewe ni kutokana na tupu C file na una kujaza in OK, hivyo hebu kuvunja hii katika sehemu manageable. Utasikia wanataka kufungua kadi ya kumbukumbu file. Hiyo inaonekana rahisi kutosha. Kisha, kupata mwanzo ya JPG picha. Mafaili yote juu ya kumbukumbu hii kadi ni kwenda kuwa JPGs. Basi, mara moja kupata mwanzo, wewe kwenda kufungua JPG mpya, kwamba ni, kama, kujenga JPG, na kuandika 512 byte wakati mpaka mpya JPG ni kupatikana, na kumalizia mpango huo, mara kuchunguza mwisho wa faili. Hatua hiyo ya kwanza ya kwanza ni kufungua kadi ya kumbukumbu file. Lakini unajua hii tayari, na kuna file I / O kazi hiyo kwenda kuthibitisha muhimu sana. OK. Kwa hiyo kile ni JPGs? Kwa sababu tunahitaji mwanzo. Naam, JPGs, kama ramani kidogo, ni Utaratibu wa tu ya ka. Kwa bahati nzuri, kila JPG kuanza na ama 0xff, 0xd8, 0xff, 0xe0, mlolongo moja ya ka, au nyingine mlolongo wa ka. Hivyo wale ka nne zinaonyesha mwanzo wa JPG. Hakuna wengine zaidi kuliko wale mchanganyiko mbili ya ka nne. Na kwa bahati yetu, ukweli mwingine kwamba sisi unaweza kuchukua faida ya ni kwamba kila JPG ni kuhifadhiwa upande kwa upande juu ya kadi ya kumbukumbu. Nimekuwa kuwakilishwa muundo wa kadi ya kumbukumbu schematically juu ya hili slide hapa. Hapa, kila mraba, kila mstatili, inawakilisha 512 ka, na kuanza rangi ya katika kwamba sisi si kweli kuwa JPG. Lakini basi sisi hatimaye kugonga kuzuia na nyota. Hiyo ina maana kwamba kwanza ka nne nje ya wale 512 ni moja ya hizo mbili kuanzia Utaratibu wa JPG. Na sisi kwenda huko, na kisha mara moja JPG moja kumalizika, moja ijayo huanza. Sisi si milele yoyote zaidi gray nafasi kati. Lakini jinsi gani sisi kweli kusoma hii, na kusoma ka 512 ili tuweze kufanya kulinganisha nafasi ya kwanza? Naam, hebu kwenda nyuma ya fread, ambayo inachukua katika struct ambayo yana ka kwamba wewe ni kusoma. Hivyo ni kwenda kuweka wale walio katika hapo - kawaida, idadi, na kisha inpointer kwamba wewe ni kusoma kutoka. Sasa, tunataka kusoma 512 kwa wakati mmoja, na tunataka kuhifadhi hii katika buffer, Mimi nina kwenda simu yake. Kimsingi, tunakwenda kushikilia kwenye wale ka 512 na kufanya mambo na hayo, right? Sisi ni kwenda aidha kwa kulinganisha kwanza ka nne, au tunakwenda kusoma katika, OK? Hivyo basi data pointer mapenzi kisha kutumika kama buffer yako, na inpointer, vizuri, kwamba ni kwenda tu kuwa kumbukumbu ya kadi yako. Nyuma kwa kadi ya kumbukumbu yetu schematic. Sisi ni kwenda kusoma 512 ka wakati huo, kuhifadhi kila block 512-Byte ndani ya buffer, kufanya kwenye wale buffer, wale ka 512, mpaka tunajua hasa nini cha kufanya yao. Hivyo mwanzo ni si kitu, hivyo tutaweza kusoma buffer, kulinganisha, na sisi haja ya kufanya kitu chochote kwa hayo. Na kisha, sisi hatimaye kugonga nyota kuzuia, kwa maana kwamba tumekuwa kupatikana JPG yetu ya kwanza. Hivyo buffer sasa kushikilia ka na kwamba JPG. wakati mwingine 512 ka, kwa sababu wao ni si kuzuia nyota, pia ni sehemu ya kwamba JPG. Na JPGs ni kuendelea kutoka huko katika, mpaka sisi kugonga JPG ijayo. Na kisha buffer kisha anashikilia 512 ka kwa kuwa JPG, na kadhalika, na kadhalika. OK. Hivyo mara moja kugonga kwanza hoja ya kuzuia, JPG kwanza, jinsi gani unaweza kweli, vizuri, ni wazi? Hebu kufanya mpya JPG. filenames kwa JPG ni kwenda kuwa katika format, simu, namba ya, number.jpg, kwa kuwa wao ni jina lake katika utaratibu ambao wao ni kupatikana, kuanzia saa 0. Hivyo JPG kwanza kwamba kupata itakuwa 000.jpg. Kwa hiyo, pengine ni wazo nzuri kuweka wimbo jinsi JPGs wengi Nimepata hadi sasa. Hivyo kwamba ni jina la faili. Lakini jinsi gani unaweza kweli kufanya hivyo? Naam, sisi ni kwenda kutumia kazi kuitwa sprintf. kidogo sawa na printf, ambapo unaweza kutumia placeholders kwa masharti, ila katika kesi hii, sprintf magazeti file nje ndani ya sasa ya directory, si ndani ya wastaafu. OK. Kwa hiyo hapa tunaona kwamba tuna cheo, char safu kwamba kuhifadhi kamba matokeo, na sisi kupita katika jina la string halisi na placeholder, kama vile tumekuwa kujifunza kwa kufanya na printf. Lakini kanuni hii kwamba mimi hapa nitakupa 2.jpg, si 002.jpg. Basi, mimi itabidi kuondoka kwa wewe kujua jinsi ya kurekebisha placeholder kufanya jina sahihi. OK. Hivyo mara moja umefanya sprintf'd basi unaweza kufungua faili kwamba, kwa sababu ipo katika saraka yako, na fopen, kwa kutumia cheo, na kisha mode chochote unataka kufungua faili kwamba in Hivyo sasa kwamba tumekuwa kufunguliwa mpya JPG file, sasa tunaweza kuandika 512 ka katika wakati, mpaka JPG mpya kupatikana. Basi hebu tuangalie tena katika syntax ya fwrite. Najua kwamba nina kuonyesha hii slide a mengi, lakini mimi nataka tu kuhakikisha kwamba nyie hawapati pia kuchanganyikiwa, kwa sababu Najua kwamba ni rahisi sana kwa kuchanganya kwanza na mwisho hoja, hasa. Lakini kumbuka kwamba wewe ni kuandika kutoka buffer yako katika images nje file. Sasa kwa kuwa wewe kujua jinsi ya kuandika 512 ka katika JPG file yako kwamba wameweza kuundwa, vizuri, tunataka kuacha kuwa mchakato mara moja tumekuwa kufikiwa mwisho wa kadi yetu, kwa sababu hakutakuwa na picha yoyote zaidi kwa kupatikana. Basi hebu kwenda nyuma fread mara moja zaidi, mimi ahadi. fread anarudi vitu wangapi wa kawaida, ukubwa, walikuwa tayari katika mafanikio. Kusema ukweli, hii ni kwenda kuwa chochote kupita katika kwa idadi, sawa? Kwa sababu wewe ni kujaribu kusoma idadi ya mambo ya kawaida, ukubwa. Lakini kama fread ni si uwezo wa kusoma kwamba idadi ya vipengele, basi itabidi kurudi chochote idadi ni kusoma kwa mafanikio. Sasa, jambo moja muhimu kutambua ni kwamba kama matumizi ya faili mwingine I / O kazi kama fgetc, kutakuwa na pia kurudi jinsi vitu vingi ni kusoma kwa mafanikio. Nini muhimu kuhusu kazi hii ni kwamba kama matumizi ya kazi ndani ya hali, kutakuwa na kutekeleza yenyewe wakati kuamua kwamba hali, ambayo ni tu muhimu kweli kweli. Hivyo kama una hali ya hii, kusema, kama fread buffer, sizeof DOG, 2, pointer, sawa na sawa na 1, kwamba ina maana kwamba Ningependa kusoma 2 mbwa wakati huo. Lakini kama fread anarudi 1 badala ya 2 kama ilivyotarajiwa, hiyo ina maana kwamba kuna 2 mbwa wa kushoto katika faili yangu, lakini badala ya 1. Lakini kama kuirudisha 2, basi mimi bado na wale mbwa 2 ndani ya buffer yangu. Hivyo sasa kwamba inatoa hisia ya jinsi ya kuangalia kwa mwisho wa faili, lakini hebu kwenda kwa njia ya sasa mantiki. Je, sisi kweli kipande wote ya mambo haya pamoja? Mara baada ya sisi kugonga JPG wetu wa kwanza, tangu tunajua kwamba JPGs ni kuhifadhiwa contiguously, tutaweza kuwa na kuandika mpaka sisi kufikia mwisho wa faili kadi. Lakini hatutaki kuandika kitu mpaka wakati huo. Hivyo mambo, si tu kwamba tuko katika mwanzoni mwa msimu mpya JPG, lakini kama tumekuwa tayari kupatikana JPG au la. Kama Ni mwanzoni mwa msimu mpya JPG, tutaweza unataka karibu JPG faili wetu sasa kama tuna wazi moja, na wazi mwezi mmoja kuandika ndani. Kama siyo mwanzo wa JPG mpya, ingawa, tutaweza kuweka sawa JPG file kufungua na kuandika ndani ya hiyo. Tutaweza kuandika buffer yetu katika namna yoyote JPG file tuna wazi, mradi tuna wazi moja, bila shaka. Kama hatuna kupatikana JPG wetu wa kwanza Hata hivyo, sisi wala kuandika kitu chochote. Na mchakato huu unaendelea mpaka kufikia mwisho wa faili kadi. Na hatimaye, utasikia wanataka kufanya kuhakikisha kwamba fclose yoyote files kwamba umefanya fopened. Mara baada ya wewe ni starehe na dhana, tuangalie baadhi ya pseudocode, ambayo nimekuwa ni pamoja na hapa. Kwanza, unataka kufungua faili kadi, na kisha kurudia utaratibu zifuatazo mpaka wameweza kufikiwa mwisho wa kadi. Unataka kusoma 512 ka ndani ya buffer. Kwa kutumia buffer, utasikia wanataka kuangalia kama wewe ni mwanzo wa JPG mpya au la. Na jibu la swali hilo mapenzi kuathiri usimamizi file yako - ambayo files kufungua, ambayo ndio je, karibu. Basi, wewe tayari kupatikana JPG? Gani wamekuwa kutunza wimbo wa hiyo? Basi, kulingana na kwamba, itabidi ama kuandika katika JPG sasa kwamba kuwa wazi, au si kuandika wakati wote, kwa sababu una hakuonekana JPG bado. Hatimaye, mara moja Umefikia mwisho wa file, utasikia wanataka karibu yoyote files kwamba una wazi iliyobaki. Tunataka kuwa na tidy hapa. Na kwa kuwa, umefanya zinalipwa yote ya files kukosa na kwamba kumbukumbu kadi, ambayo ni feat pretty ajabu. Hivyo pat mwenyewe juu ya nyuma. Lakini, kuna moja zaidi hiki kwa Pset, ambayo ni kugombea. Utakuta kwamba wote wa picha kwamba umefanya zinalipwa ni kweli picha za wafanyakazi CS50 ya. Hivyo kama wewe ni juu ya chuo au mahali fulani karibu, basi unaweza kuchukua picha na wafanyakazi, na sehemu ambayo ina picha zaidi kwa wafanyakazi kutoka mafaili yao zinalipwa mapenzi kupata tuzo ya kutisha. Pamoja na kwamba, basi kumaliza kuokoa pset. Jina langu ni Zamyla, na hii ni CS50.