[Powered by Google Translate] [Walkthrough - Problema rinkinys 4]
[Zamyla Chan - Harvardo universiteto]
[Tai CS50. - CS50.TV]
Gerai. Sveiki, visi, ir sveiki atvykę Walkthrough 4.
>> Šiandien mūsų pset yra Forensic.
Teismai yra tikrai įdomus pset, susijęs su bitmap failus
atrasti, kas padarė nusikaltimą.
Tada mes ketiname dydį keletą bitmap failus,
tada mes taip pat ketiname spręsti tikrai įdomus dalis, vadinama Atkurti,
, kurį mes iš esmės įteikė atminties kortelę
, kurioje kas nors netyčia ištrynėte visus savo failus,
ir mes susigrąžinti tuos failus.
>> Bet pirmiausia, prieš mes į pset, aš tikrai tik noriu pasveikinti visus.
Mes apie šio kurso Mediana.
Viktorina 0 yra už mus, ir mes ne pset4, taip iš esmės, mes pusiaukelėje.
Mes nuėjome ilgą kelią, jei pažvelgti atgal į savo ir psets, pset0 ir pset1
taip pasveikinti save, apie tai,
ir mes ketiname patekti į kai tikrai fun stuff.
>> Taigi, vėlgi, mūsų Įrankiai šio pset vietoj veikia sudo yum-y atnaujinimą,
mes galime tiesiog paleisti update50 jei esate versija 17,3 ir virš prietaiso.
Taigi būkite tikri, paleisti update50 - tai daug lengviau, keletas mažiau ženklai -
įsitikinkite, kad esate ne naujausia versija prietaiso.
Ypač tai svarbu update50, kai mes pradėjome naudojant CS50 Atvykimas.
Todėl įsitikinkite, įsitikinkite, kad jums padaryti, kad.
>> Visiems už Šios pset skyrių,
mes ketiname būti susijusios su failų įėjimų ir išėjimų, failą I / O.
Mes ketiname būti vyksta per daug programų, kurios susiduria su matricomis
nukreipta į failų ir panašių dalykų,
todėl mes norime įsitikinti, kad mes tikrai susipažinę ir jaukus
kaip įvesties ir išvesties į failus.
>> Šio pset platinimo kodą rinkmena, pavadinta copy.c,
ir tai, ką mes ketiname rasti bus tikrai naudinga mums
nes mes ketiname baigti iš tikrųjų kopijuoti copy.c failą
ir tik keičiant jį šiek tiek, kad būtų galima, siekiant įgyvendinti pirmuosius 2 dalis problemos rinkinys.
>> Ir taip, tada kaip jau minėjau anksčiau, mes susiduriame su rastrai, taip pat JPEG.
Taigi tikrai suprasti, kaip šie failai bus organizuojami struktūrą,
kaip mes tikrai galime versti 0s ir 1s į structs
ir dalykų, kad mes galime iš tikrųjų suprasti ir interpretuoti ir redaguoti,
, kad bus tikrai svarbu,
taip vyksta į JPEG ir bitmap failus ir suprasti tuos, struktūrą.
>> Pset4, kaip įprasta, prasideda su klausimų skyriuje.
Tas bus spręsti failą I / O ir esate pripratę, kad.
Tada: 1 dalis Detektīvromāns, kuriame jums suteikta Bitmap failą
kad atrodo mielas panašių raudonais taškais visur.
Ir tada iš esmės tai, ką mes ketiname daryti, tai šį failą ir tiesiog redaguoti jį šiek tiek
į versiją, kad mes galime perskaityti.
Iš esmės, kai baigsime darbus, mes turime tą patį failą,
išskyrus galėsime matyti paslėptą pranešimą paslėptas visų tų raudonų taškų.
Tada Resize yra programa, kad, atsižvelgiant į failą
ir tada failo, kad ji išveda pavadinimą ir numerį, taip pat,
bus iš tikrųjų dydį, kad bitmap tos skaitinę vertę.
Tada galiausiai, turime atsigavimo pset.
Mes atminties kortelę ir tada turi susigrąžinti visas nuotraukas
, kurie buvo atsitiktinai ištrinti,
, tačiau, kaip mes sužinoti, o ne iš tikrųjų panaikinamas ir išimti iš bylos;
Mes tiesiog rūšies dingsta, jei jie į bylą, bet mes ketiname susigrąžinti.
>> Didysis. Taigi vyksta į failą I / O konkrečiau, tai yra visą sąrašą funkcijų, kad jūs naudojate.
Jūs jau matė šiek tiek ir fopen pagrindus, fread ir fwrite,
bet mes ketiname pažvelgti toliau į tam tikrą failą I / O funkcijas, tokias kaip fputc
, kuriame jūs tiesiog parašyti vieną simbolį vienu metu,
fseek, kur tipo failo padėties rodiklis judėti į priekį ir atgal,
ir tada kai kurie kiti. Bet mes einame į tą šiek tiek vėliau metu pset.
>> Taigi, pirma, tik gauti į failą I / O prieš mums eiti į pset
atidaryti failą, pavyzdžiui, tai, ką jūs turite padaryti, yra iš tikrųjų nustatyti žymeklį į šio failo.
Taigi, mes turime failą * žymeklį.
Šiuo atveju, aš vadiname tai Nuolatinis rodyklė, nes tai bus mano failas.
Ir todėl aš ruošiuosi naudoti funkcija fopen ir tada failo pavadinimą
ir tada režimas, kai aš ruošiuosi būti susijusios su tuo failu.
Todėl nėra "r", šiuo atveju skaityti, rašyti "w", o tada "" papildymo.
Pavyzdžiui, kai jūs susiduriame su INFILE
ir visi jūs norite daryti yra skaityti yra saugomi bitai ir baitai,
tada jūs tikriausiai norite naudoti kaip savo režimu "R".
, Kai norite, kad iš tikrųjų rašyti, tipo naują failą,
tada tai, ką mes ketiname daryti, mes ketiname atidaryti naują failą
ir naudoti "W" režimą raštu.
>> Taip, tada, kai jūs iš tikrųjų skaityti į failų struktūra yra tokia.
Pirmiausia jums yra rodyklę į struct, kurioje bus baitus, kad jūs skaitote.
Taip, kad bus bytes pabaigos vieta, kad jūs skaitote.
Tada galite nurodyti dydį, pavyzdžiui, iš esmės kiek baitų
Jūsų programa turi skaityti failo dydis iš esmės yra vienas iš elementų,
ir tada jūs ketinate nurodyti, kiek elementų norite skaityti.
Ir galiausiai, jūs turite žinoti, kai jūs skaitote,
kad bus jūsų į žymeklis.
Aš spalvomis šių, nes fread taip pat labai panašus į fwrite,
išskyrus tuos atvejus, jūs norite įsitikinti, kad jūs naudojate tinkamą tvarką,
įsitikinkite, kad jūs iš tikrųjų raštu arba skaityti iš dešinės failą.
>> Taip, tada, kaip ir anksčiau, jei mes turime elemento dydžio, taip pat elementų skaičius,
tada mes galime pažaisti čia šiek tiek.
Pasakyti, kad aš turėti šunį struct ir taip, tada noriu skaityti du šunis vienu metu.
Ką aš galėčiau padaryti, tai pasakyti vieno elemento dydis bus vienas šuo dydis
ir aš iš tiesų perskaityti du iš jų.
Kita vertus, ką aš galėčiau padaryti, tai pasakyti aš tik ketina skaityti vieną elementą
ir kad vienas elementas bus du šunis dydį.
Taigi, kad analogiškas, kaip jūs galite rūšies žaisti aplink su dydis ir skaičius
priklausomai nuo to, kas Jums labiau intuityvus.
>> Gerai. Taigi dabar mes turime rašyti failus.
, Kai norite įrašyti failą, pirmasis argumentas yra iš tikrųjų, kai jūs skaitote.
Taip, kad iš esmės duomenų, kad jūs ketinate rašyti į failą,
kuris yra iš rodyklė pabaigoje.
Taigi, kai jūs susiduriame su pset, įsitikinkite, kad jums nereikia susipainioti.
Gal turi apibrėžimai vienas šalia kito.
Galite traukti apibrėžimus vadove įvesdami vyro ir tada fwrite, pavyzdžiui,
terminale arba galite grąžinti šios skaidrės
ir įsitikinkite, kad jūs naudojate tinkamą vieną.
Taigi dar kartą, fwrite, kai jūs turite failą, kad norite rašyti į
, kad bus paskutinis argumentas ir tai bus rodyklė į šį failą.
Taip, tada tai, kaip mes elgiamės su raštu galbūt keletą baitų vienu metu,
bet pasakyti, kad norite tiesiog parašyti tik vieną požymį.
Kaip matysime vėliau, šiame pavyzdyje, rastrai turėsite naudoti, kad.
Tai yra, kai mes galime naudoti fputc, iš esmės tik išleisti vieną simbolį vienu metu, chr,
į failą žymeklį, ir tai yra mūsų iš rodyklė.
Taip, tada, kai mes siekiame arba rašyti į failą,
failas yra sekti, kur mes esame.
Todėl Cursor, byla Padėties indikatorius rūšiuoti.
Ir todėl, kai mes rašome arba skaityti vėl į failą,
byla iš tikrųjų prisimena, kur ji yra,
ir todėl ji ir toliau iš kur yra žymeklis.
Tai gali būti naudinga, kai norite, tarkim, skaityti tam tikrą sumą kažką daryti
ir tada skaityti toliau nurodytą sumą,
bet kartais mes norime grįžti arba faktiškai pradėti nuo tam tikros pamatinės vertės.
Taip, tada fseek funkcija, ką ji daro, leidžia perkelti žymeklį į tam tikrą failą
tikras baitų skaičius.
Ir tada tai, ką mes turime padaryti, tai nurodyti, kur už pamatinę vertę.
Taigi, arba jis juda į priekį arba atgal, iš kur šiuo metu yra žymeklis,
ar mes galime nurodyti, kad jis turėtų tiesiog pereiti nuo bylos pradžios
arba iš failo pabaigoje.
Ir todėl jūs galite važiuoti, neigiamas ar teigiamas vertybes suma,
ir kad bus tipo perkelkite žymeklį arba pirmyn arba atgal.
>> Prieš mes į kitas psets klausimų apie failą I / O?
Gerai. Kaip mes patekti į daugiau pavyzdžių, nedvejodami sustabdyti manęs už klausimus.
>> Taigi Detektīvromāns, jūs įteikė Bitmap failą, panašų į šios raudonos vieną skaidrę,
ir atrodo, kad tai - raudonais taškais krūva - ir jūs tikrai nežino, kas parašyta.
Jei jūs prisimerkti, jums gali būti galėtų pamatyti šiek tiek melsvą spalvą viduje viduryje.
Iš esmės, tai kur tekstas saugomas.
Ten buvo žmogžudystė, kad atsitiko, ir mes turime išsiaiškinti, kas tai padarė.
Norėdami tai padaryti, mes turime natūra konvertuoti šį vaizdą į suprantamu formatu.
Jei jus vaikinai tai kada nors susidūrė, kartais ten bus mažai rinkiniai
kur jums reikės su raudona plėvele padidinamąjį stiklą. Kas nors? Taip.
Taigi, jums bus ranka kažką panašaus į tai, jums reikės per didinamąjį stiklą
su raudona filmas per jį, jums bus įdėti ją ant nuotraukos,
ir jums bus galėtų pamatyti pranešimas paslėptas jame.
Mes neturime didinamąjį stiklą su raudona, plėvele, todėl vietoj mes ketiname rūšies sukurti mūsų pačių
į šį pset.
Todėl vartotojas įvesties Detektīvromāns, tada clue. Bmp
kad failas, tai "red dot pranešimą
ir tada jie sako verdict.bmp bus mūsų outfile.
Taigi jis ketina sukurti naują Bitmap Image panašus nei į clue
išskyrus suprantamu formatu, kur mes galime matyti paslėptą pranešimą.
>> Kadangi mes ketiname būti susijusios su kai rūšiuoti, redaguoti ir manipuliuoti rastrai,
mes ketiname rūšies pasinerti į šių rastrinių failų struktūrą.
Mes nuėjome per jų šiek tiek į paskaitą, tačiau pažvelkime į juos šiek tiek daugiau.
Rastrai yra iš esmės tik baitų išdėstymas
kur mes nurodėte baitai tai ką.
Taigi čia yra rūšies kaip Bitmap Image žemėlapyje
sakydamas, kad jis prasideda kai kurių antraštės failai, prasideda nors ten pateikta informacija.
Jūs matote, kad apie baitų skaičius 14 dydis nurodyta Bitmap Image,
ir ji toliau.
Bet tada tai, ką mes tikrai domina, čia pradeda aplink baitų skaičius 54.
Mes turime šiuos RGB, trigubėja.
Ką ketina daryti yra faktinius pikselių, spalvų reikšmes.
Viskas, kas išdėstyta, į antraštę yra šiek tiek informacijos
atitinkantis dydžio vaizdą, įvaizdžio plotis, ir aukštis.
Kai mes einame į kamšalu vėliau, mes suprasti, kodėl iš paveikslėlio dydis
gali būti kitoks, nei plotis arba aukštis.
Taip, tada atstovauti jų - šios bitmap atvaizdus baitų sekos -
ką mes galime padaryti, tai pasakyti gerai, aš prisiminti, kad indeksuoti 14
tai, kur dydis yra, pavyzdžiui, bet vietoj to, ką mes ketiname daryti, kad tai lengviau
yra įdėti į kapsulę į struct.
Ir taip mes turime du mums, BITMAPFILEHEADER structs
ir BITMAPINFOHEADER
ir todėl, kai mes skaitome į šį failą, pagal nutylėjimą ji vyksta, vyksta tam, kad,
ir todėl, kad ji taip pat ketina užpildyti į kintamųjų, tokių kaip biWidth ir biSize.
Ir galiausiai, kiekvienas pikselis yra atstovaujama trijų baitų.
Pirmasis yra mėlynos pikselių kiekis, antra, žalia suma,
ir, pagaliau, raudona, kur 0 yra iš esmės ne mėlyna žalia arba ne suma ar ne raudona
ir tada ff yra didžiausias.
Tai yra Šešioliktainis reikšmės.
Taip, tada, jei mes turime FF0000, tada, kad atitinka sumą iki maksimalaus dydžio mėlyna
ir tada ne žalia, o ne raudona, taip, tada, kad duotų mums mėlyna pikselių.
Tada, jei mes turime FF nuo visų visur, tai reiškia, kad mes turime balta pikselių.
Tai rūšies priešais paprastai, kai mes sakome RGB. Tai iš tikrųjų vyksta BGR.
>> Taigi, jei mes iš tikrųjų atrodo į rastrinio atvaizdo pavyzdys - leiskite man ištraukti vieną čia.
Tai yra šiek tiek mažas.
Aš priartinimo, ir mes galime pamatyti, tai pixelated. Atrodo, kad spalvos blokus.
Turite baltos spalvos blokus ir tada raudona blokai.
Jei tu žaidi "Microsoft Paint", pavyzdžiui, jums gali padaryti kažką panašaus, kad
pagal iš esmės tik tapyba tam tikrais kvadratais, tam tikra tvarka.
Taip, tada, ką tai verčia į bitmapy yra taip.
Čia mes turime pirmą baltą pikselių, kad visi 6 yra f, ir tada mes turime raudonos pikselių,
nurodyta 0000FF.
Ir taip baitų seka, kad mes turime, rodo, kaip rastrinis vaizdas ketina ieškoti.
Taigi, ką aš padariau čia yra tiesiog rašyti visus tuos baitus ir tada dažyti raudona
, kad jūs galite rūšies pamatyti, jei jūs prisimerkti šiek tiek, kaip, kad tipo rodo šypsenėlę.
>> Taip, kad bitmap atvaizdus darbas yra tai, aš įsivaizduoti jį iš esmės kaip tinklelis.
Ir taip pagal nutylėjimą, kiekvienas tinklelio eilutėje turi būti kartotinis 4 baitų.
Jei pažvelgsime į Bitmap Image, jūs užpildyti kiekvieną vertės.
Pavyzdžiui, galite turėti raudoną, žalia, mėlyna,
, bet jūs turite įsitikinti, kad vaizdas yra užpildytas su keturių baitų kartotinio.
Taigi, jei aš noriu, kad mano vaizdą, kuris bus trys blokai pločio, tada aš būtų įdėti tuščią vertę
naujausia, kad ji iš keturių kartotinis.
Taigi, aš norėčiau pridurti kažkas, kurį mes skambinate išklojimui.
Aš tik ketina, rodo, kad su x.
Dabar sako, kad mes norime, pavyzdžiui, vaizdą, kuris yra 7 pix.
Mes turime 1, 2, 3, 4, 5, 6, 7,
ir visa tai yra užpildyti su spalva.
Būdas, kad bitmap atvaizdus dirbti, kad mums reikia 8..
Šiuo metu mes turime 1, 2, 3, 4, 5, 6, 7.
Mes turime 8 erdves Bitmap Image skaityti teisingai.
Taip, tada tai, ką mes turime padaryti, tai pridėti tik šiek tiek kamšalu
įsitikinkite, kad visi iš pločio yra vienodi
, kurių plotis yra 4 kartotinis.
Ir todėl aš jau minėta, prikimšti kaip x ar deformuoti linijos,
išklojimui, bet faktinių bitmap atvaizdus nurodyta šešioliktainis 0.
Taip, kad būtų vienas ženklas, 0.
Ką gali praversti xxd komanda.
Kas ji yra iš tikrųjų rodo jums, kaip panašus į ką aš turėjau iki smiley
kai aš iš tikrųjų atspausdinti, ką kiekviena spalva būtų pikselių
ir tada spalva koduojami jį,, kai paleisti xxd šių komandų,
tada tai tikrai bus atspausdinti, kokios spalvos yra tiems taškų.
Ką jūs turite padaryti, tai čia man rodo, kaip s 54
sako, kad aš ruošiuosi pradėti 54-ojo baitas
nes prieš tai prisiminti, jei mes žiūrime atgal iš rastrai žemėlapį,
, kad viskas antraštės informaciją ir ko panašaus, kad.
Bet tai, ką mes tikrai rūpi, yra tikrasis taškų, kurie rodo, spalvą.
Taigi, pridedant, kad laivo vėliavos, o-s 54, tada mes galime pamatyti spalvų reikšmes.
Ir nesijaudinkite apie sudėtingus vėliavų ir panašių dalykų.
Problemą, spec, jūs turite nurodymus, kaip naudoti xxd rodyti pikselius.
Taigi, jei matote čia, kad tipo atrodo kaip "žaliosios dėžės", tai mažas dalykas.
Aš spalvomis 00ff00, kaip iš esmės sakydamas, Mėlyna, daug žalios spalvos, o ne raudona.
Taip, kad atitinka spalvą į žalią.
Kaip matote čia, mes matome žalią stačiakampį.
Šis žalias stačiakampis yra tik 3 pikselių pločio, taip, tada tai, ką mes turime padaryti,
įsitikinti, kad vaizdas yra 4 pločio kartotinio yra pridėti papildomą kamšalu.
Ir taip, tada tai, kaip jūs žiūrėti šiuos 0s čia.
Tai tikrai bus rezultatą savo RESIZE pset,
iš esmės atsižvelgiant į mažą bitmap ir padidinti jį iki 4.
Ir taip, ką mes matome, kad iš tikrųjų šis vaizdas yra 12 pikselių pločio, bet 12 yra 4 kartotinis,
ir taip mes iš tikrųjų nematau bet pabaigoje 0s, nes mums nereikia pridėti bet
, nes jis visiškai kamšalu. Ji neturi, bet daugiau vietos.
>> Gerai. Bet kokie klausimai apie kamšalu?
Gerai. Cool.
>> Kaip jau minėjau anksčiau, rastrai yra tiesiog baitų seka.
Ir todėl tai, ką mes turime, yra, vietoj to, reikia sekti, kurie tiksliai baitų skaičius
atitinka konkretaus elemento, mes iš tikrųjų sukūrė struct pareiškiate, kad.
Taigi, ką mes turime, yra Struct RGBTRIPLE.
Kai jūs turite RGB trejetui atvejis,
, nes tai yra tipas apibrėžti struct, tada jūs galite prieiti prie rgbtBlue kintamąjį,
panašiai žalia ir raudona kintamieji, kurie bus nurodyti, kiek mėlyna, žalia, raudona,
atitinkamai, jūs turite.
>> Taigi, jei mes turime mėlyną kintamasis, 0, žalia rinkinys ff
kuri yra didžiausia vertė, jūs galite turėti, tada raudona kintamasis nustatomas į 0,
tada kokia spalva būtų ši RGB trigubas? >> [Studentas] Žalioji.
Žalia. Tiksliai.
Tai bus naudinga žinoti, kad, kai jūs turite RGB trejetui atvejis,
jūs iš tikrųjų galite naudoti spalvos kiekį - mėlyna, žalia, raudona - atskirai.
>> Dabar, kad mes kalbėjome apie tos struktūros, tegul BMP failą išvaizdą.
Tai yra structs padaryti už jus.
Čia mes turime BITMAPFILEHEADER struct.
Interesų dydis.
Vėliau, mes turime info antraštę, kuri turi keletą dalykų, kurie yra įdomus mums,
būtent dydis, plotis ir aukštis.
Kaip mes eiti į vėliau, kai jūs skaitote su byla,
ji automatiškai nuskaito, nes mes nustatyti tvarką, yra tas pats.
Taigi biSize turėti teisę baitų, atitinkančius faktinio dydžio įvaizdžio.
Ir tada čia, galiausiai, kaip mes kalbėjome apie, turime Typedef struct RGBTRIPLE.
Mes turime žinutę rgbtBlue, žalia, ir RED su juo susijusios.
>> Didysis. Gerai.
Dabar, kai mes suprantame Rastrai šiek tiek suprasti, kad mes turime failo antraštę
ir informacija antraštės, susijusios su juo ir tada po to, mes turime įdomių dalykų
spalvų, ir šios spalvos atstovauja RGBTRIPLE structs
ir tie, savo ruožtu, turi tris susijusias vertybes mėlyna, žalia ir raudona.
>> Taigi, dabar, mes galime rūšies galvoti apie Atkurti šiek tiek.
Atsiprašau. Pagalvokite apie Detektīvromāns.
Kai mes turime clue failą, tada tai, ką mes norime padaryti, tai perskaityti jai taškus vieną po kito
ir tada kažkaip pakeisti tuos pikselius, kad galėtume išvesti jį į skaitymo forma.
Ir taip išvesti, mes ketiname rašyti pikselis pixel į verdict.bmp failą.
Tai tipo daug ką nuveikti. Mes suprantame, kad.
Taigi, ką mes padarėme, mes iš tikrųjų jei jums copy.c.
Copy.c ar yra tik tam tikros rastrinio formato failą tikslią kopiją ir tada rezultatai jį.
Taigi tai jau atidaro failą už jus, nuskaito taškus vieną po kito,
ir tada rašo į išvesties failą.
>> Paimkime Tuo išvaizdą.
Tai užtikrinti tinkamą naudojimą,
gauti varduose čia.
Kas tai yra, jis nustato įvesties failas turi būti, ką mes priimtas INFILE čia,
kuris yra antrasis mūsų komandų eilutės argumentas.
Tikrina, įsitikinkite, kad galėtume atidaryti failą.
Tikrina, įsitikinkite, kad mes galime padaryti naują outfile čia.
Tada, Kas tai čia, tai tik iš esmės pradeda skaityti rastrinio formato failą iš pat pradžių.
Pradžia, kaip žinome, yra BITMAPFILEHEADER
ir todėl tie bitų sekos bus tiesiogiai užpildyti į BITMAPFILEHEADER.
Taigi, ką mes turime čia sako, kad BITMAPFILEHEADER bf -
tai mūsų naują kintamąjį tipo BITMAPFILEHEADER
mes ketiname įdėti viduje bf, ką mes skaitome iš rodyklė, kuri yra mūsų failas.
Kiek mes skaityti?
Mes skaitome,,, kiek baitų turime būti visą BITMAPFILEHEADER.
Be to, tai, ką mes darome info antraštėje.
Taigi, mes tęsiame palei mūsų bylą į INFILE
ir mes skaitant šias bitai ir baitai, ir mes prijunkite juos tiesiogiai
į šių kintamųjų atvejais, kad mes darome.
Čia mes tiesiog įsitikinkite, kad rastras yra bitmap.
>> Dabar mes turime outfile, tiesa?
Taigi, kokia ji yra, kai mes ją sukuriame, tai iš esmės tuščia.
Taigi, mes turime iš esmės sukurti naują bitmap nuo nulio.
Ką mes darome, mes turime įsitikinti, kad mes nukopijuoti failo antraštėje
ir informacija antraštė tiesiog kaip INFILE.
Ką mes darome, mes rašome - ir prisiminti, kad bf yra kintamasis
iš tipui BITMAPFILEHEADER, kad tai, ką mes darome, yra, mes tiesiog naudoti tą turinį
rašyti į outfile.
Čia prisiminti, mes kalbėjome apie išklojimui,
kaip tai svarbu įsitikinti, kad taškų, kad mes turime suma yra 4 kartotinis.
Tai yra labai naudinga formulė apskaičiuoti, kiek prikimšti turite
atsižvelgiant į savo failo plotis.
Noriu jus vaikinai prisiminti, kad copy.c turime apskaičiavimo padding formulę.
Gerai? Taigi visi prisiminti. Didysis.
Taip, tada ką copy.c šalia yra, tai kartojasi per visus iš Scandlines.
Jis eina per eilutes, ir tada saugo kiekvieną triviečiai, kad jis skaito
ir tada rašo į outfile.
Taip, tada čia mes skaitote vienu metu tik vieną RGB TRIPLE
ir tada pradėti Tą pačią Triple į outfile.
Keblus dalis yra tai, kad padding nėra RGB trigubas,
ir todėl mes galime ne tik skaityti, kad padding suma RGB triviečiai.
Tai, ką mes turime padaryti, tai iš tikrųjų tik judėti mūsų failo padėties indikatorių, perkelti mūsų žymeklį,
rūšies praleisti visą kamšalu, todėl, kad mes į kitą eilutę.
Ir tada Kas tai yra kopija parodys jums, kaip jūs galbūt norėsite pridėti išplėtimo.
Taigi, mes apskaičiavome, kiek prikimšti mums reikia,
taigi tai reiškia, kad mums reikia išklojimui skaičių 0s.
Kas tai yra už linijos kelia išklojimui skaičių 0s į mūsų outfile.
Ir galiausiai, jūs uždaryti abu failus. Jūs uždarote infile taip pat outfile.
>> Štai kaip copy.c darbai,
ir tai bus labai naudinga.
, O ne tik faktiškai tiesiogiai kopijuoti ir įklijuoti ją
arba tiesiog žiūri į jį ir rašyti viską, ko norite,
galbūt tiesiog norite atlikti šią komandą terminale,
bp copy.c whodunit.c, kuri sukurs naują failą, whodunit.c
tai yra tą patį turinį kaip kopija.
Taip, tada tai, ką mes galime padaryti, tai naudoti, kad kaip pagrindas, ant kurio sukurti ir redaguoti
mūsų Detektīvromāns failą.
>> Tai yra į DOS Detektīvromāns, bet ką copy.c
yra iš tikrųjų rūpinasi daugelis iš jų mums.
Taigi, viskas, ką reikia daryti toliau, yra pakeisti, kiek reikia taškų
faktiškai padaryti failas įskaitomas.
Atminkite, kad už tam tikrą pikselių trigubo, todėl tam tikro kintamojo tipo RGBTRIPLE
galite naudotis mėlyna, žalia ir raudona vertybes.
Kad ketina praversti, nes, jei jūs galite gauti prieigą prie jų,
tai reiškia, kad jūs taip pat galite patikrinti juos,
, o tai reiškia, kad jūs taip pat juos keisti.
>> Taigi, kai mes grįžo į mūsų raudona didinamojo stiklo, pavyzdžiui,
iš esmės, tai veikė kaip filtro rūšiuoti mums.
Taigi, ką mes norime padaryti, tai norime filtruoti visus iš triviečiai, kurie ateina.
Yra keletas skirtingų būdų, kaip tai padaryti.
Iš esmės, jūs galite turėti, bet kokios rūšies filtras norite.
Gal norite keisti visus raudonos pikselių
o gal jūs norite pakeisti įvairių spalvų pikselių kita spalva.
Tai priklauso nuo jūsų.
Nepamirškite, kad jūs galite patikrinti, kokia spalva pikselių yra
ir tada jūs galite taip pat pakeisti, kaip jūs ketinate per.
>> Gerai. Taigi, kad Detektīvromāns.
Kai paleidžiate Detektīvromāns, jūs žinosite, kuris nusikaltimo kaltininkas buvo.
>> Dabar mes ketiname eiti į Resize.
Mes ketiname būti susijusios su rastrai.
Ką mes ketiname padaryti, tai mes ketiname turėti įvesties bitmap
ir tada mes ketiname perduoti numerį ir tada gauti outfile bitmap
jei tai iš esmės mūsų INFILE mastelis n.
Pasakykite, mano byla buvo tik vieną tašką, didelis.
Tada, jei mano n buvo 3, pleiskanojimas 3, tada aš norėčiau pakartoti, kad Pixel N skaičių kartų,
taigi 3 kartus, ir tada taip pat masto jį 3 kartus, taip pat.
Taigi, kaip matote, aš mastelio ją vertikaliai, taip pat horizontaliai.
>> Ir tada čia pavyzdys.
Jei turite n = 2, pamatysite, kad pirmoji mėlyna pikselių yra pakartota du kartus
horizontaliai, taip pat kaip du kartus vertikaliai.
Ir tada, kad ir toliau, ir todėl jūs turite tiesioginį savo originalaus atvaizdo du mastelio.
>> Taip, tada, jei mes išsamiai pseudocode už tai, kad mes norime atidaryti failą.
Ir tada žinoti, kad jei mes grįžti čia,
matome, kad už outfile plotis bus kitoks nei už infile pločio.
Ką tai reiškia?
Tai reiškia, kad mūsų antraštės informacija ketina keisti.
Ir todėl tai, ką mes norime padaryti, tai atnaujinti antraštės informaciją,
žinant, kad, kai mes skaityti failus, jei jūs veikia ant copy.c sistemą,
mes jau turime kintamąjį, rodo, kokio dydžio yra ir dalykų, pavyzdžiui, kad.
Taigi, kai jūs turite, kad tai, ką jūs galbūt norėsite padaryti, tai pakeisti šiuos konkrečius kintamuosius.
Atminkite, kad jei turite struct, kaip jūs pasiekiate, kad per kintamuosius.
Galite naudoti dot operatorius, tiesa?
Taip, tada naudoti, kad jūs žinote, kad jums reikia pakeisti antraštės informaciją.
Taigi čia yra tik sąrašas faktinių elementų, kurie vyksta, keičiasi jūsų faile.
Failo dydis vyksta, keičiasi, įvaizdį, taip pat plotis ir aukštis.
Taip, tada grįžta iš rastrai žemėlapyje
pažvelgti, ar tai failo pavadinime ar info antraštė, kuri yra ta informacija
ir tada pakeisti, kiek reikia.
Vėlgi, pasakyti cp copy.c resize.c.
Tai reiškia, kad resize.c dabar yra viską, kas, esantys viduje kopiją
nes kopija suteikia mums kelią skaitymo kiekvienam Scanline pikselių pikselių.
Išskyrus tuos atvejus, dabar, o ne tiesiog pakeisti vertybes, kaip mes padarėme Detektīvromāns
tai, ką mes norime padaryti, tai mes norime parašyti daugelyje taškų
tol, kol mūsų n yra didesnis nei 1.
>> Tada tai, ką mes norime padaryti, norime ištiesti jį horizontaliai n,
taip pat ištempti jį vertikaliai n.
Kaip galėtume tai padaryti?
Pasakykite jūsų n yra 2, ir jūs turite turint mintyje tai, infile.
Žymeklis ketina pradėti nuo pirmojo,
ir ką jūs norite daryti, jei n yra 2, norite spausdinti 2 iš jų.
, Todėl jūs spausdinate 2 iš jų.
Tada žymeklis ketina perkelti į kitą pikselių, kuri yra raudona,
ir jis ketina spausdinti 2 tų raudonųjų, pridedant jį į ką ji padaryta prieš.
Tada žymeklis bus perkelti į kitą pikselių ir pritraukti 2 iš jų.
Jei pažvelgti atgal į copy.c sistemą, Kas tai, čia
jis sukuria naują instancija RGB trejetui, naujas kintamasis vadinamas trigubas.
Ir čia, kai rašoma į jį, jis skaito iš 1 INFILE RGBTRIPLE
ir išsaugo ją viduje šio trigubo kintamąjį.
Taip, tada jūs iš tikrųjų turi kintamąjį atitinka tą tikrą pikselių.
Tada, kai rašote, ką jūs galbūt norėsite padaryti, gaubiančių fwrite ataskaitoje į kilpą
, kuris rašo jį į savo outfile tiek kartų, kiek reikia.
Tai gana paprasta.
Tiesiog iš esmės pakartoti rašymo procesą N skaičių, kiek kartų jį horizontaliai masto.
>> Bet tada mes turime prisiminti, kad ketina pakeisti mūsų užpildas.
Anksčiau, sako, mes turėjome kažką 3 ilgio.
Tada mes tiesiog pridėti kiek prikimšti? Tik dar vienas, kad ji iš 4.
Bet pasakyti, kad mes mastelio šį konkretų vaizdą n = 2.
Taip, tada, kiek mes turime mėlynos pix pabaigoje? Mes norėtume turėti 6.
1, 2, 3, 4, 5, 6. Gerai.
6 yra 4 kartotinis. Koks artimiausias 4 kartotinis? Tai bus 8.
Taigi, mes iš tikrųjų vyksta ten, kad 2 simbolių kamšalu.
>> Ar kas nors prisiminti, jei mes turime formulę apskaičiuoti išklojimui
ir kur tai galėtų būti?
[Nesigirdi studentas atsakas] >> Taip, copy.c. Į dešinę.
Yra formulė copy.c apskaičiuoti, kiek prikimšti turite
skiriamas ypatingas plotis Bitmap Image.
Taip, tada, kad manimi vyksta, kad būtų naudinga, kai reikia pridėti tam tikrą išklojimui
iš tikrųjų išsiaiškinti, kiek prikimšti jums reikia pridėti.
Bet viena nata, nors, yra tai, kad jūs norite įsitikinti,, kad jūs naudojate tinkamą dydį.
Tiesiog būkite atsargūs, nes jūs iš esmės būti susijusios su dviem bitmap atvaizdus.
Jūs norite įsitikinti, įsitikinkite, kad jūs naudojate tinkamą vieną.
Kai jūs apskaičiuojant už outfile išplėtimo, kurį norite naudoti, kad outfile plotis
o ne praėjusių pločio.
>> Didysis. , Kad tipo rūpinasi tempimo visa Bitmap Image horizontaliai.
Bet tai, ką mes norime padaryti, tai faktiškai ištempti jį vertikaliai, kaip gerai.
Tai bus šiek tiek sudėtingiau, nes, kai mes baigsite kopijuoti eilutę
ir raštu, kad eilutę, žymeklis bus pabaigoje.
Taigi, jei mes skaityti dar kartą, tada jis tiesiog ketina skaityti į kitą eilutę.
Taigi, ką mes norime padaryti, yra natūra radote kopijuoti šias eilutes vėl kelią
arba tiesiog rūšies šią eilutę ir tada perrašyti jį vėl.
Kaip I rūšies užsiminė, yra keletas skirtingų būdų, kaip tai padaryti.
, Ką galite padaryti, tai, kaip jūs ketinate per ir skaityti per konkrečią Scanline
ir jį pakeisti, kiek reikia, tada tipo parduotuvėje visų šių taškų masyvo.
Tada vėliau jums žinoti, kad jums reikia atspausdinti, kad vėl masyvo,
ir todėl jūs galite tiesiog naudoti masyvo, tai padaryti.
Kitas būdas tai padaryti yra, jums gali nukopijuokite vieną eilutę,
suprasti, kad jums reikia kopijuoti, kad vėl, todėl perkelkite žymeklį,
ir tai bus naudojant metodą fseek.
Jūs galite perkelti žymeklį visą kelią atgal ir tada vėl pakartokite kopijavimo procesas.
>> Taigi, jei mūsų mastelio skaičius yra n, tai, kiek kartų tai mes turime grįžti
ir perrašyti linija? >> [Studentas] n - 1. >> Taip, puikus. n - 1.
Mes padarėme tai, kad kartą jau tada mes norite kartoti Grįžtant procesą
n - 1 kiekį kartų.
Gerai. Taigi, jūs turite savo dydžio keitimo funkcija.
>> Dabar mes galime gauti tikrai įdomus, mano mėgstamiausia pset, kuris yra atkurti.
Vietoj to, kad rastrai, šį kartą mes susiduriame su JPEG.
Mes iš tikrųjų ne tik JPEG failą,
mes iš esmės žalią atminties kortelės formatą.
Ir todėl tai yra šiek tiek info ir šiukšlių vertybių pradžioje,
ir tada ji prasideda ir kur ji turi JPEG failus krūva.
Tačiau mes įteikė kortelę, kur mes ištrinti nuotraukas;
iš esmės, mes pamiršti, kur nuotraukos yra įsikūręs pačioje kortelėje.
Taip, tada mūsų užduotis atkurti eiti per šios kortelės formatu
ir rasti tas nuotraukas dar kartą.
>> Laimei, JPEG failus ir Card File struktūra yra šiek tiek naudinga.
Jis tikrai galėjo būti šiek tiek sudėtingesnis, jei tai buvo ne šiuo konkrečiu formatu.
Kiekvienas JPEG failas faktiškai prasideda dviejų galimų sekų, išvardytų aukščiau.
Iš esmės, kai turite naują JPEG rinkmeną,
jis pradeda su sekos ffd8 ffe0 ar kitas, ffd8 ffe1.
Kitas naudingas dalykas, kurį reikia žinoti yra tai, kad JPEG saugomi Kaimynystėje.
Taigi, kai vienas JPEG failas baigiasi, kitas prasideda.
Taigi nėra jokių, tarp vertybių ten natūra.
Kai paspausite, jei jūs jau skaityti JPEG, JPEG pradžią
jūs žinote, kad jūs nukentėjo ankstesniojo ir kito pradžios pabaigos.
>> Rūšies pavaizduoti schema, aš padariau.
Dar apie JPEG dalykas yra tai, kad mes galime juos perskaityti 512 baitų sekas vienu metu,
taip pat ir su kortele pradžioje.
Mums nereikia, kad tikrinant kiekvieną vieną baitą, nes tai čiulpia.
Taigi vietoj to, ką mes galime padaryti, tai iš tikrųjų tik skaityti 512 baitų, tuo metu,
ir tada, o ne tikrinti tarp šių mažų mažai skiltelės,
mes galime tik patikrinti apie 512 baitų pradžią.
Iš esmės, tai, ką matote šioje nuotraukoje, yra kortelės pradžioje,
turite vertybes, kurios yra tikrai nėra susiję su pačių faktinių JPEG.
Bet tada ką aš turiu yra žvaigždė nurodyti vieną iš dviejų pradinių sekos JPEG.
Taigi, jei matote žvaigžde, jūs žinote, kad turite JPEG failą.
Kiekvienas JPEG formato rinkmena, ir tada bus kartotinis kai 512 baitų
tačiau nebūtinai tą patį kelis kartus.
Taip, kad jums žinoti, kad jūs pasiekėte kitą JPEG, jei paspausite kitą žvaigždę,
kitas baitų seka.
Tada tai, ką jūs čia, jūs turite raudoną JPEG failą tęsiama, kol paspausite žvaigždę,
kuri nurodoma nauja spalva.
Jūs tęsite ir tada paspausite kitą žvaigždę, paspausite kitą JPEG,
jūs ir toliau visą kelią iki pabaigos.
Esate paskutinę nuotrauką čia, rožinis.
Eiti iki galo, kol paspausite failų pobūdžio pabaigą.
Tai bus tikrai naudinga.
>> Keletas pagrindinių takeaways čia:
Kartoteka neprasideda su JPEG,
bet kai tik JPEG prasideda, visi iš JPEG saugomi vienas šalia kito, kad vienas su kitu.
>> Kai Atkurti Pseudocode.
Pirma, mes ketiname atidaryti mūsų kortelės failą,
ir tai bus naudojantis mūsų failą I / O funkcijas.
Mes ketiname pakartoti šį procesą tol, kol mes pasiekėme failo pabaigoje.
Mes ketiname skaityti 512 baitų vienu metu.
O ką aš sakiau čia mes ketiname laikyti jį buferis,
todėl iš esmės palaikykite ant tų 512 baitų, kol mes žinome, ką su jais daryti.
Tada tai, ką mes norime padaryti, mes norime patikrinti, ar mes nukentėjo žvaigždę, ar ne.
Jei mes nukentėjo žvaigždė, jei mes paspauskite vieną iš pradinių sekų,
tada mes žinome, kad mes pasiekė naują JPEG failą.
Ką mes norime padaryti, tai mes ketiname norite sukurti naują failą mūsų pset4 kataloge
tęsti šį failą.
Bet taip pat, jei mes jau padarė JPEG anksčiau,
tai mes norime baigti šį failą ir stumti jį į pset4 aplanką,
kur mes turime, kad failas saugomas, nes jei nenurodysite, kad mes jau pasibaigė, kad JPEG rinkmeną,
tada mes iš esmės neribotam sumą. JPEG niekada nesibaigs.
Taigi, mes norime įsitikinti, kad, kai mes skaityti į JPEG failą ir raštu, kad,
mes norime konkrečiai arti, kad tam, kad atidaryti kitą.
Norite patikrinti keletą dalykų.
Mes norime patikrinti, ar mes ne naujos JPEG pradžios mūsų buferio
ir taip pat, jei mes jau rado JPEG prieš
, nes tai bus šiek tiek pakeisti savo procesą.
Taip, tada, po to, kai jūs einate per visą kelią ir, kai paspausite į failo pabaigą,
tada tai, ką jūs norite padaryti, tai jūs norite uždaryti visus failus, kurie šiuo metu atidaryti.
Kad tikriausiai bus paskutinis JPEG failas, kad jūs turite,
taip pat kartotekoje, kad jūs buvote, susijusius su.
>> Paskutinė kliūtis, kad mes turime spręsti, tai, kaip iš tikrųjų padaryti JPEG rinkmeną
ir kaip iš tikrųjų stumti jį į aplanką.
Pset reikalauja, kad kiekvienas JPEG, kad jums rasti tokiu formatu,
kur jūs turite numerį. jpg.
Skaičius, net jei tai 0, mes jį vadiname 000.jpg.
Jei rasite JPEG jūsų programoje,
jūs ketinate norite jį pavadinti, kad ji rado.
Ką tai reiškia?
Turime rūšies sekti, kiek mes pastebėjome,
ir koks skaičius turėtų būti kiekvieno JPEG.
Čia mes ketiname pasinaudoti sprintf funkcija.
Panašus į printf, kurioje tiesiog rūšies spaudinių vertė į terminalą,
sprintf spausdina failą į aplanką.
Ir kas tai daryti, jei aš turėjo sprintf, pavadinimą, ir tada ten eilutė
spausdinti 2.jpg.
Darant prielaidą, kad aš uždarytas mano failus teisingai,
kad būtų tokia failą, kad aš buvo raštu.
Tačiau vienas dalykas yra, kad kodas, kad aš čia
ne visai patenkinti pset reikalavimus.
Pset reikalauja, kad antrasis JPEG failas turi būti pavadintas 002, o ne tik 2.
Taigi, kai jūs spausdinti pavadinimą, tada galbūt jūs galbūt norėsite šiek tiek pakeisti vietos rezervavimo ženklą.
>> Ar kas nors prisiminti, kaip mes leidžiame papildomų tarpų, kai mes ką nors atspausdinti?
Taip. >> [Studentas] Jūs įdedate 3 tarp procento ženklą ir 2. >> Taip, puikus.
Jūs įdėti 3 Šiuo atveju, nes norime vietos 3.
% 3D tikriausiai suteiks jums 002.jpg vietoj 2.
Į sprintf funkcija yra iš tikrųjų pirmasis argumentas char masyvas,
mes anksčiau žinojo kaip eilutės.
Tas bus, tipo daugiau kaip laikinojo saugojimo, tiesiog laikyti gautą eilutę.
Jums nebus tikrai būti susijusios su tuo, bet jums reikia jį įtraukti.
>> Žinant, kad kiekvienas failo pavadinimas turi skaičių, kuris trunka tris simbolius,
ir tada. jpg, kaip ilgai šis masyvas?
Metimas iš numerį. Kiek simbolių pavadinime, pavadinimo?
Taigi čia 3 hashtags, laikotarpis, jpg. >> [Studentas] 7. >> 7. Ne visai taip.
Mes ketiname norite 8, nes mes norime, taip pat, kad būtų galima null terminatorius.
>> Galiausiai, tiesiog atkreipti dėmesį į procesą, kad jums daryti už atgauti,
turite kokių nors pradžią informaciją.
Jūs ir toliau, kol rasite JPEG failas pradžią,
ir kad gali būti kurios nors vienos iš dviejų pradedant sekas.
Jūs ir toliau skaityti. Kiekvienas pasviras brūkšnys čia sudaro 512 baitų.
Jūs ir toliau skaityti, nuolat skaityti, kol jūs susitinkate kitą pradinę seką.
Kai jūs turite, kad jums baigti esamą JPEG - šiuo atveju, tai raudona,
todėl norite baigti.
Norite sprintf pavadinimu, į savo pset4 aplanką,
tada jūs norite atidaryti naują JPEG ir tada toliau skaityti
kol jūs susitinkate kitą.
Laikyti svarstymą, laikyti svarstymą,
ir galiausiai, galų gale, jūs ketinate pasiekti bylos pabaigoje,
ir todėl jūs norite uždaryti paskutinį JPEG, kad dirbote,
sprintf kad į savo pset4 aplanke, ir tada pažvelgti į visas nuotraukas, kad jūs Dotarłeś.
Šios nuotraukos yra iš tikrųjų nuotraukos CS50 darbuotojų,
ir todėl tai yra bonus įdomus iš pset dalis ateina
yra tai, kad jūs konkuruoja jūsų sekcijose rasti nuotraukas TFS
ir fotografuoti su jais, siekiant įrodyti, kad jūs padaryti, kad pset
ir todėl jūs galite pamatyti, kurie darbuotojai yra paveikslėliuose.
Taip, tada jūs fotografuoti su darbuotojais. Kartais turėsite persekioti juos žemyn.
Galbūt kai kurie iš jų bus bandyti pabėgti nuo jūsų.
Fotografuojate su jais.
Tai vyksta. Tai ne dėl kai pset.
Terminas bus paskelbta spec.
Tada kartu su savo skyriuje, priklausomai nuo to, skyriuje užima daugiausia nuotraukas
su daugeliu darbuotojų laimės gana awesome prizą.
Tai tipo paskata gauti jūsų pset4 baigtas kuo greičiau
nes tada jūs galite gauti iki verslo
visų skirtingų CS50 darbuotojų medžioklės žemyn.
Kad tai nėra privaloma, tačiau, todėl, kai jūs gaunate nuotraukas,
tada baigsite su pset4.
>> Ir aš baigė su 4 Walkthrough, todėl ačiū jums visiems, kad atvykote.
Sėkmės Teismai. [Plojimai]
[CS50.TV]