[MUSIC nagpe-play] ZAMYLA Chan: mabawi ng pagharap sa isang bagay Hayaan. Ibalik muli ay marahil ang aking mga paboritong PSET, at higit sa lahat dahil sa tingin ko ito talaga, talagang cool. Talaga, bibigyan ka ng memory file card kung saan mga larawan ang tinanggal. Ngunit kung ano ang iyong pagpunta sa gawin ay mabawi ang lahat ng ito. OK. Kaya ito ay talagang kapana-panabik, ngunit marahil isang maliit na intimidating, dahil ikaw ay ibinigay na isang file na walang laman C at mayroon kang upang punan ito in OK, ng masira ito kaya hayaan sa pamahalaang bahagi. Makikita mo nais upang buksan ang file memory card. Iyon ay tila sapat na simple. Pagkatapos, hanapin ang simula ng isang JPG image. Lahat ng mga file sa memorya na ito card ay pagpunta sa maging JPGs. Pagkatapos, sa sandaling mahanap mo ang simula, ka pagpunta upang buksan ang isang bagong JPG, na ay, tulad ng, lumikha ng isang JPG, at isulat ang 512 byte sa isang oras hanggang sa isang bagong JPG ay nakita, at nagtatapos sa programa, sa sandaling mo detect ang dulo ng file. Kaya unang hakbang una ay para buksan ang ang file memory card. Pero alam mo ito nagagawa, at mayroong isang file I / O function na pupuntahan patunayan napaka kapaki-pakinabang. OK. Kaya ano ang mga JPGs? Dahil kailangan naming i-umpisa ito. Well, JPGs, tulad lamang ng kaunti mga mapa, lamang ang mga pagkakasunud-sunod ng mga byte. Sa kabutihang-palad, ang bawat JPG ay nagsisimula sa alinman sa 0xff, 0xd8, 0xff, 0xe0, isa sa pagkakasunud-sunod ng bytes, o iba pang pagkakasunud-sunod ng mga byte. Kaya ipahiwatig mga apat na bytes sa simula ng isang JPG. Wala maliban sa mga dalawang kumbinasyon ng apat na bytes. At sa kabutihang-palad para sa amin, isa pang katotohanan na ating Maaaring sulitin ng ay na ang bawat JPG ay naka-imbak tabi-tabi sa memory card. Kinakatawan ko na ang mga istraktura ng isang memory card schematically sa ito slide dito. Narito, ang bawat parisukat, ang bawat parihaba, Kinakatawan ng 512 bytes, at magsimula ito may isang kulay-abo na sa gagawin namin ang hindi talaga magkaroon ng isang JPG. Ngunit pagkatapos namin sa wakas pindutin ang isang bloke ng isang bituin. Ay nangangahulugan na na ang unang apat na bytes out ng mga 512 ay isa sa mga dalawang nagsisimula pagkakasunud-sunod ng isang JPG. At kami pumunta mula doon, at pagkatapos ay sa sandaling Nagtatapos ang isa JPG, ang susunod na isa ay nagsisimula. Hindi namin kailanman magkaroon ng anumang higit pa kulay-abo na puwang sa tagapamagitan. Ngunit paano namin talagang basahin ito, at basahin ang 512 bytes sa gayon ay maaari kaming magsagawa ng ang paghahambing sa unang lugar? Well, sabihin bumalik sa fread, na tumatagal sa struct na maglalaman ang bytes na binabasa mo. Kaya ka pagpunta sa ilagay sa mga nasa doon - ang laki, ang bilang, at pagkatapos ay inpointer na binabasa mo mula sa. Ngayon, gusto naming basahin ang 512 sa isang pagkakataon, at gusto naming mag-imbak ito sa isang buffer, Pupunta ako sa tumawag ito. Talaga, kami ay pagpunta sa hawakan papunta sa mga 512 bytes at gawin bagay sa mga ito, i-right? Alinman Kami ay pagpunta sa ihambing ang unang apat na bytes, o kami ay pagpunta sa basahin ito sa, OK? Kaya pagkatapos ay ang pointer ng data pagkatapos ang magsilbi bilang iyong buffer, at ang inpointer, mahusay, na lamang ng pagpunta upang maging iyong memory card. I-back sa aming eskematiko memory card. Kami ay pagpunta sa basahin 512 bytes sa isang pagkakataon, pag-iimbak ng bawat bloke ng 512-byte sa isang buffer, na may hawak na papunta sa mga buffer, mga 512 bytes, hanggang alam namin nang eksakto kung ano ang gagawin sa kanila. Kaya sa simula ay hindi anumang bagay, kaya ipapakita namin basahin ang buffer, ihambing ito, at hindi namin kailangang gawin sa mga ito. At pagkatapos, namin sa wakas ay pindutin ang isang bituin i-block, ibig sabihin na hindi namin nakita ng aming mga unang JPG. Kaya ang buffer ngayon hawakan Bytes mula sa na JPG. Ang susunod na oras 512 bytes, dahil sila hindi isang bituin bloke, hindi rin bahagi ng na JPG. At JPGs ay tuloy-tuloy mula doon sa in, hanggang maabot namin ang susunod na JPG. At pagkatapos ay ang buffer pagkatapos ay i-hold 512 bytes para na JPG, at iba pa, at balik sa gayon. OK. Kaya sa sandaling pindutin mo ang unang naka-star bloke, ang unang JPG, kung paano ito gawin talaga, well, buksan ito? Ni gumawa ng bagong JPG Hayaan. Ang mga filename para sa isang JPG ay pumunta sa nasa format, numero, bilang, number.jpg, sa na sila ay pinangalanan sa ang pagkakasunud-sunod sa kung saan sila ay natagpuan, simula sa 0. Kaya ang unang JPG na sa iyo mahanap ay 000.jpg. Kaya, marahil isang magandang ideya upang masubaybayan kung gaano karaming mga JPGs iyong natagpuan sa ngayon. Kaya iyon ang file name. Ngunit paano mo talagang gawin iyon? Well, kami ay pagpunta sa gumamit ng isang function na tinatawag sprintf. Ang isang maliit na bit katulad sa printf, kung saan maaari mong gamitin ang mga placeholder para sa mga string, maliban sa kasong ito, ay sprintf-print ang file out papunta sa kasalukuyang direktoryo, hindi papunta sa terminal. OK. Kaya dito nakita namin na mayroon kaming pamagat, isang pansamantalang trabaho array na mag-iimbak ang nanggaling na puwersa string, at ipasa namin sa pamagat ng aktwal na string na may isang placeholder, gusto lamang namin ang natutunan ang gagawin sa printf. Ngunit code na ito na mayroon akong dito ay magbibigay sa 2.jpg, hindi 002.jpg. Kaya makikita ko bang iwan sa iyo upang malaman kung paano baguhin ang mga placeholder upang gumawa ng mga tamang pangalan. OK. Kaya sa oras na iyong sprintf'd pagkatapos ay maaari kang buksan ang file na iyon, dahil umiiral na ito sa iyong direktoryo, na may fopen, gamit ang pamagat, at pagkatapos ay kahit anong mode gusto mo mabuksan ang file na in Kaya ngayon na binuksan namin ang isang bagong JPG file, ngayon kami ay maaaring sumulat ng 512 bytes sa isang oras, hanggang sa isang bagong JPG ay natagpuan. Kaya ipaalam sa tumagal ng isa pang hitsura sa syntax ng fwrite. Alam ko na ako lumalabas ang slide na ito ng marami, ngunit nais ko lang upang tiyakin na ka guys ay hindi makakuha ng masyadong nalilito, dahil Alam ko na ito ay napakadaling ihalo up ang una at huling argumento, sa partikular. Ngunit tandaan na ikaw ay sumusulat mula sa ang iyong buffer sa labas ng mga imahe ng file. Ngayon na alam mo kung paano ang pagpapawalang 512 bytes sa iyong JPG file na ikaw ay nilikha, mahusay, nais naming itigil na proseso sa sandaling naabot na namin ang katapusan ng ang aming card, dahil mayroong hindi magiging anumang higit pang mga larawan na matagpuan. Kaya sabihin bumalik sa fread minsan pa, nangangako ako. fread nagbabalik kung gaano karaming mga item ng laki, laki, ay handa na sa matagumpay. May perpektong, ito ay magiging kahit ano pumasa sa iyo para sa numero, tama? Dahil sinusubukan mong basahin numero ng mga elemento ng laki, ang laki. Ngunit kung fread ay hindi kayang basahin na numero ng mga elemento, pagkatapos ay magkakaroon ito ng bumalik anumang bilang matagumpay ito basahin. Ngayon, isa sa mahalagang bagay upang tandaan ay na kung gagamitin mo ng isa pang file I / O pag-andar tulad ng fgetc, magkakaroon ito ring ibalik kung gaano karaming mga item ito matagumpay na basahin. Ano ang kapaki-pakinabang tungkol sa ito function ay na kung gagamitin mo pag-andar sa loob ng isang kalagayan, ito ay isakatuparan ang sarili habang pagtukoy kondisyon na iyon, na kung saan ay lamang talagang kapaki-pakinabang. Kaya kung mayroon kang mga kondisyon na ito, sabihin nating, kung fread buffer, sizeof aso, 2, pointer, katumbas ay katumbas ng 1, na ay nangangahulugan na nais kong basahin 2 aso sa oras. Ngunit kung fread nagbabalik 1 sa halip ng 2 bilang inaasahan, na nangangahulugan na may 2 aso naiwan sa aking file, ngunit sa halip 1. Ngunit kung ito ay nagbabalik 2, pagkatapos ay mayroon pa rin ako mga 2 aso sa loob ng aking buffer. Kaya ngayon na nagbibigay sa iyo ng ideya sa kung paano suriin para sa dulo ng file, ngunit sabihin dumaan sa ngayon ang logic. Paano talaga namin piraso lahat ng mga sangkap na ito nang sama-sama? Sa sandaling pindutin namin ang aming mga unang JPG, dahil alam namin na JPGs ay naka-imbak contiguously, magpapadala kami ay sumusulat hanggang maabot namin ang dulo ng file card. Ngunit hindi namin nais na magsulat kahit ano hanggang pagkatapos. Kaya mahalaga ito, hindi lamang na kami sa sa simula ng isang bagong JPG, ngunit kung na natagpuan namin ang isang JPG o hindi. Kung Ito ay sa simula ng isang bagong JPG, kami ay nais upang isara ang aming kasalukuyang JPG file kung mayroon kaming isang bukas, at bukas ng bago sa magsulat sa. Kung hindi ito ang simula ng bagong JPG, bagaman, itinatago namin ang parehong JPG file buksan at isulat sa na. Susubukan naming isulat ang aming buffer sa alinman ang JPG file mayroon bukas namin, ibinigay na mayroon kaming isang bukas, siyempre. Kung hindi namin nakita ng aming mga unang JPG pa, hindi namin magsulat ng kahit ano. At ang prosesong ito ay nagpatuloy hanggang sa iyo maabot ang dulo ng file card. At sa wakas, makikita mo gusto upang gawing Siguraduhin na fclose anumang mga file na iyong nai-fopened. Sa sandaling ikaw ay kumportable sa mga konsepto, tingnan ang ilang mga pseudocode, na aking maisama dito. Una, gusto mong buksan ang file card, at pagkatapos ay ulitin ang mga sumusunod na proseso hanggang sa nakarating ang dulo ng card. Gusto mong magbasa ng 512 bytes sa isang buffer. Gamit na buffer, makikita mo nais na suriin ang kung ikaw ay sa simula ng isang bagong JPG o hindi. At ang kasagutan sa na tanong habilin makaapekto sa iyong pamamahala ng file - kung aling mga file binuksan mo, na mga bago kayo nagsasara. Pagkatapos, na mayroon ka nahanap ng isang JPG? Paano na-mo pagpapanatiling track ng iyon? Pagkatapos, depende sa na, ikaw ay alinman sa sumulat papunta sa kasalukuyang JPG na may bukas, o hindi isulat ito sa lahat, dahil hindi mo pa napatunayan ang isang JPG. Sa wakas, sa sandaling naabot mo na ang dulo ng ang file, makikita mo gusto upang isara ang anumang natitirang mga file na may bukas ka. Gusto naming maging malaki na rin dito. At gamit na, mo na mababawi ang lahat ng ang nawawalang mga file mula sa na memory card, na kung saan ay isang medyo kahanga-hangang gawa. Kaya Pat iyong sarili sa likod. Ngunit, may isa pang karagdagang elemento upang ang PSET, kung saan ay ang paligsahan. Makakakita ka ng mga iyon ang lahat ng mga larawan na iyong nakuhang muli ay aktwal na mga larawan ng mga tauhan CS50 ni. Kaya't kung ikaw ay nasa campus o sa isang lugar malapit, pagkatapos ay maaari mong kumuha ng litrato na may mga ang mga kawani, at ang mga seksyon na iyon ay may karamihan ng mga larawan sa mga miyembro ng kawani mula sa kanilang mga nakuhang muli mga file habilin makakuha ng isang kahanga-hangang premyo. Gamit na, pagkatapos ay tapos ka na ang mabawi PSET. Ang pangalan ko ay Zamyla, at ito ay CS50.