JASON HIRSCHHORN: Welcome, të gjithë, për të Javës 6. Unë jam i lumtur të shoh se jeni të gjithë të gjallë dhe të mirë pas Quiz 0, sepse unë e di se ishte pak i përafërt. Por fatmirësisht, ju të gjithë e bëri tepër të mirë. Dhe në mënyrë që është e mrekullueshme. Nëse ju jeni në seksionin tim, unë kam dhënë më nga ju të mbështetur kuize tuaj tashmë. Një çift nga ju, unë jam takuar pas klasës. Dhe nëse ju jeni një student i zgjerimit dhe ju nuk keni marrë quiz tuaj mbrapa ende, TF juaj është ndoshta duke punuar në atë dhe nota atë, dhe do të merrni atë për ju së shpejti. Kështu studentët e mi extension që janë shikuar tani - me shpresë të jetojnë - Unë do të marrë kuize tuaj pak si. Axhenda jonë për sot është si më poshtë. Së pari, ne do të shkoj për disa Burimet që CS50 ofron për ju. Ne jemi duke shkuar për të shkuar mbi Quiz 0 ardhshëm, dhe Unë do të përgjigjen për çdo pyetje askujt ka lidhje me probleme të veçanta. Dhe atëherë, ne do të shkojnë mbi file I / O dhe problemi vendosur 5. Këto dy tema e fundit do të marrë deri pjesa më e madhe e seksionit sot. I vënë këtë listë deri çdo javë si një kujtesë për ju të gjithë, por e kryesore seksion, ne kemi vetëm 90 minuta - ne nuk janë në gjendje të mbulojnë çdo gjë që unë do të duan për të mbuluar për ju djema. Por ne kemi një ton të burimeve për ju për të nxjerrë mbi të si ju të merrni të dini materiale dhe të punës përmes problemi juaj vendos. Një kujtim që unë kam në internet një tekst kuti, e krijuar për ju që të plotësoni në qoftë se ju keni ndonjë reagime për mua, pozitiv apo konstruktive, në lidhje me nenin. Kjo URL është e vendosur të drejtë këtu. Pra ju lutem, të marrë një moment në qoftë se ju keni ndonjë reagime, nëse gjatë seksionit, ose pas, ose pasi të keni shikuar këtë video në internet, për të më jepni përshtypjet tuaja. I really appreciate çdo dhe të gjithë atë. Kështu që unë kam qenë që ka biseda të vogla me një shumë të tim Nxënësit në të gjithë javës - si unë dorë kuize mbrapa, duke folur për Sigurisht, duke parë se si ju jeni duke bërë. Dhe një temë ka dalë mbi dhe mbi ne duke folur për - në të veçantë - Problemi vendos. Dhe unë kam encapsulated këtë temë në bordin tani. Në thelb, ka një ndryshim në mes të kthyer në diçka që është e bëhet si duhet dhe diçka që është bërë mirë. Shumica e njerëzve kanë bërë fantastike në aspektin e saktësisë - 5-të ose 4-të në të gjitha psets. Shumica e njerëzve janë duke u ato të gjitha të kohës. Megjithatë, vetëm për shkak se ju keni bërë diçka e drejtë nuk do të thotë që ju keni bërë diçka si elegante, ose efikase, apo si pastër si ju mund të ketë bërë atë. Dhe kjo është ajo design - dhe në një shkallë më të vogël, stil - Akset janë për. Kështu që unë jam shtyrë ju të gjithë, dhe NGP tjera janë shtyrë ju djema, për të jo vetëm nga ana e tij në gjërat që janë të sakta, por të kthehet në gjërat që janë të koduara mirë. Jo duke bërë të panevojshme për sythe, nuk recalculating variabla nëse është ju nuk keni për të. Për shembull, duke kërkuar përsëri në problemit të vendosur 4, kur vënë tulla në ekran, çdo rresht - çdo tulla në një rresht duke pasur parasysh të njëjtën gjë ka koordinatën y - njëjtën lartësi koordinuar. Kështu që koordinatën y nuk ka nevojë të të llogaritet brenda të brendshme mbivendosur për lak që ju të ngjarë përdorur për të vënë ato tulla në ekran. Ajo ka nevojë vetëm për të llogaritet çdo herë që kaloi një rresht, ose lëvizur poshtë një rresht. Pra, thonë se në qoftë se ka 10 tulla në një rresht, çdo tullë mund të ketë të njëjtën y-koordinuar, dhe se y-koordinuar vetëm mund të llogaritet një herë për të gjithë ata. Ajo nuk ka nevojë për të llogaritet 10 herë, as që llogaritja nevojë të ndodhë në aktuale funksion thirrje - thirrje e re funksion gracked. Pra, nëse kjo ishte pak konfuze për ju, më përgjithësisht, gjëra që nuk duhet të ndodhë çdo herë të vetme ju shkoni nëpër një lak PËR nuk duhet të jetë vënë brenda lak PËR, dhe nuk duhet të ndodhë çdo herë që shkoni përmes lak PËR. Një tjetër shembull i mirë dizajn pamë në Java 3 për 15, ju mund të mbani udhë të zero. Pra, kur ju nisja e bordit, ju të shpëtuar - në një ndryshore globale, ndoshta - x dhe y koordinatën i zero. Dhe atëherë sa herë që ju - në funksion tuaj masë, sa herë që ju bëni një veprim i suksesshëm, ju update vendndodhjen e zero. Kjo do t'ju shpëtojë nga detyrimi për të bërë mbivendosur për sythe për të kërkuar përmes hipte në çdo kohë në funksion tuaj masë dhe për të gjetur zero, ose të gjejnë tjegull, dhe pastaj shikoni ç'pritet më tej në të. Në vend të kësaj, ju keni vendndodhjen e zero, ju vetëm mund të shikoni më lart, poshtë, dhe në të majtë dhe të djathtë të saj, për të gjetur tjegull ju po kërkoni. Pra, për sa i përket programeve që ne jemi shkrim, ata kurrë nuk janë mjaft e madhe se disa nga këto vendime të projektimit janë me të vërtetë do të pengojë tuaj program, ose të bëjë atë të kandiduar më ngadalë, apo ndoshta edhe të dalë jashtë kujtesës. Por ne jemi ende duke shtyrë ju djema për të shkruar si elegante dhe Kodi efikas të jetë e mundur. Pra, nëse ju bëni të përfundojë duke shkruar gjëra që kanë një mënyrë të konsiderueshme më të mëdha Shtrirja, ata do të shkruhet me të mirë projektimit përveç për të qenë të sakta. Pra një numër i keni sjellë atë jashtë. Kjo është diçka që ne jemi duke kërkuar për - diçka që ne do të vazhdojmë të ju djema në shtytje. Nëse ndonjëherë keni ndonjë pyetje në lidhje hartimin e programit tuaj, të ndjehen të lirë për të arritur deri tek unë, dhe unë jam i lumtur për të ecin nëpër programin tuaj me ju, dhe të nxjerr në pah disa të dizajnit Vendimet që ju bëra, dhe të ju jap disa sugjerime se si për të bërë edhe Vendimet më të mirë të projektimit. Pra, ne jemi duke shkuar për të shkuar përpara për të folur për Quiz 0. Para se të bëjmë këtë, e bën dikush keni ndonjë pyetje në lidhje me atë që Unë kam mbuluar deri më tani? [Shushurimës ZHURMA] JASON HIRSCHHORN: Shtatë sekonda. OK. Le të flasim për Quiz 0 për një grimë. Shumica prej jush kanë Quiz tuaj 0 e mbrapa. Nëse ju nuk e bëjnë, me shpresë ju kujtohet atë pak. Por në qoftë se ju keni marrë Quiz 0, atëherë ju gjithashtu kanë qasje në internet në PDF zgjidhjet mostër. A ka dikush ndonjë pyetje para se të ne hidhen në materiale të javës, në lidhje me një problem i veçantë për Quiz 0 - pse përgjigja është se çfarë është ajo? A është dikush hutuar për ndonjë gjë? Edhe në qoftë se ju mori problemin e drejtë, por ashtu do të donte mua për të shpjeguar atë pak më shumë, unë jam i lumtur për të bërë këtë tani. Kështu që unë kam kërkuar për të ju djema vijnë të përgatitur me disa mendime për Quiz 0. Pra, kush do të donte të na marrë filloi me një pyetje ose komentojë rreth Quiz 0? [LETËR shushurimës] JASON HIRSCHHORN: Jo të gjithë e bëri të përkryer. Kështu që unë e di [qesh] nuk duhet të ketë disa pyetje rreth Quiz 0. OK. Po. Ompica. OMPICA: Numri 10. JASON HIRSCHHORN: Numri 10. Cili e kishte numrin 10? OMPICA: - JASON HIRSCHHORN: I haven't - OMPICA: përfshijnë - JASON HIRSCHHORN: Numri 10 ka qenë tetë për të i - shkruar tetë të i? OMPICA: Po. JASON HIRSCHHORN: OK. Pra, një pyetje tjetër që ju mund të keni pyeti ishte parashikues jam unë? Përgjigja është po. Në seksionin para quiz, e pyeta ju djema për të kodojnë dy Sterling dhe tetë për i. Dy prej tyre ka ndodhur me shfaqen në quiz. Kështu që shpresojmë se, ju paguar vëmendje për atë. Dhe në qoftë se keni pasur, atëherë ju do të keni ndoshta bëhet edhe për ata të dy. Por tetë të i, ne nuk të vërtetë kodin ajo në klasë, por ajo ishte, përsëri, pyetur në quiz. Pra disa gjëra për të marrë vini re kur kodim tetë për i. Gjëja e parë, për pyetjen, ishte që ju nevojitet për të kontrolluar nëse vargu ishte e barabartë me null. Një çift njerëz u përpoqën të kontrolloni më vonë në në programin e në qoftë se s simboli i ishte - kështu që një karakter të veçantë në se string - ishte e barabartë me null. Por mos harroni, kjo null është në thelb - është e mirë për të menduar për null si një tregues zero - një tregues për zero - diku në kujtesë, ku ju nuk mund të hyni. Pra, nëse diçka është e barabartë me null, ju e di se ajo nuk është nisur, ose nuk ka asgjë atje. Pra, është një yll char, s simboli i është një char. Kështu që ka kuptim për të krahasuar s për të null, por kllapa nuk s i te null. Por përsëri - kështu që ishte gjëja e parë që ju është dashur për të bërë - kontrolloni për të siguruar që ju të vërtetë mori një varg të vërtetë. Tjetra, ju të kërkuar për të shkuar nëpërmjet çdo karakter në vargun. Dhe kështu që do të jetë si një s kllapa Unë, për shembull, në qoftë se i është iterator tuaj. Dhe të marrë atë karakter, dhe të marrë vlerën e saj aktuale. Ju keni atë ruhet si një char, por vlera ASCII për zero - zero si karakter - nuk është në të vërtetë zero numer i plote. Kjo është një numër tjetër që ju mund të shikoni në tabelën ASCII. Pra, një mënyrë për të korrigjuar për këtë - ndoshta mënyra më e mirë për të korrigjuar për se - po hiqni asgjë vlera karakter - zero si një karakter. Quote Pra minus vetme, zero, një tjetër apostrofë. Kjo do të marrë çfarëdo numri që ju keni si një char, dhe të merrni atë të barabartë me Numri si një numër të plotë aktuale. Dhe kjo është shumë e ngjashme me qasjen e shumë njerëz mori në Problemi vendosur 2, me Cezarit dhe Viginere - ato ciphers, kur ju u rradhës e tyre. Pra, pasi që e keni këtë në një numër nga zero deri nëntë, pastaj - varësi ku shkon në numrin përfundimtar - ju duhet të shumëfishohen atë me një fuqi prej 10. Disa njerëz u zhvendos nga mbrapa për të para, dhe shumëzuar individuale Numri me një fuqi prej 10. Disa njerëz u zhvendos nga para për të mbështetur - dhe kështu mori më të lartë urdhërojë numrat e parë - dhe do të shpëtojë ata që janë në një globale kundër ndryshueshme. Dhe pastaj çdo herë përmes PER loop, shumohen se gjigandi globale kundërvënë ndryshore me 10, për të bërë hapësirë ​​për char ardhshëm. Kështu që ishte pak konfuze, pa me shkrim atë në bord. Por zgjidhja e mostrës është në dispozicion për ju. Por ata ishin gjërat e mëdha ne kemi qenë duke kërkuar për. Gjithashtu një kontroll për t'u siguruar se çdo Karakteri individ ishte me të vërtetë një Karakteri mes zero dhe nëntë, dhe nuk disa karakter tjetër, si një A, për shembull. Këto ishin gjërat që ne po kërkonin në këtë pyetje. A do të përgjigjem pyetjes tuaj? OMPICA: Po. JASON HIRSCHHORN: OK. A ka pyetje të tjera rreth Quiz 0? Po në lidhje me hartimin e? Gjithkush hartimin e drejtë? Jo. Ka qenë një - [Qesh] Çdo pyetje në lidhje me proces hartimi? Wow. [LETËR shushurimës] JASON HIRSCHHORN: Po. Michael. Michael: A është numri 7 - të rastit? JASON HIRSCHHORN: Numri 7. Numri 7 ishte marrë një numër të plotë të rastit. Excellent. Pra, ju jeni të dhënë një numër të plotë a dhe një b numër i plotë, dhe ju doni një të rastit integer midis a dhe b. Ne fakt mund të shkruaj këtë një të tillë në bordi, sepse kjo ishte një linjë e kodit - një mënyrë për të bërë atë. Pra, ne jemi duke dhënë drand si një funksion ne mund të përdorim. Dhe çfarë bën drand - duke supozuar kjo është seeded - çfarë do drand kthehet? Michael: Një noton nga 0.0 në 1.0. JASON HIRSCHHORN: Një numër - po. Një numër midis 0 dhe 1. Dhe kështu që ne kemi b dhe një. Dhe pastaj ne kemi numrin tonë të rastit midis 0 dhe 1 dhënë për ne nga drand. Disa njerëz u përpoqën për të vënë b, ose minus b një, apo diçka brenda atyre kllapa. Kjo do të thotë se ata janë të Argumentet për këtë funksion. drand nuk merr argumente - si getString bën nuk marrin argumente. Pra, është vetëm Paren hapur, të ngushtë Paren - dhe që, në vetvete, është e thirrje funksion. Dhe kjo ju jep një numër midis 0 dhe 1. Natyrisht, ne kemi një gamë të tërë se numrat mund të in Thotë, nëse b eshte 10 dhe a eshte 5, ne vërtetë duan një numër me një sërë 5. Pra, gjëja tjetër që ne duhet të bëni është shumohen kjo nga varg b minus një. Pra, duke supozuar se është shumëzuar. Dhe kjo do të na japë një numër brenda një gamë të caktuar. Dhe kjo varg specifik të qenë Dallimi në mes të b minus një. Dhe së fundi, se do të të jap atë vetëm nga - thonë varg mes b minus a është 5, që do të na japin një numër nga 0 në 5. Por në qoftë se një është në fakt 5, ne kemi nevojë për të rritur ky varg deri ku është e në fakt menduar të jetë, duke shtuar një. Kështu që merr të drejtën logjikë. Dhe pastaj, do ju duhet një pyetje tjetër? Michael: Jo. Unë vetëm ndjehen me të vërtetë memec tani. [Qesh] JASON HIRSCHHORN: Jo. A nuk e ndjeni të vërtetë memec. Një numër i njerëzve të luftuar me këtë pyetje. Dhe pastaj, pyetja tjetër është, drand, ju tha, ju jep një noton - kthen një noton. Por ky funksion kërkohet në të vërtetë për një numër të plotë të kthehet. Ju nuk keni nevojë për të hedhur këtë në mënyrë të qartë për një numër të plotë, sepse këto Operacionet do të trajtojnë atë si të gjitha a noton - si një numër lundrues pikë. Ashtu si këtë vullneti - edhe nëse kjo është një numër i plotë, kjo do qoftë e saktë. Të gjitha shumëzimit do të punojnë. Ju nuk keni nevojë për të hedhur atë këtu. Në fakt, ju nuk duhet të hedhur atë. Kjo do të - në qoftë se ju do të hedhur një numër që është midis 0 dhe 1 - një numër të rastit, një pikë lundrues - atëherë ajo do të jetë ose vetëm 0 ose 1, kështu që ju do të humbni të gjithë që saktësi. Por në fund, kur të ktheheni, ajo automatikisht merr kthyer si një numër të plotë. Pra, ju nuk keni nevojë të bëni që hedh veten. Pra, kjo ishte përgjigja e se pyetja, numër 7. Çdo pyetje të tjera në Quiz 0? Po, Annie. Annie: Kur ne përdorim recursive - kur i përdorim sythe përsëritës? JASON HIRSCHHORN: Kur përdorni recursive - në mënyrë më të përgjithshme, pro dhe kundër të recursion kundrejt një qasje përsëritës. A mund dikush të ofrojë një pro apo con? Ju lutem? Nuk mund dikush. Kush mund të ofrojë një pro apo con? [LETËR shushurimës] STUDENT 1: rekursive është më pak coding - më pak të shtypni? JASON HIRSCHHORN: Pra, në përgjithësi, recursion në veçanti, një funksion - ose një algoritmi si bashkimi lloj - e cila jep veten në një qasje gjithkund rekursive - mund të jenë më të drejtpërdrejtë të kodit Recursively. Dhe vetëm të bëjë më shumë kuptim për të bërë atë Recursively. Kështu që do të ishte një pro për recursion. Të tjerët? Po? STUDENT 2: Con për recursion - Ai përdor më shumë memorie. JASON HIRSCHHORN: Pra, saktësisht e drejtë. Një funksion gjithkund rekursive do të mbajë duke shtuar rafte korniza në rafte. Pra, nëse ju jeni të veprojnë në një shumë të numrat, dhe kanë për të thirrur këtë funksionojë një shumë, atëherë ju me siguri do të marrë më shumë memorie, ndërsa një qasje përsëritës do të vënë vetëm një rafte kornizë në rafte, sepse të gjitha ndodh brenda një funksion. Çdo të tjera pro dhe kundra? Po. STUDENT 3: Pro për recursion. Ju nuk keni për të përcaktuar në të avancuar se sa herë Kodi desh të përsëriteshin. Ju mund të keni një numër të paracaktuar të herë që ju duhet të iterate, atëherë recursion është më e mirë, për shkak se ajo merr këtë rezultat. JASON HIRSCHHORN: Unë mendoj se kjo është e vërtetë. Por unë mendoj se në të dyja rastet ju kurrë nuk do të - ju ndoshta do të merrni disa të dhëna nga përdoruesit. Apo ky funksion do të ketë disa të dhëna që do të përcaktojë se sa herë ajo duhet të kandidojë. Pra në përgjithësi, ju nuk do kodin vështirë - edhe në një qasje përsëritës - si shumë herë se loop duhet të drejtohet. A ju keni një tjetër keni qenë duke menduar për, Annie? OK. Pra, ata janë ndoshta dy - pro më i madh dhe më i madh con në një recursive kundrejt një qasje përsëritës. OK. Çdo gjë tjetër në Quiz 0? Le të lëvizë. Dokumentit I / O. Nuk është një e mrekullueshme e shkurtër këtë javë në dosje I / O që shpresojmë se ju kane shikuar të shumta herë, dhe admiruar. Një punë e madhe shkoi në këtë, dhe unë kam dëgjuar se është insanely dobishme. Unë gjithashtu përfshinte lidhje në këtë rrëshqitje, në rast se ju nuk keni pasur një shans për të parë atë 10 herë. Pra, ne do të shkojë shkurtimisht mbi hapa të mëdha për hapjen dhe duke punuar me fotografi, dhe pastaj ne do të pikiatë në një problem kodimit para shqyrtimit të vendosur problemin. Pra, përsëri, unë jam duke shkuar për të vënë këtë deri në ekran, por unë jam duke shkuar për të folur për vetëm një minutë për atë që ne jemi duke bërë këtu me dosjen I/O-- çfarë do të thotë kjo? Kjo do të thotë se ne mund të krijojë tonë programe, dhe më pas kanë programet tona dalje, dhe nuk kanë bërë ndonjë ndikim në bota e jashtme e programit tonë. Por kur ne të fillojnë të punojnë me fotografi - edhe leximin e tyre në krijimin dhe ato - ne mund të kemi disa efekt në bota e jashtme e programit tonë. Ashtu si në qoftë se Microsoft Word nuk ishte në gjendje për të bërë të gjitha dokumentet Word, atëherë një herë Microsoft Word lë, të gjitha nga tuaj Puna do të jetë zhdukur, dhe kjo do të të vërtetë të jetë i kotë. Ne në fund të fundit duan të jenë në gjendje të shkruajnë programe të cilat mund të ndikojnë bota rreth tyre, edhe duke marrë në inputeve komplekse - në aspektin e dosjeve dhe nëpërmjet fotografi, dhe gjithashtu duke krijuar interesante dhe rezultatet bindëse - në aspektin e llojeve të ndryshme të dosjeve. Pra, kjo është arsyeja pse ne jemi duke filluar për të mësojnë se si të punojnë me fotografi. Më konkretisht, çfarë ne bëjmë është si më poshtë. Është shumë e thjeshtë. Ka vetëm disa hapa, dhe ata janë të listuar këtu në këtë kod. Pra, ne jemi duke shkuar për të shkuar nëpërmjet kjo linjë kod pas rreshti. Së pari, ju shihni theksuar - kur ju jeni duke punuar me një fotografi, pavarësisht nga lloji i dosjes është, ju keni nevojë për të hapur atë. Dhe kjo është me një thirrje për të fopen - të drejtë këtu. Ju përfshijë emrin e file. Nëse skedari nuk është në directory tuaj, apo dosje ku ky program jetën, atëherë ju gjithashtu duhet të përfshijë një rrugë për të ku fotografi që është. Ne do të supozojmë se ky file i quajtur "text.txt" - një dokument tekst të thjeshtë - është në njëjtën dosje si ky program është. Pra, kjo është një tjetër gjë për të mbajtur në mendje - se në qoftë se ju doni të hapur një skedë diku tjetër, ju në të vërtetë nevojë për për të përfshirë vendndodhjen e saj. Së dyti, ju mund të kalojë një argument për të fopen, dhe kjo është ajo që ju doni të bëni me dosjen. Ka tre argumente kryesore që ju jeni do të kalojë për të fopen. Kush mund të jepni për këta të tre? Kush mund të më jepni një prej tyre? Po. STUDENT 4: Emri i file? JASON HIRSCHHORN: Na vjen keq. Tre argumentet kryesore që ju mund të kalojnë si argumenti i dytë për fopen. Ju jeni të drejtë - emri i skedarit është argumenti i parë. Por argumenti i dytë për fopen janë në përgjithësi tre vargjet, dhe - po. Aleja. Aleja: Një për append. JASON HIRSCHHORN: Një, në qoftë se ju doni të append në një skedë që tashmë ekziston. STUDENT 5: R për të lexuar. JASON HIRSCHHORN: R, në qoftë se ju dëshironi të lexoni nga një skedar. STUDENT 6: W për të shkruar. JASON HIRSCHHORN: Dhe w, në qoftë se ju dua të shkruaj në një skedar. Pra, në këtë rast, ne jemi me shkrim të dosjes, kështu që ne kemi w. Ju hapur atë, ju gjithashtu keni për të shpëtuar paraqesë diku, dhe kjo është me Kodi në anën e majtë të operatori detyrë - Unë jam duke krijuar një tregues për një skedar quajtur, në këtë rast, dosje. Ne nuk do të shqetësohen se çfarë këtë të gjitha shkronja kapitale gjë FILE është. Mjafton të them, kjo është një kohë të gjatë lumë të zero dhe ato. Dhe kjo është se si ne do të vepruar atë dhe për të kuptuar atë. Gjë tjetër ne duhet të bëjmë - dhe kjo është tepër e rëndësishme - sa herë që ju të hapur një skedë - në fakt, sa herë që ju telefononi malloc, për shembull, dhe për të marrë disa kujtesës dhe të përpiqen dhe për të shpëtuar atë në një tregues, ju gjithmonë dëshironi të kontrolloni për të siguruar që kjo funksion nuk u kthye null. Pra, në këtë rast, ne jemi të kontrolluar për të sigurt se ne fakt u hap paraqesë në mënyrë korrekte, dhe nuk kishte asnjë gabim në programin tonë. Tjetra, një herë ne kemi kontrolluar për të siguruar se ne kemi një fotografi pune, ne mund të shkruaj për të, ose lexuar nga, ose append në dosjen. Në këtë rast, unë jam thjesht shtypje një linjë tek kjo skedë. Si mund ta dini se? E pra, unë jam duke përdorur këtë funksion të quajtur fprintf. Të gjitha funksionet që ju do të jetë duke përdorur kur shkrim për të, ose të lexuar nga, ose manipuluar fotografi do të jetë i ngjashëm me funksionet që ju keni parë më parë, por fillojnë me shkronjën F, në këmbë për dosjen. Dhe fprintf, ndryshe nga të shtypura tonë normale app, merr një argument më shumë, dhe se është skedari ku ju doni të shtypura këtë linjë për të. Unë nuk kam asgjë për të e drejta e ohai. Unë nuk e kanë të tretën Argumenti për printf - ose argumenti dytë të printf, Argumenti i tretë për fprintf, sepse unë nuk kanë ndonjë placeholders këtu. Unë nuk jam përfshirë ndonjë variablave. Por përsëri, fprintf dhe të gjitha këto dosje funksionet që operojnë me fotografi janë në përgjithësi do të duhet skedarin në të cilën ata janë duke funksionuar. Së fundi, gjëja e fundit e rëndësishme që të bëni është për të mbyllur dosjen, ashtu si me të - sa herë që ne malloc diçka, ne duam të diçka të lirë, që të mos ne të ketë një rrjedhje kujtesës - ne duam për të mbyllur dosjen tonë. Nëse ky program exited pa mbylljen fotografi, shanset janë asgjë nuk do të shkojë gabuar, veçanërisht nëse ajo ishte një fotografi e vogël. Por ajo sigurisht që është stil i mirë coding dhe praktikë për të gjithmonë të mbyllur dosjen tuaj kur të keni mbaruar duke e përdorur atë. Kështu që është bazat e dosjes I / O. Ju ndoshta keni parë që më parë, ose pashë atë në atë Short fantastike. A ka dikush ndonjë pyetje, para se të ne do të shkojmë në disa praktikë kodim Problemet, rreth dosjes I / O ose Hapat Unë vetëm kaloi? [Typing Sounds] JASON HIRSCHHORN: A ju kam një pyetje, AVI? AVI: Jo. JASON HIRSCHHORN: OK. Unë jam duke shkuar për të pritur një tjetër shtatë sekonda. [Qesh] Kjo është një tip i vërtetë të mirë. Ju djema thjesht nuk më pëlqen pyetje. Kjo është në rregull. OK. Pra problemi ynë i parë praktikë është, ne jemi duke shkuar për të kopjuar funksionin e një mjet command line që ju ndoshta përdorur më parë - kopje - mjet kopje. Nëse ju shkruani krah dhe pastaj të kalojë atë dy Argumentet Në terminalin tuaj, ju mund të kopjoni një skedar. Dhe kjo është ajo që ne do për të shkruar tani. Pra, përsëri, lexuar off e kësaj rrëshqitje, unë do të ju për të shkruar një program që merr dy dhe vetëm dy command-line Argumentet - një fotografi burim dhe një fotografi destinacion - dhe kopje përmbajtjen e burimit paraqesë në dosjen e destinacionit një bajt në një kohë. Pra, kjo është një shumë për të kërkuar. Përsëri, një qasje e mirë për këtë është që të mos shkoni direkt në kodin C, por thyejnë atë në disa hapa. Së pari, mendoj se për logjikën - pikërisht ajo që unë jam duke kërkuar që ju për të bërë - dhe për të kuptuar të gjitha të Hapat për këtë problem. Jo në C, vetëm në disa pseudokod, apo edhe një modeli mendor i çfarë po ndodh. Tjetra, një herë ju keni të pseudokod poshtë, kuptoj se si pseudokod harta onto mjeteve dhe gjërat që ne kemi mësuar për të përdorur në C. Dhe së fundi, një herë ju keni të gjitha që së bashku, ju mund kodin problemin. Merrni 5 deri në 10 minuta për të të punuar në këtë problem. Unë do të vënë udhëzimet mbështetur në një të dytë. Dhe pastaj ne do të shkoj për pseudokod, dhe kodi ajo jetojmë si grup. Nëse keni ndonjë pyetje, ndërsa ju jeni duke punuar në këtë, të ndjehen të lirë për të rritur dora jote, dhe unë do të vij përreth dhe përgjigjet atyre. STUDENT 7: A mund të shpullë një copë letër? JASON HIRSCHHORN: Si është puna? [Typing Sounds] JASON HIRSCHHORN: OK. Le të shkojnë mbi pseudokod parë, dhe atëherë unë do të ju jap një çift më shumë minuta për të përfunduar coding. Kush do të donte për të filluar me off me vijën e parë të pseudokod për këtë funksion? STUDENT 8: Kontrollo për të siguruar që ju janë dhënë dy fotografi. JASON HIRSCHHORN: OK. Dhe në qoftë se ne nuk jemi? STUDENT 8: Unë do të kthehet 0. JASON HIRSCHHORN: A duhet të kthehemi 0? STUDENT 8: Kthimi a - U boshatis sepse të. Më vjen keq. JASON HIRSCHHORN: Po. Ndoshta jo 0. Sepse 0 do të thotë çdo gjë ishte e mirë. OK. Pra, kjo është vija e parë i pseudokod. Kush ka linjë të dytë të pseudokod? STUDENT 9: Hapur dy fotografi? JASON HIRSCHHORN: Hapni dy fotografi. OK? STUDENT 10: Kontrollo për të parë nëse skedari është NULL? JASON HIRSCHHORN: Kontrollo për të bërë i sigurt as janë NULL. Si një mënjanë - çaj 0 - është se NULL? STUDENT 11: Jo. JASON HIRSCHHORN: Kjo nuk është NULL. Kjo quhet terminator NULL. Është e shkruar në të vërtetë vetëm me një l. Pra kontrolluar diçka kundër që - kjo është në fakt një karakter - kështu kontrolluar diçka kundër që është nuk është njëjtë si kontrolluar për të parë nëse ajo është e barabartë NULL. Dhe disa njerëz - on kuize e tyre dhe problemin e tyre grupe - kanë marrë dy nga ata të hutuar. Por dy nga këto janë në të vërtetë të ndryshme. Një mbaron një varg - një është një tregues 0. STUDENT 12: Pse nuk do të kontrolloni për të të sigurt se dosjet nuk janë NULL para se hapjen e tyre? JASON HIRSCHHORN: Pra hapur kursen diçka në këtë dosje. Dhe në qoftë se ju shkoni përsëri këtu - kështu që kjo linjë - fopen - do t'ju japë një adresë dhe dyqan se adresa në dosjen e nëse ajo punon. Nëse kjo nuk funksionon, ajo do të ruajë NULL - STUDENT 12: Oh. OK. Ju mori. JASON HIRSCHHORN: Në dosjen. Pra, ju nuk mund të kontrolloni për NULL para se ju keni hapur ato. NULL do të thotë diçka që nuk e bëri të funksionoj në rregull. OK. Pra, kontrolloni për t'u siguruar që nuk është? Apo jeni? Çfarë mendojmë? Ne do të shkojnë me këtë. STUDENT 13: A është. JASON HIRSCHHORN: A është? As është? STUDENT 13: A është. JASON HIRSCHHORN: OK. Ne duket se kemi disa konsensus mbi atë. As është NULL. OK, linjë e ardhshme e pseudokod. Kush nuk më ka dhënë një linjë ende? Ne do të presim për ju. Po. STUDENT 14: Ju keni për të lexuar nga dosja e parë? JASON HIRSCHHORN: OK. STUDENT 14: Ose ne përdorim fscanf ose diçka si kjo dosjen e parë? JASON HIRSCHHORN: Pra, ne duam të lexuar nga dosja e parë dhe - le të vënë atë të drejtë këtu. Lexoni nga burim file. Dhe pastaj, çfarë bëjmë ne pas ne lexohet nga burim file? Dikush tjetër? STUDENT 15: Shkruani në fotografi destinacion? JASON HIRSCHHORN: Ne shkruaj për të fotografi destinacion, dhe - OK. Çfarë tjetër jemi ne të humbur? Dikush tjetër që nuk e ka dhënë një linjë e kodit ende - të pseudokod. Po. STUDENT 16: Ndoshta ju mund të kontrolloni gjithmonë nëse ka diçka për të lexuar për, si rreshtin tjetër? Që janë si rreshtin tjetër, të shohim nëse ajo ekziston. [ELEKTRONIKE BEEP] JASON HIRSCHHORN: Oops. Kjo është software im journaling. Po? STUDENT 16: Po. JASON HIRSCHHORN: Pra, jepni ajo për mua edhe një herë. STUDENT 16: Kontrolloni nëse ka ende një vijë tjetër nga burim fotografi për të lexuar. JASON HIRSCHHORN: OK. Pra, ne nuk jemi duke lexuar linja - u lexuar bytes këtu - por ju jeni të saktë. Ne duam të lexojnë dhe të shkruajnë deri nuk ka më bytes. OK. Dhe kështu këto duhet të vërtetë të jetë e prerë pak, sepse ata janë në aty. E drejtë? Deri ne jemi nga bytes, ne do të lexohet nga burim file dhe shkruani në dosjen e destinacionit. Dhe pastaj, çfarë është e fundit linjë e pseudokod? Dikush që nuk është dhënë mua diçka akoma. STUDENT 17: Mbyllni fotografi? JASON HIRSCHHORN: Pikërisht. Mbylle fotografi. Pra, nuk ka pseudokod tonë. Unë jam duke shkuar për të vënë në pseudokod në gedit, dhe në disa minuta ne do të kodit këtë së bashku. OK. Le të ketë filluar si një grup. Nishant, unë kam dosjen time të re. Unë e kam hapur vetëm këtë ide. Dokument Untitled 1. Cila është gjëja e parë që duhet të bëjë? Nishant: Përfshini biblioteka? JASON HIRSCHHORN: OK. Çfarë bibliotekat? Nishant: Stdio.h, stdlib.h, besoj? JASON HIRSCHHORN: OK. Çfarë është stdlib për? Nishant: Kam harruar. JASON HIRSCHHORN: OK. Pra përfshijnë stdio. Çfarë duhet të bëj edhe më parë Unë të fillojë kodim? Nishant: Shkruaj një kokë? JASON HIRSCHHORN: Si mund ta marrë atë me ngjyrë? [VOICES Mbivendosje] Nishant: Si mund të merrni atë me ngjyrë? JASON HIRSCHHORN: Si duhet me ngjyra kodim? Nishant: Nuk e di. Oh. Ruaj. JASON HIRSCHHORN: Save. Po. Unë duhet të ruani atë si një. C. Pra, ruajeni në desktop si cp.c. Sweet. Dhe në qoftë se unë dua të të marrë stilin e plotë pika, çfarë duhet të përfshijnë në krye? Nishant: Ju mund të shkruani emrin tuaj, emrin e programit, dhe me qëllim e programit si? JASON HIRSCHHORN: Duket e mirë. Excellent. Pra, ju keni filluar të na jashtë të përkryer. # Include - ne gjithashtu do të shkruaj - OK. Kështu që unë mendoj se jam të gjithë të vendosur për të shkuar. Kush ka linjë të parë të kodit për mua - ose linjat e para të kodit që ajo do të marrë për të kënaqur jonë e parë komentoni në pseudokod? Ju. STUDENT 18: A nuk duhet të jetë int argc, dhe pastaj char * ARGV? JASON HIRSCHHORN: Unë mendoj se ju jeni të drejtë. Le të ndryshojë atë për të int kryesore, Paren të hapura, argc int, comma, char * ARGV? Si kjo? STUDENT 18: Kllapa. JASON HIRSCHHORN: Kllapa. Kllapa e hapur, kllapa të ngushtë, prind ngushtë. Perfect. Tani unë mund të marrë argumente command-line. OK. Sigurimi ne jemi duke i dhënë dy fotografi. Ju mund të jepni se si. STUDENT 18: Nëse argc - kjo nuk ka të barabartë 3. JASON HIRSCHHORN: Nëse Paren hapura argc nuk barabartë 3? STUDENT 18: Po, ju të ktheheni 1 apo ndonjë gjë. JASON HIRSCHHORN: Na vjen keq. STUDENT 18: Kthimi 1 apo ndonjë gjë. JASON HIRSCHHORN: Kthehu 1. OK? Great. Hapur dy fotografi. Kush mund të më ndihmojë të hapë dy fotografi? Kush nuk më ka dhënë kodin akoma? Kurt? Kurt: Pra, të gjitha shkronja kapitale F-I-L-E burim yll. JASON HIRSCHHORN: Unë jam duke shkuar për të marrë nga zanoret. Ata janë të ftohtë. Është si Tumblr. STUDENT 18: barabartë fopen - JASON HIRSCHHORN: barabartë fopen? STUDENT 18: Paren Open, ARGV, kllapa e hapur. JASON HIRSCHHORN: Prisni. Më vjen keq. Paren e hapur. OK. STUDENT 18: Po. ARGV nën 1. JASON HIRSCHHORN: Nën 1? STUDENT 18: Po. ARGV kllapa e hapur 1 - po. Dhe pastaj presje, dhe pastaj të hapur të dyfishtë quote, r, të japin kuotën e dyfishtë, Paren ngushtë, pikëpresje. JASON HIRSCHHORN: Sweet. Dhe çfarë lidhje me një tjetër? STUDENT 18: Shumë i ngjashëm, por në vend të kësaj i S-R-C, ju do të telefononi atë d-S-T. JASON HIRSCHHORN: Oo! Më pëlqen kjo. STUDENT 18: Vetëm D-S-T. Po. Dhe pastaj ARGV, kllapa të hapur, 2. Po. Dhe pastaj w vend të r. Po. JASON HIRSCHHORN: Great. Çifti i ardhshëm i linjave. Gjithashtu, në qoftë se dikush ka gjëra për të rritur Linjat që ne kemi bërë, të ndjehen të lirë për të shtoni ato si. Kontrolloni për t'u siguruar që nuk është NULL. Kush mund të jepni kodin Unë duhet të përmbushin këtë linjë të pseudokod? Archer. ARCHER: src Nëse është e barabartë me të barabartëve NULL ose DST barabartë është e barabartë me NULL, atëherë ju kthehen - JASON HIRSCHHORN: Çfarë? ARCHER: Kthimi 2? JASON HIRSCHHORN: Kthimi 2. Pra, nëse Paren hapur src është e barabartë me barabartë NULL, ose - çfarëdo që thing's - tub? Tub? Ne do të thërrasë atë tub. Tub, tub, DST barabartë është e barabartë me NULL, kthehen 2. OK? Deri ne jemi jashtë bytes - ne lloj anashkaluar këtë hap nga pjesa pseudokod për të shkuar në këtu. Por deri sa ne jemi jashtë bytes - çfarë e bën këtë të tingëllojë si? Çfarë lloji i strukturës C - por unë nuk e përdorin strukturën fjalën, sepse ne jemi duke shkuar për të filluar me që në raste të tjera - por C mjet A tingëllon kjo si? STUDENT 19: Një lak. JASON HIRSCHHORN: Një lak. Tingëllon si një lak. Pra, kush mund të më jepni rreshtin e parë i kodit lak të drejtë këtu? Ju gjithashtu mund të zgjedhë se çfarë lloj të loop ju dëshironi, nëse ju jepni kjo linjë e kodit. Ka tri lloje. Ju merrni të marr. Unë do të sugjeroja një nga ata. Avi. Cili e do? AVI: PËR. JASON HIRSCHHORN: PËR. AVI: int i barabartë me zero. JASON HIRSCHHORN: OK. AVI: Kjo pjesë Unë nuk jam i sigurt rreth. Por i është më pak se madhësia i burimit yll? Unë nuk jam i sigurt për këtë. JASON HIRSCHHORN: OK. AVI: Për shkak se ju doni madhësie fotografish, e drejtë? JASON HIRSCHHORN: Pra, kjo ndoshta nuk do të na japin madhësinë aktuale paraqesë në bytes. Pra, çfarë tjetër mund të bëjmë? Çfarë është një lloj tjetër lak? Apo duhet të rrinë me lak PËR? STUDENT 20: A mund të bëni një lak, ndërsa? Dhe pastaj, çfarë ju do të bëni është you'd - sepse ne kemi një * char për dosjen. Pra, nëse ne vetëm i mbajnë bën rritjen që deri sa ne do të gjeni në karakterin NULL fundi i saj? Apo nuk ka, është se nuk se si fotografi të punuar? JASON HIRSCHHORN: Pra, ne mund të vazhdojmë bën rritjen e char * deri sa të gjeni NULL - STUDENT 20: Në thelb të mbajë karakteri nga karakteri deri ne goditi në fund të file. JASON HIRSCHHORN: Po. Pra, kjo është ajo që ne duam të bëjmë. Ne duam të mbajtur lexim, karakterin me karakter, deri sa të kemi të në fund të file. STUDENT 20: Po. Gjej të - çfarë është fundi apo shenjë të ndaluar në fund të një skedar teksti. JASON HIRSCHHORN: OK. Pra, kur ne të marrë në fund të skedarit - si mund ta dimë që kemi arritur fundi i një fotografi? Nëse unë jam duke e quajtur - kështu që le të hap prapa. Çfarë është një funksion? Le të shkojnë në këtë linjë të drejtë këtu. Lexoni nga burim file. Kush mund të jepni atë linjë e kodit? STUDENT 21: Fscanf? JASON HIRSCHHORN: Fscanf. OK. Çka nëse unë dua të lexuar, shumë në mënyrë të veçantë, e bajt? STUDENT 21: Nuk e di. JASON HIRSCHHORN: OK. Edhe më të thjeshta se fscanf - ajo është një - Unë dua të lexuar nga një burim file? Lexoni nga një burim file. Çfarë është një funksion - po. STUDENT 22: Kjo është fread? JASON HIRSCHHORN: Fread. Unë mendoj se le të rrinë me se një për tani. Çfarë lloj argumenteve ka fread marrë? STUDENT 22: Ndoshta file type, dhe më pas vend në dosjen? JASON HIRSCHHORN: Çfarë mund të shtypni këtu të kuptoj se çfarë lloji i argumenteve fread merr? STUDENTËT E SHUMËFISHTA: Njeriu fread. JASON HIRSCHHORN: Man fread dhe fwrite. Duket si ata rri së bashku. Pra fread merr si shumë argumente? STUDENT 23: Katër. JASON HIRSCHHORN: Ajo merr katër argumente. Ajo merr një tregues, një madhësi, dhe se Gjë, e cila është e pazakontë, dhe disa fotografi. OK? Le të lexuar në lidhje me të këtu. "Funksioni fread lexon n memb elemente të të dhënave, çdo madhësi bytes e gjatë, nga lumë vuri në dukje nga lumë, ruajtjen e tyre në vendin e dhënë nga akrep. " Pra katër argumente. Pse nuk mundem të vetëm kopje këtë, dhe ngjitur atë të drejtë këtu. OK. Pra, kush mund të fillojnë të plotësojë këto argumente për mua? Avi. AVI: Merrni nga boshllëkun. Vendos vetëm src. Merrni nga treguesin dhe yllin. Vendos src. Pastaj - JASON HIRSCHHORN: Kështu që unë jam duke shkuar për të ndaluar ju atje, sepse kjo është e gabuar. Ju jeni të drejtë me src, por ku duhet src shkoni? [VOICES Mbivendosje] JASON HIRSCHHORN: Ajo duhet të shkojnë mbi këtu. Kjo është src - src tonë është një lloj. Le të shohim këtu. Kjo është duke kërkuar një lloj FILE *, ne në fakt zakonisht i shohin ato si kjo. Pra, kjo është duke i kërkuar për një argument të file type * quajtur lumë që është src. OK? Çfarë Madhësia e gjëra; ne duam të lexuar? Unë ju dha këtë në përshkrimi problem. STUDENT 24: Një bajt në një kohë. JASON HIRSCHHORN: Një bajt. Sa i madh është një bajt? Madhësia e saj është në bytes, kështu që çfarë mund të kam vënë atje? STUDENT 25: One. JASON HIRSCHHORN: One. E drejta. Madhësia e saj është në njësi bajt, kështu që 1 është 1 bajt. Sa shumë mund të dëshironi të lexoni në një kohë. STUDENT 26: One? JASON HIRSCHHORN: Një gjë. Unë dua të lexoj një gjë e madhësisë 1, e bite në një kohë. Dhe ku mund ta vënë atë, një herë kam lexuar atë? STUDENT 27: Destinacioni? JASON HIRSCHHORN: Kështu që unë nuk mund të vënë ajo drejt e në destinacion. STUDENT 28: Ju jeni gonna të vënë atë në një tregues të tretë? STUDENT 27: Të destinacion. JASON HIRSCHHORN: OK. Po. STUDENT 29: Ju mund të deklarojë diçka të të veprojë si një ruajtje të përkohshme më parë. JASON HIRSCHHORN: OK. Ma jep atë. STUDENT 29: Një tjetër fotografi akrep, ndoshta? JASON HIRSCHHORN: OK. Pra, kjo është yll i pavlefshëm - kjo është një lloj i pavlefshëm yll, kështu që nuk ka duhet të jetë një tregues fotografi. Dhe në qoftë se unë jam duke lexuar një bajt, ku do të ishte një vend i mirë për të ruajtur një bajt? STUDENT 29: Një grup? JASON HIRSCHHORN: Një grup. OK. Dhe çfarë tjetër është diçka që është vetëm madhësi një bajt? STUDENT 30: Një char *? STUDENT 29: Po. JASON HIRSCHHORN: A char * nuk është një bajt. STUDENT 29: A char. JASON HIRSCHHORN: Një char është një bajt. E drejtë? Pra, le të quajmë këtë mbrojtëse është një gjenerik emrin e përdorur për këto gjëra për të ruajtur diçka përkohësisht. Kështu që unë të krijojë një tampon. E drejtë? Por kjo do të marrë një zbrazëti *. Pra, ndoshta ju jeni të drejtë, se ajo duhet të jetë një tampon të madhësisë 0. Pra, ajo ruan një të tillë - drejtë. Për shkak se kjo e drejtë këtu - char buffer është një karakter, por kjo merr një zbrazëti * - një akrep. Kështu që unë mund të bëjë këtë dhe tani buffer është një akrep. Çfarë tjetër mund të bëj? STUDENT 31: Vendos një yllin afër char. JASON HIRSCHHORN: unë mund të kanë krijuar atë char *. OK. Çfarë është një tjetër gjë unë mund të bëj? Ose le të shkojë me këtë një të tillë. Char * tampon, kështu që çfarë mund ta vënë në këtu? STUDENT 31: Buffer. JASON HIRSCHHORN: Buffer. Buffer është një tregues për një char. Dhe në atë vend, ne jemi duke një bajt për diçka që kemi lexuar. Po. Avi. AVI: Vetëm një pyetje të shpejtë. A doni të malloc tampon? JASON HIRSCHHORN: Kush mund të përgjigjem kësaj pyetjeje? STUDENT 32: E pra, S'ka pikë për çdo gjë të drejtë tani, kështu - JASON HIRSCHHORN: Por a ne duam të malloc atë? STUDENT 32: Nëse ju do të bëni atë që mënyrë, unë mendoj, vërtet, sepse ju do të duhet disa vend për të për pikë për të. JASON HIRSCHHORN: A ne duhet të malloc atë? STUDENT 33: Nëse ju jeni do të përdorin atë jashtë lak. JASON HIRSCHHORN: A do të përdorin atë jashtë lak? STUDENT 34: Po. STUDENT 35: Prisni. A duam ta deklarojnë atë në lak të përtej? JASON HIRSCHHORN: Kështu që unë mendoj që ne kemi disa pseudo GJATË loop këtu se ne jemi duke u përpjekur të kuptoj, se ne nuk kemi marrë për të ende. Ne nuk kemi nevojë të malloc atë. Ne jemi të veprojnë në kryesore, ajo është vetëm do për t'u përdorur brenda këtij lak. Ajo nuk ka nevojë të ekzistojë jashtë kësaj. Pra, ajo mund të jetë një variabël lokale. Ju keni një tregues për një variabël lokale. STUDENT 36: Por nuk është duke treguar për çdo gjë. JASON HIRSCHHORN: Jo, nuk është e initialized për çdo gjë. Por ne nuk do të përdorin atë gjithashtu. Ne jemi duke shkuar për të vënë diçka në kjo hera e parë që ne e përdorin atë. Kështu që duket OK. Pra, ne nuk kemi nevojë malloc këtu. Dhe unë mendoj se është në rregull si është. OK. Ne kemi linjë fread. Le të bëjmë linjë tjetër. Në qoftë se ne duam të shkruani në një skedar, ajo që është një funksion i mirë për të përdorur për të bërë këtë? STUDENT 37: fwrite? STUDENT 38: Fprintf? JASON HIRSCHHORN: Fprintf është një. Çfarë është një tjetër? STUDENT 39: fwrite. JASON HIRSCHHORN: fwrite. Dhe për qëllimet tona, fwrite, të cilat ne pamë këtu, është ndoshta zgjedhja më e mirë. Ajo merr katër argumente si. Nishant, mund të jepni mua argumentet? Nishant nis të bëhet i pari-së të jetë vetëm tampon. JASON HIRSCHHORN: OK. Nishant: një të dytë vetëm do të jetë 1. Një e treta do të jetë 1. Dhe i katërti do të jetë DST. JASON HIRSCHHORN: A ka dikush ndonjë pyetje në lidhje me atë vijë? Kjo duket e mirë. OK. Deri tani ajo duket si një gjë që jeni humbur - në të vërtetë, le të shkruajë kjo linjë e fundit. Mbylle fotografi. Kush mund të na përfundojë deri shkrim këto dy linja e fundit? Po. Na vjen keq, si e ke emrin? Lucy: Lucy. JASON HIRSCHHORN: Lucy. Lucy: src fclose dhe pastaj destinacion fclose. JASON HIRSCHHORN: fclose, Paren hapur, src, Paren ngushtë, pikëpresje. Dhe fclose - vërtet? Lucy: kllapat Open, DST dhe pastaj pikëpresje. JASON HIRSCHHORN: Great. Dhe çfarë duhet të përfshijë në fund? Lucy: Kthen 0. JASON HIRSCHHORN: Kthen 0. A duhet të? Vetëm një pyetje. A kemi të përfshijë kthimin 0? STUDENTËT E SHUMËFISHTA: Jo. JASON HIRSCHHORN: Jo. Kryesor e bën këtë automatikisht në qoftë se ju merrni në fund. Por unë mendoj se është e mirë për përfshijë atë në mënyrë eksplicite. Sidomos kur ne jemi duke u kthyer tjera gjërat në të gjithë programin. OK. Kjo është ajo që ne jemi të humbur - GJATË çfarë? Kush mund të mendoj për disa - ka një kuptim të asaj që gjërat mund të shkojnë në atje? Edhe në qoftë se ajo është vetëm në disa pseudokod si gjuhë? Ajo që ne me të vërtetë janë - çfarë duam të shkojnë deri? Po, Lucy. Lucy: Fundi i file. JASON HIRSCHHORN: Fundi i file. Pra, çfarë do të thotë nga fund të file? Lucy: Pasi të keni arritur fund të skedarit, të ndaluar. JASON HIRSCHHORN: OK. Pra, një herë kemi arritur në fund të skedarit. Si e dimë ne kur ne kemi arritur fundi i dosjes? STUDENT 40: Mendoj buffer do të jetë i vendosur për NULL. STUDENT 41: Buffer deklarohet brenda lak. JASON HIRSCHHORN: Pra, ju mendoni se tampon do të jetë i vendosur për NULL. Pse do tampon jetë i vendosur për NULL? STUDENT 40: Sepse kur ju fread, ju jeni duke u përpjekur për të vënë asgjë në tampon. JASON HIRSCHHORN: OK. Pra, ju jeni duke menduar fread - kur ne kemi arritur në fund të skedar, ajo që është fread do të bëni? Unë mendoj se kjo është çështja ne duhet të kuptoj. Çfarë do fread bëni? A do të vënë NULL në tampon, ose e bën atë të bëjë diçka tjetër? Si mund të kuptoj se çfarë bën? STUDENT 42: Man. JASON HIRSCHHORN: Man. Pra, le të shohim këtu. Kthehu vlerë. Më suksesit, fread dhe fwrite kthehen Numri i artikujve lexuar apo të shkruara. Ky numër i barabartë me numrin e bytes transferuar vetëm kur madhësia është 1. Në qoftë se ndodh një gabim, ose në fund të fotografi arrihet, vlera e kthyer është një numërimin shkurtër pika ose 0. Pra, për qëllimet tona, nëse arrin fread në fund të skedarit, dhe lexon nga në fund të dosjes, nuk ka mbetur asgjë për të lexuar, atë që ajo do të kthehet? STUDENT 43: Zero? JASON HIRSCHHORN: Çfarë? STUDENT 43: Zero? JASON HIRSCHHORN: Zero. Ajo do të kthehen zero. Pra, ne e dimë se fread, kur ne kemi arritur në fund të skedarit, është duke shkuar të kthehen zero. Si mund të përdorni atë në avantazhin tonë? AVI: Ju mund të deklarojë një ndryshore jashtë e lak quajtur çek. Nëse është e barabartë me check - tani për tani - një. JASON HIRSCHHORN: OK. AVI: Dhe pastaj ju mund të vendosni një IF deklaratë menjëherë pas fread thënë nëse fread është e barabartë me zero - nr. JASON HIRSCHHORN: Kush mund të ndihmojë Avi jashtë? AVI: Cila është vlera e kthyer nga fread? JASON HIRSCHHORN: Ne vetëm shkoi mbi këtë. AVI: Si e përfaqësojnë atë? JASON HIRSCHHORN: Pra, ai kthehet - Le kërkoni këtu - ajo kthehet një size_t, e cila është në thelb një numër të plotë. Pra, ajo kthehet një numër të plotë. Dhe në rastin tonë, ajo do të kthehen 1 ose 0 - 1 në qoftë se lexoni një gjë - një bajt, dhe 0 në qoftë se ne kemi arritur në fund. Pra, nëse fread - vërtet? STUDENT 45: Nuk mund të ju vetëm vënë plotë fread (buffer, 1, 1, SRC) në ndërsa lak? JASON HIRSCHHORN: Pra, ju propozojmë duke bërë këtë në atje? [VOICES Mbivendosje] JASON HIRSCHHORN: Prit. Pra, ne jemi duke hequr këtë. Pra, ju jeni duke propozuar fread në atje? Çfarë duhet të gjithashtu të lëvizë në qoftë se ju doni të bëni këtë? STUDENT 45: tampon jashtë. JASON HIRSCHHORN: Ne duhet gjithashtu të lëvizë këtë këtu. STUDENT 45: Por e bën që vazhdimisht lëvizin atë përpara? [VOICES Mbivendosje] JASON HIRSCHHORN: OK. Pra, kjo është ajo që Okshar propozuar. Ne krijimin e tampon tonë. Ne GJATË fread, atëherë ne fwrite. Mendime mbi këtë? STUDENT 46: Pyetja ime e vetme është, do të ai në fakt ekzekutuar fread komandës? JASON HIRSCHHORN: pyetje e Madhe. Kur ju jeni duke i dhënë një telefonatë funksion brenda një kusht, bën që thirrje funksion të ekzekutuar? Ne kemi parë shembuj të këtë më parë. E drejtë? STUDENT 46: OK. Po. Pra, ajo ka ekzekutuar. JASON HIRSCHHORN: Ne kemi parë gjëra të si se para, ku ne kemi një thirrje funksion brenda një kusht. A ekzekutojë se thirrje funksion? Po. Pra, përgjigja është po. Kjo thirrje funksion do të ekzekutojë. Por përsëri, kjo është ajo që ne duam? Çfarë është një mënyrë që ne mund të kuptoj nëse kjo është ajo që ne duam? STUDENTËT E SHUMËFISHTA: Run atë? JASON HIRSCHHORN: Ne mund të drejtuar atë. Por, para se të bëjmë këtë, ne mund të edhe arsye me këtë. Nëse - thonë se ne kemi një bajt në tonë paraqesë, ne do të merrni për të këtu, ne do të merrni për këtë kod. Kjo do të kandidojë. fread do të kthehet një bajt dhe ruajtur atë në buffer. Dhe kjo do të vlerësojë në 1, drejtë, pasi ai kthehet 1. Kështu, ndërsa 1. A do të thotë kodin brenda lak, ndërsa do të ekzekutojë? STUDENT 47: Po. Është e vërtetë. JASON HIRSCHHORN: Po. 1 është e vërtetë. Kjo nuk është 0. Pra kodi brenda këtu do të ekzekutojë. Pra, ne do të shkruaj atë. Ne do të kthehen në këtë vijë edhe një herë. Tani ne kemi - ne jemi në fund të skedarit tonë. Ne lexojmë nga fundi i skedarit tonë, sepse ne vetëm kishte një bajt në të. Fread kthehet 0, dyqane diçka në tampon. Unë sinqerisht nuk e di se çfarë ajo ruan në tampon. Ne ndoshta mund të kërkoni për të parë atë që bën. Se unë sinqerisht nuk e di. Ne nuk e dimë, i cili kujdeset se çfarë ajo ruan në tampon? Por kjo do të kthehet 0. Dhe do të ndërsa 0 kryej? GJATË 0 nuk do të ekzekutojë. Pra, atëherë ne do të lëvizin poshtë këtu. Pra, le të marrë një shfaqje e duarve nëse kjo është kodi ne duhet të kandidojë, ose në qoftë se ne duhet të bëjë ndryshime të parë. Pra, nëse ju mendoni se - ju duhet për të votuar. Nëse ju mendoni se ne duhet të drejtuar këtë kod si është, ju lutemi të ngritur dorën. OK. Ka një - ju keni një pyetje, shqetësim? Po. STUDENT 48: Pasi ne shkojmë buffer jashtë lak, nuk kemi duhet të malloc atë? JASON HIRSCHHORN: pyetje e Madhe. Pasi ne shkojmë tampon jashtë loop, ne duhet të malloc atë? Kjo është një pyetje Shtrirja. Nëse do të nisja tampon jashtë i këtij lak, do të ekzistojë brenda lak? STUDENTËT E SHUMËFISHTA: Po. JASON HIRSCHHORN: Po. Shtrirja e saj mbulon brenda lak, dhe, me të vërtetë, çdo gjë më poshtë atë brenda të këtij kodi, duke përfshirë gjërat brenda këtu. Pra, ne nuk kemi nevojë të malloc atë. Kjo është një variabël lokale, dhe qëllimin e saj ende përfshin lak. STUDENT 49: A kemi nevojë për të liruar atë? JASON HIRSCHHORN: A ne duhet të tampon të lirë? STUDENT 49: Po, në qoftë se ne nuk e bëjmë malloc. JASON HIRSCHHORN: A ne duhet të tampon të lirë? Ne nuk e bëjmë. Përsëri, kjo është një variabël lokale, kështu që ne nuk kemi nevojë për të liruar atë. OK. Le të shohim se çfarë ndodh. Pra, është e uninitialized. Kjo ishte ajo që diçka që Marcus propozuar më parë. Pra, ne kemi se gabimi, tampon ndryshueshme është uninitialized kur përdoret këtu. Si mund ta fix this? STUDENT 50: malloc atë? STUDENT 51: barabartë NULL? STUDENT 52: Thuaj tampon barabartë NULL. JASON HIRSCHHORN: OK. Duket e mirë. Ne kemi tani. Le të krijojnë diçka të provoni kopjimi. Pra, ne kemi skedar teksti tonë. Si mund të drejtuar këtë program? Po. STUDENT 53: Ju mund të bëni dot çaj cp, test.txt. Dhe pastaj ju mund të emrit një tjetër fotografi të cilat ajo do dyqan në. JASON HIRSCHHORN: OK. Ne do të thërrasë atë out.txt. Ftohtë? Faji seg. Mendime mbi fajin seg? Kjo është e madhe. Si mund të gjeni se ku faji seg është? Çfarë? STUDENT 54: gdb. JASON HIRSCHHORN: gdb. Ne drejtuar gdb duke shkruar gdb dot plagë, emrin e programit tonë. Nuk ka argumente command line atje. Ne jemi duke shkuar për të vendosur një Breakpoint në kryesore. Nëse unë dua të fillojë gdb, çfarë të bëj? STUDENT 55: R. JASON HIRSCHHORN: R. Dhe pastaj çfarë? STUDENT 55: Argumentet? JASON HIRSCHHORN: Pastaj argumente command-line. Le të ecin nëpër. N është vetëm duke marrë më rresht pas rreshti. Unë jam duke shkuar për të shkuar deri I merrni faj tim seg. Nuk është faji im seg. Ajo duket si fread shkaktuar faji im seg. Unë e di fread shkaktuar fajin tim seg, për shkak se ishte Linja ne vetëm ekzekutuar. Dhe e vetmja gjë që ishte ndodh në këtë linjë - Dy gjëra janë duke ndodhur. Fread ishte duke shkuar, dhe pastaj ne ishim duke bërë disa kontrolluar kohë. Unë jam i gatshëm të bast se GJATË kontrolluar nuk ishte shkaktuar fajin tim seg. Më shumë gjasa, fread ishte duke shkaktuar fajin tim seg. Unë gjithashtu shoh diçka këtu, memcopy. Kopje kujtesës. Tingëllon si lëviz kujtesën nga një vend në tjetrën. Tingëllon si diçka që do të ndodhë në fread, ndoshta disa kujtesës lëvizin nga këtu për të këtu. Le të kalojnë nëpër këtë përsëri. Si mund të fillojë atë mbi dhe drejtuar atë përsëri? Po. STUDENT 56: A keni nevojë për të vënë një simbol para tampon? JASON HIRSCHHORN: Pra, ampersand para tampon të më jepte adresën e buffer, e cila është një char *. Le të drejtuar nëpër këtë një më shumë kohë. Si mund të drejtuar nëpër atë një herë më shumë? STUDENT 57: A mund të ju vetëm shkruani drejtuar përsëri? JASON HIRSCHHORN: Vetëm shkruani të kandidojë përsëri. Pra, ne nuk do të ekzekutuar këtë linjë. Pra buffer është një tregues NULL. Korrigjuar? Ajo është duke treguar - le të shohim. Në qoftë se ne kemi tonë - tërheqë një foto të shpejtë të kësaj. A mund të gjithë të parë nëse Unë shkruaj këtu? Pra, në rafte, ne kemi një lokal ndryshueshme dhe është quajtur tampon, dhe kjo është një tregues për një char. Çfarë Adresa është kjo char në? STUDENT 58: 0x0. JASON HIRSCHHORN: E drejta. Kjo është ajo që kjo është. Në këtu, brenda tampon, është ruajtur 0x0. Kjo është ajo që ne kemi - Setup ne kemi tani. Pra kjo linjë, fread, vë diçka nga burimi ku? Në këtë kuti ose në këtë kuti? Cili kuti? Majtas kuti apo kuti e duhur? Kjo kuti e drejtë. Ajo ndjek treguesin, dhe e vë atë në këtu. Kur ne përpiqemi dhe të kujtesës në kontakt lokacioni 0, çfarë bëjmë ne të merrni? Një faji segmentimit. Kjo është gabim që ne kemi tani. Po. STUDENT 59: A nuk keni për të vënë yje tampon? Apo jo? Për fread? JASON HIRSCHHORN: Pra fread merr një tregues. Pra, ai kalon në tampon. Dhe atëherë ajo do të de-referencë ajo diku brenda fread. Por përsëri, ne e pamë, ajo merr një akrep. Ne nuk kemi nevojë për të kaluar atë tampon yll. Kjo do të kalojnë ai çdo gjë që është këtu. Dhe kjo ndoshta do të na japin një gabim sepse ne jemi të de-referenca atë. E drejtë? Këtë tregues kur ne de-referencë, kur ne të përpiqemi për të hyrë në këtë vend, ne jemi duke marrë një gabim - faji ynë segmentimit. Pra, - oops. Ne jemi duke shkuar për të lënë jashtë të gdb. Shkarko ynë - problemi ynë - është e drejtë këtu në këtë linjë. Dhe kjo është një problem, sepse e kësaj linje. Si mund të krijoni një kuti që është i arritshëm në fread. E drejtë? Ne kemi nevojë për të krijuar një kuti që është një byte të madh, madhësia e një char. Por ne kemi nevojë që kuti të jenë të aksesueshme kur ky funksion ekzekuton. Pra, ku - po. Ndonjë ide? STUDENT 60: Vetëm të vendosur atë si çdo karakter të rastit. Vetëm të bëjë është e barabartë Char Buffer karakteri. Dhe pastaj, kur ju keni tampon atje - JASON HIRSCHHORN: Prisni. Char tampon? Pra, asnjë yll? STUDENT 60: Po. Merrni nga yllin. Është e barabartë me një karakter të rastit. JASON HIRSCHHORN: OK. Pra, më jepni një të tillë. STUDENT 60: Like a apo diçka. Dhe atëherë kur ju keni buffer atje, ju përdorni një - STUDENT 61: Star? Oh jo, simbol. STUDENT 60: Përdorimi zëvendësojeni me. JASON HIRSCHHORN: OK. Dhe çfarë lidhje në fwrite? STUDENT 60: Përdorimi zëvendësojeni përsëri. JASON HIRSCHHORN: Në rregull. Pra, ideja juaj është, ne të krijojë një char dhe vënë diçka në të, dhe pastaj të shkruaj për atë char. STUDENT 60: Po. JASON HIRSCHHORN: Çfarë mendojnë njerëzit? STUDENT 62: Është e ndërlikuar. JASON HIRSCHHORN: OK. Le të tërheqë atë. Pra këtë herë, unë jam duke shkuar për të nxjerrë këtë në kuqe në rafte këtu, dhe pastaj ne do të ketë - ooh! Më vjen keq. Pra, këtë herë ne kemi diçka të quajtur tampon, dhe kjo është në rafte. Korrigjuar? Dhe ne jemi duke kursyer në të një, fillimisht. Pastaj ne kemi thirrjen tonë për fread. Çfarë fread bën është ajo merr një bajt nga fotografi tonë dhe e vë atë diku. Ajo e vë atë në çfarëdo gjë është duke treguar. E pra, para se të kishim këtë adresë - 0x0. Tani ajo që adresa kemi? STUDENT 63: Çfarëdo Adresa buffer është. JASON HIRSCHHORN: Çfarëdo Adresa buffer është. Kjo ndoshta do të jetë diçka të tillë. Ndoshta do të fillojë me një b dhe një F, dhe pastaj kanë gjashtë tjetrin hexadecimal digits. Nuk ka rëndësi. Disa adresa. Dhe ne jemi duke kaluar atë adresë in Dhe ne jemi duke shkuar për të vënë një tonë gjë e bajt në atë adresë. Pra, ne jemi duke shkuar për të vënë një tonë gjë bajt brenda këtu. Dhe atëherë ne jemi duke shkuar për të shkruar nga çfarë është kurrë brenda këtu. A ka dikush ndonjë pyetje për këtë? Kush mendon se ky kod do të punojë? Ngritja dorën tuaj nëse ju mendoni se ky kod do të punojnë. Ju duhet të marrë një qëndrim. Dhe kush mendon se ky kod nuk do të funksionojë? Ngritja dorën tuaj. Të gjithë të tjerët duhet të jenë të duke ngritur dorën e tyre. OK. Michael, ku po qëndron? Michael: Unë nuk mund të vendosë. Lloji i në mes. JASON HIRSCHHORN: Ju jeni në mes. Zgjidh një të tillë. Michael: Unë do të keni besim dhe thonë se ajo do të punojë. JASON HIRSCHHORN: OK. Ju do të keni besim dhe thonë se ajo punon? Çfarë ka ndodhur? [VOICES Mbivendosje] JASON HIRSCHHORN: Jo faji seg. Si mund të kontrollojë për të parë nëse dy gjëra janë të barabartë? Dy fotografi janë të barabartë. STUDENT 64: Diff. JASON HIRSCHHORN: Diff. Kontrolle Diff për dallimet ndërmjet dy fotografi, dhe nëse ajo kthehet asgjë, ata janë identike. Dhe nëse kemi të hapur, ne kemi marrë dosjen tonë. Pra, kjo ishte zgjidhja e saktë. Le të shikojmë mbrapa në atë një herë. Ne fakt nuk e bëri edhe duhet të nisja atë. Kjo ndoshta do të duket pak pastër në qoftë se ju nuk e keni vënë diçka të rastit në atje. Pika qenë, ju e nevojshme për të krijuar një hapësirë ​​për të ruajtur diçka nga fread dhe të marrë diçka nga fwrite. Dhe kjo gjë duhej të jetë ose një lokal ndryshueshme në rafte - ju mund të kemi malloc'd një hapësirë. Pra, ne në fakt mund të ketë malloc shkruar këtu, dhe që do të kishte punuar. Dhe atëherë ne do të kemi qenë magazinimin e gjërat tona diku në grumbull. Por kjo është në të vërtetë, me siguri, zgjidhja më elegante. Vetëm të krijojë një hapësirë ​​në rafte sepse të gjitha këto për të shkuar. Unë do të ketë dy komente të tjera. Nëse ju do të marrë kthesë në këtë, dhe pastaj të merrni shënoi në këtë, komentet e mia do të jetë si më poshtë. Këto 1 është këtu, për mua, shikoni si numrat magjike. Kjo 1, në aspektin e fread, ka kuptim. Kjo është numër i gjërave për të lexuar ose shkruar. Por kjo e drejtë këtu duhet ndoshta të jetë diçka tjetër. Pra, çfarë është një zgjidhje? STUDENT 65: Madhësia e bajt. JASON HIRSCHHORN: Ashtu si ajo? STUDENT 65: Madhësia e shkrumb. JASON HIRSCHHORN: Madhësia e shkrumb. Po, bajt nuk është një lloj. Pra, madhësia e punëve char. Ne mund të ketë, në majë të Kodi ynë, # përcaktuar se. E quajtur diçka byte dhe kjo është me të vërtetë një char. Në fakt, një qasje edhe më të mirë mund të ketë qenë kjo - uint. Çdokush e di se çka është? Më vjen keq. Unë kam atë prapa. Prisni, nr. Cila mënyrë e bën atë të shkojnë? Çdokush e di se çka është? Po. STUDENT 67: dashur për të ndihmuar të standartizuar në të gjithë sistemet e gjërave që kanë - si integers të panënshkruara se kemi 8 byte? JASON HIRSCHHORN: Kjo është saktësisht e drejtë. Në makina të ndryshme, madhësinë e një char - nuk zakonisht një char. Chars janë zakonisht një bajt. Por madhësia e llojeve të tjera të të dhënave janë të madhësive të ndryshme në një makinë 32-bit kundrejt një makinë 64-bit. Një uint8_t është gjithmonë 8 bit - gjithmonë një bajt. Dhe unë duhet të përfshijë që standarde header int fotografi. Deri tani, kjo do të kishte qenë ndoshta mënyra më e mirë për të shkruar këtë kod. Kështu që unë të shpëtoj nga numrat magjike. Dhe unë gjithashtu kanë një më logjike shkruani për tampon. Kjo nuk është thjesht një char, kjo është një byte, e cila është ajo që ne presim që ajo të jetë. Dhe deri këtu, ne kemi në të vërtetë qenë pak më të fuqishme. Ne nuk jemi duke e quajtur atë një char, e cila - ndoshta, kush e di - mund të jetë një i ndryshëm Madhësia në makina të ndryshme. Ne jemi të vërtetë duke thënë se kjo është pikërisht një bajt, gjithmonë, pa marrë parasysh çfarë. Dhe nëse ne shohim këtu, ne kemi bërë krah. Uh-oh. Çfarë ka ndodhur? STUDENT 68: Ajo mund të jetë e hapur. JASON HIRSCHHORN: Çfarë? STUDENT 69: A është e? STUDENT 70: Ju nuk e bëri përcaktojnë atë si një lloj. STUDENT 71: Por duhet përcaktohen në standarde. STUDENT 72: Çfarë po ndodh? STUDENT 73: A duhet të përcaktojnë të jenë të gjitha shkronja kapitale? JASON HIRSCHHORN: Pra, nuk është # përcaktuar. Në fakt, në këtë rast, unë jam i do të përdorin typedef. Sepse ne jemi duke e përdorur atë si një lloj në një vend. Pra, në këtë rast, ne fakt duam të typedef si ne jeni shtypjen një tip të ri bajt, dhe është, në thelb, kjo. Kjo është pak më ndryshe se sa # përcaktuar. Dhe tani, kodi ynë works perfectly. Pra, përsëri, # përcaktojë merr diçka, zëvendëson atë kudo me gjë tjetër. Është vetëm një makro - stenografi për të hequr qafe e numrave magjike. Por në këtë rast, sepse ne jemi duke e përdorur atë si një lloj - të drejtë këtu - në mënyrë që të punojnë, ne kemi nevojë të typedef çfarëdo bajt është. Dhe ne jemi duke e përcaktuar atë të drejtë këtu. Kjo nuk është një struct, është e vërtetë vetëm një numër të plotë panënshkruar. Kjo është një bajt të gjatë. Ky kod do të jetë në dispozicion në internet, dhe ju të gjithë duhet të kenë atë të drejtë tani. Pra, ne kemi - përsosur - 13 minuta u largua për të shkuar Problemi mbi vendosur 5. Unë dua të ecin nëpër copy.c së bashku, dhe pastaj ne do të flasim shkurtimisht në lidhje me pjesët e tjera e problemit të vendosur. Pra më lejoni të ndalem copy.c. Dhe gjëja e ftohtë është, ne kemi në të vërtetë tashmë të shkruar një shumë të këtij kodi. Kodi kemi shkruar fjalë për fjalë vetëm doli nga këtu kur isha këtë shkrim të mi. Por kjo është copy.c, formon themelin për dy pjesët e para të problemi vendosur për whodunit.c, e cila ju duhet për të shkruar, dhe resize.c. Recover.c, e cila është e tretë dhe final pjesë e caktuar e problemeve, nuk është bazuar jashtë e kjo skedë. Ju jeni do të duhet për të shkruar këtë dosje, ne ju jap një template për që paraqesë, por ajo nuk ka asgjë të bëjë me copy.c. Por për shkak copy.c është themeli për dy pjesët e para, ne jemi duke shkuar të ecin nëpër atë tani, kështu që ju keni një sens të mirë të atë që bën. Dhe komentet japin një pjesë e saj larg. Ne kemi shkruar tashmë disa prej kësaj. Së pari, ne jemi duke u siguruar kemi tre argumente. Tjetra, ne jemi duke kujtuar emrin e file. Pra, ne u anashkalua këtë hap kur ne e koduar gjë tonë - kur cp tonë. Por këtu, ata janë duke e bërë atë pak më të pastër. Ata janë kontrolluar për të siguruar dy fotografi janë të mira, në shtesë për hapjen e tyre. Ne shkroi tërë këtë kod vetëm tani, kështu që unë jam nuk do të ndalem në këtë kod. Tjetra është disa sende që është specifike për llojet e dosjeve që ne jemi duke përdorur, të cilat janë fotografi bitmap. Fotografi bitmap kanë disa metadata shoqëruara me to. Pra, çifti i parë i bytes të ju tregojnë për dosjen. Ata nuk janë ngjyrat e pixel në atë imazh. Ata të ju tregojnë për dosjen. Dhe në qoftë se ju lexoni me grupin e problemeve, ju do të keni shumë më shumë informacion mbi atë që llojet e strukturave metadata janë të përfshira me bitmaps. Por kjo është arsyeja pse ne e kemi këtë të parë vendosur e - këtij kodi të drejtë këtu. Ne po lexoni metadata - dy copa të metadata - fotografi header dhe info header. Dhe ne po kontrollojnë disa pjesë të tij për të sigurohuni që ajo është një fotografi e vërtetë bitmap para se të vazhdoni. Dhe përsëri, këto janë detaje ne nuk kanë nevojë për të shkuar në tani. Nëse ju lexoni me grupin e problemeve, ju do të kuptoni këto. Histori të gjatë të shkurtër, këto janë vetëm duke thënë, kjo është një fotografi bitmap, dhe duke konfirmuar se. Tjetra, ne jemi me shkrim ato në dosjen jashtë. Ne shohim se këtu. Ne jemi me shkrim për treguesin jashtë. Tjetra, ne jemi përcaktimin mbushje. Pra, përsëri, siç është e veçanta me një fotografi bitmap, disa linja të përfshijnë mbushje ne fund. Dhe në qoftë se ju lexoni me grupin e problemeve, ju do të mësoni më shumë për mbushje. Kjo është formula për të gjetur mbushje. E rëndësishme për të kujtuar - kur ju të ndryshojë madhësinë e një bitmap paraqesë, ndryshimet mbushje. Kur ju të ndryshojë madhësinë e një paraqesë, ndryshimet mbushje. Ajo kurrë nuk do të jetë madhe se 3 - ajo do të jetë 0 deri 3, përfshirëse. Por kur ju të ndryshojë madhësinë e diçka, ndryshimet mbushje. Nëse unë vetëm një pixel në atë rresht, unë nevojë për tre bytes i mbushje, sepse çdo rresht duhet të jetë multiples e katër bytes të gjatë në një skedar bitmap. Por në qoftë se unë të dyfishtë atë, për të shkuar nga një pixel te dy piksel, secila prej të cilave, le të themi, është një bajt, atëherë më duhet dy bytes të mbushje për të bërë që barabartë me katër. Pra, kur Unë të ndryshuar madhësinë e diçka, Unë kam nevojë për të ndryshuar sasinë mbushje e kam. A do të kishte kuptim për të gjithë? Tjetra, ne iterate mbi çdo rresht, ose nëpër të gjitha rreshtave. Dhe pastaj ne iterate përmes çdo kolonë në çdo rresht. Ne jemi duke e trajtuar këtë si bitmap një rrjet, ashtu si e kemi trajtuar bordit në 15. Ashtu si kemi trajtuar tulla kur ne të shtypura e tyre në ekran. Një rrjet i rreshtave dhe kolonave. Pastaj - e pamë këtë. Ne fakt koduar vetëm këtë. Ne krijuar një ruajtje të përkohshme. Ne lexojmë në atje, dhe pastaj kemi shkruar atë. Kjo është pikërisht ajo që ne vetëm e bëri. Tjetra, sepse ka thënë: çdo linjë përfundon në disa mbushje, ne kaloni mbi atë mbushje - mbushje e vjetër. Dhe atëherë ne shtoni atë. Në këtë rast, ne jemi duke krijuar të njëjtën fotografi saktë. Ne jemi vetëm kopjimi atë. Pra, kjo linjë është lloj i pa kuptim. Ne mund të fjalë për fjalë vetëm vënë mbushje in Por në qoftë se ju të ndryshojë madhësinë e file, nuk ju ende i doni këtë linjë? Pra, në qoftë se ne të ndryshuar madhësinë e një file, nuk kemi ende duan të kaloni mbi mbushje të vjetër? STUDENT 74: Po. JASON HIRSCHHORN: Pra, ne bëjmë. Me qenë se ky, përsëri, merret me burim file. Ne nuk e kujdesit për mbushje nga burim file. Ne duam të shkojnë në vijën e ardhshme. Por ne nuk e vënë thjesht mbrapa shuma e vjetër e mbushje. Ne kemi nevojë për të vënë përsëri Shuma e re e mbushje. Pra, kur ne jemi duke ndryshuar madhësinë e një fotografi, ne ende duan të kaloni mbi mbushje në dosjen e vjetër - ajo që ne jemi duke lexuar në nga. Por ajo që ne jemi me shkrim për të, ne jemi duke shkuar të duhet për të vënë përsëri një e ndryshme Numri i mbushje që ne kemi vendosur. Po. STUDENT 75: Rendi i atyre dy Linjat nuk ka rëndësi, apo jo? Sepse ju jeni trajtimin e Fotografi të ndryshme. JASON HIRSCHHORN: Pikërisht. Urdhri i këtyre dy linjave nuk ka rëndësi. Ne shkruaj këtë linjë. Kjo është këtu për dosjen ne jemi me shkrim për të. Kjo është e rëndësishme, kështu që ne të merrni shumë të drejtë e mbushje. Kjo ka të bëjë me në dosjen. Ne duam të kaloni drejtën mbi mbushje. Ne nuk duan të lexojnë - në qoftë se ne jemi duke lexuar një bajt në një kohë, ne nuk e kujdesit për ato bytes mbushje. Ne duam për të kaluar në rreshtin tjetër. Së fundi ashtu si Lucy dha për ne, ne të mbyllur dosjet dhe të kthehen 0. Pra, kjo është copy.c. Dhe ne fakt ka shkruar - kemi kaluar shumicën e seksion i këtij shkrimi, në thelb. Ju e bëri këtë. Kështu që shpresojmë se ju keni një kuptim të mirë të asaj që po ndodh këtu. Ndryshimi i madh, sinqerisht, është vetëm kjo pjesë e parë që merret me veçantitë e dosjeve bitmap. Pra, unë kam si rrëshqitje tim të ardhshëm, çfarë ne duhet të bëjmë? E pra, le të mendojnë për roman policor. Dhe për dikë që të lexoni me anë të problemi vendosur, ajo që bëjmë ne duhet të bëni në roman policor? Thjesht. Aleja. Aleja: A mund të merrni pjesë e çdo piksel që tregon kuqe. Dhe pastaj - lloj? JASON HIRSCHHORN: OK. Pra, të marrë nga pjesa e secilit pixel që tregon kuqe. Kjo është e ngushtë, por jo të gjithë atë. STUDENT 76: E pra, nuk ka mënyra të ndryshme për të bërë atë. JASON HIRSCHHORN: OK. Më jepni një mënyrë. STUDENT 76: Merrni nga të gjitha kuqe e, dhe pastaj theksojnë blu dhe jeshile. JASON HIRSCHHORN: OK. Pra, duke pasur parasysh të dyja këto mënyra - kjo tingëllon si ne t'i jepte një pixel, ajo ka një nivel të kuqe, blu, dhe jeshile. Ne duam të ndryshojmë nivelet relative të e kuqe, blu, dhe jeshile, varësisht në atë pixel. Ku në këtë kod duhet të ndryshojmë relative e kuqe, blu, dhe jeshile nivelet e një pixel dhënë. Pasi ne kemi lexuar atë - para se të shkruar atë? Me jep numrin e linjës. STUDENTËT E SHUMËFISHTA: 83. JASON HIRSCHHORN: 83. Pra, të drejtë këtu. Për roman policor, kodi ju duhet të shkruaj të gjithë duhet të shkojnë drejtë atje. Dhe kjo është vetëm kodi ju duhet të shkruani. Sepse, siç kemi dëgjuar, të gjithë ju duhet të bëni është të ndryshojë këto blu relative, Nivelet e kuqe, jeshile dhe nga çdo piksel. Ju keni lexuar atë në, dhe tani ju jeni duke shkuar për të shkruar atë. Si mund të merrni - nëse kam këtë gjë quajtur trefishtë, të drejtë këtu, dhe kjo është e lloji RGBTRIPLE - mirë, në qoftë se kemi shikuar në bmp.h, çfarë është RGBTRIPLE? STUDENT 77: Kjo është një struct. JASON HIRSCHHORN: RGBTRIPLE a është struct. Ne e shohim këtë të drejtë këtu. Dhe kështu nëse kam kërkuar për të hyrë, të themi, Niveli i kuq i struct, si mund të të hyrë në nivelin e kuqe e këtij struct? [KLASA pershperitur] STUDENT 78: RGBTRIPLE.rgbtred? JASON HIRSCHHORN: A është e saktë? STUDENT 79: Ajo duhet të jetë e trefishtë dot, në vend të RGBTRIPLE dot? JASON HIRSCHHORN: Triple. Triple është variabël lokale, kështu këtu, nuk ka asnjë pointers këtu. Pra, ne vetëm përdorni dot simbol. Kjo do të më jepni nivelin e kuqe. Nëse unë dua të ndryshojë atë, unë vetëm vënë është e barabartë me diçka të ndryshme. Pra, përsëri, kjo linjë e kodit accesses ky variabël brenda këtij struct, dhe ne mund të vënë atë në diçka të re. Pra për roman policor, përsëri, kjo është, në thelb, ajo që ne duhet të bëjmë. Shumë e thjeshtë. Vetëm të ndryshojë disa nivele relative, dhe ky është vendi ku që kodi shkon. Resize, nga ana tjetër, është pak e komplikuar. Në fakt, resize është ndoshta pjesë e mprehtë e këtij problemi të vendosur. Ne kemi tre minuta për të shkuar mbi të. Por përsëri, ne kemi shkruar tashmë më të madhe të këtij kodi, kështu që ne duhet të jetë shumë e njohur. Cilat janë disa gjëra që ne duam të bëjmë në resize, në qoftë se ju keni lexuar mbi Problemi i vendosur? Nëse ju jepni atyre për mua, ne mund të flasim për to. Cilat janë disa gjëra që ne duam të bëjmë? STUDENT 80: vertikalisht - kështu që ju duhet të ndrysho atë horizontalisht, por vertikalisht resize atë si të mirë? JASON HIRSCHHORN: Pra, nëse ne jemi duke dhënë një pixel, dhe ne duam të ndrysho atë me një faktor të dy, ajo tani duhet të jetë ndryshohet madhësia horizontalisht dhe ridimensionuar vertikalisht. A ka kjo kuptim? Po. Pra, kjo është ndoshta sfida më e madhe. Dhe ne do të flasim për këtë në një sec. Po. STUDENT 81: Mënyra kam menduar për atë u ju nevojitet print it out - JASON HIRSCHHORN: Prisni. Mos na tregoni se çfarë keni bërë. Ne do të flasim në logjikë. STUDENT 81: OK. Cila ishte pyetja? JASON HIRSCHHORN: Ju vetëm ngriti dorën tuaj. Nuk kishte asnjë pyetje. Më lejoni të paraqesë atë. Më lejoni vetëm të diskutuar këtë kohë të shkurtër. Pra, ne kemi një pixel, ne duam të përsëris atë, si horizontalisht dhe vertikalisht. Pra, në mënyrë ideale ajo që ne bëjmë këtu është, që ne lexoni në piksel tonë, kemi shkruar atë megjithatë shumë herë. Por pastaj ne kemi mashtrim tonë këtu, sepse atëherë ne duam të Kalo te linjë tjetër dhe shkruani atë në fillimi i linjë tjetër. Pra, nëse ne duam të replikuar dyja horizontalisht dhe vertikalisht, ajo që është një mënyrë e mirë për të bërë këtë - e mirë edhe pse për të bërë këtë? Pra, ne nuk kemi nevojë për të kërkuar vazhdimisht rreth dosjen tonë për të vendosur gjërat. Kjo pyetje nuk mund të ketë kishte kuptim, por unë mendoj se një përgjigjen me të do të ndihmojë. STUDENT 82: Krijoni një koleksion? JASON HIRSCHHORN: Pra, le të mendojmë e çdo fotografi si një rresht. Le të mendojnë në drejtim të rreshtave. Në qoftë se ne kemi rresht tonë të parë nga të vogla tonë foto, ne mund të bëjë atë rresht në një rresht të madhe nga një foto të madhe, dhe pastaj të përsëris atë rresht megjithatë shumë herë ajo ka nevojë që të përsëriten, në vend se do piksel nga pixel, e cila merr konfuze kur që kanë të bëjnë me fotografi. Sepse nëse do të kishim - Nuk kam më të hapësirës. Nëse kjo është fotografi tonë, dhe ne kemi se një pixel atje, dhe ne duam të vënë atë drejtë atje, ne ende kemi disa gjëra që ka nevojë për të shkuar atje, kur ne jemi shkrim dhe krijimin skedë tonë të ri - fotografi jonë që është dy herë më i madh. Por është e vërtetë e vështirë me funksione fotografi të kaloni rreth në linjat e reja si kjo, dhe pastaj të kthehemi këtu dhe të vënë gjërat në atje. Është pothuajse e pamundur për të bërë diçka si kjo, në qoftë se ka kuptim. Pra, nëse ne mendojmë në aspektin e rreshtave, ne mund të marrë rresht tonë, dhe pastaj e vënë atë - replikuar rreshtave vertikalisht. Dhe kjo është se si të merremi me Resizing vertikalisht dhe jo horizontalisht. Kjo ishte lloj i shpejtë, dhe pak konfuze. Për fat të keq koha jonë është lart. Unë do të qëndrojë jashtë për ato prej jush këtu të cilët kanë pyetje në lidhje vendosur problemi, duke përfshirë edhe të shërohen. Pra, le ta shtyjë për tani. Dhe përsëri, në qoftë se ju keni ndonjë pyetje, ne mund të bisedojnë jashtë.