[Powered by Google Translate] [5. HLUTI: minna þægilegt] [Nate Hardison, Harvard University] [Þetta er CS50.] [CS50.TV] Svo velkomin aftur, krakkar. Velkomin á kafla 5. Á þessum tímapunkti, hafa lokið quiz 0 og hafa séð hvernig þú hefur gert, vonandi líður þér mjög vel því að ég var mjög hrifinn af frammistöðu í þessum kafla. Fyrir online áhorfendur okkar, höfum við fengið nokkrar spurningar Um síðustu tvö vandamál á vandamál setja - eða á prófið frekar. Þannig að við erum að fara að fara yfir þá sem í raun fljótt svo að allir sjái hvað gerðist og hvernig á að fara í gegnum the raunverulegur lausn frekar en bara að skoða lausn sjálft. Við ætlum að fara yfir síðustu tveimur vandamálum mjög fljótt, 32 og 33. Bara aftur, svo að online áhorfendur geta séð þetta. Ef þú kveikir á vanda þínum 32, sem er á bls 13, 13 af 16, vandamál 32 er allt um skiptasamninga. Það var allt um að skipta tvær heiltölur. Það er vandamálið sem við höfðum farið yfir nokkrum sinnum í fyrirlestrinum. Og hér, það sem við vorum að biðja þig að gera er a fljótur minni ummerki. Til að fylla í gildi á breytum eins og þeir eru á stafla sem kóðinn fer í gegnum þetta skipti virka. Einkum það sem við erum að horfa á - Ég er að fara að setja þetta iPad niður - einkum það sem við erum að horfa á er þetta lína voru 6 rétt hér. Og það er númer 6 fyrir aðeins contiguity við fyrri vandamál. Það sem við viljum gera er að sýna eða merkja stöðu minni eins og það er á þeim tíma þegar við framkvæmum þessa línu númer 6, sem er í raun að fara aftur úr virka skipti okkar hérna. Ef við skruna niður hér, sáum við að heimilisföng allt í minni var veitt fyrir okkur. Þetta er mjög lykill, við munum koma aftur til það á bara smástund. Og svo hérna neðst, við höfðum smá minni skýringarmynd sem við erum að fara að vísa til. Ég hef reyndar gert þetta út á iPad minn. Þannig að ég ætla að skipta fram og til baka á milli iPad og þennan kóða bara til tilvísunar. Við skulum byrja. Í fyrsta lagi skulum við leggja áherslu á fyrstu tveimur línum af helstu hérna. Til að byrja, við erum að fara að frumstilla X í 1 og y í 2. Þannig að við höfum tvær heiltölu breytur, þá eru þeir báðir að fara að setja á mánudaginn. Við ætlum að setja upp 1 og 2 í þeim. Svo ef ég fletta yfir á iPad minn, vonandi, við skulum sjá - Apple TV speglun, og svona. Allt í lagi. Svo ef ég fletta yfir á iPad minn, Ég vil að frumstilla X að 1 og y í 2. Við gerum það einfaldlega með því að skrifa 1 í reitinn merkt X og 2 í kassann merktur y. Nokkuð einfalt. Svo nú skulum við fara aftur í fartölvu, sjá hvað gerist næst. Svo er þetta næsta lína þar sem hlutirnir fá erfiður. Við förum heimilisfang x og veffang y sem breytur a og b í skipti virka. Heimilisfang í x og heimilisfang y eru hlutir sem við getum ekki reikna án þess að vísa til þessara bullet punkta rétt hérna. Og sem betur fer, segja fyrstu tvær bullet stig okkur nákvæmlega hvað svörin eru. Heimilisfang x í minni er 10, og heimilisfang y í minni er 14. Þeir eru þau gildi sem fá liðin í A og B upp efst í aðgerð skipti okkar. Svo aftur, skipta aftur á myndinni okkar, get ég skrifað 10 í og 14 í b. Nú, þetta lið er hvar við getum haldið áfram með skipti. Svo snúa aftur til the laptop aftur, sjáum við að hvernig skipti virkar er ég fyrst dereference a og geyma niðurstaðan í tmp. Svo segir dereference rekstraraðila, "Hey. Treat innihald breytu a sem heimilisfang. Fara til hvað er geymt í þeim tölu, og hlaða hana. " Það sem þú hlaða úr breytu er að fara að geyma í breytu tmp okkar. Ósvífni aftur til iPad. Ef við förum að taka á 10, við vitum að tölu 10 er varible x vegna þess að við vorum sagt benda bullet okkar að heimilisfang x í minni er 10. Þannig að við getum farið þangað, fá verðmæti það, sem er 1, eins og við sjáum á iPad okkar og hlaða það inn í tmp. Aftur, þetta er ekki endanleg innihald. Við erum að fara að ganga í gegnum og við munum komast að endanlegri stöðu okkar áætlunarinnar í árslok. En núna höfum við gildið 1 geymd í tmp. Og það er a fljótur spurning hérna. [Alexander] er dereference stjórnandi - það er bara Star rétt framan við breytu? >> Já. Svo dereference rekstraraðila, eins og við selbiti aftur fartölvu okkar aftur, er þetta stjarna rétt fyrir framan. Í þeim skilningi er það - þú andstæða það með margföldun rekstraraðila sem krefst tvennt, en dereference rekstraraðila er unary rekstraraðila. Bara beita eitt gildi í stað þess að tvöfaldur rekstraraðila, þar sem þú sækir um til tveggja mismunandi gildum. Svo það er það sem gerist í þessari línu. Við hlaðinn gildið 1 og geyma það í tímabundna heiltölubreytu okkar. Í næstu línu, geymum við innihald b í - eða, frekar, geymum við innihald sem B vísar til í stað þar sem bendir til. Ef við greinum þetta frá hægri til vinstri, við erum að fara að dereference b, við erum að fara að takast á 14, við erum að fara að grípa heiltölu sem er þar, og þá ætlum við að fara á heimilisfang 10, og við erum að fara að kasta niðurstöðu dereference okkar b í því rými. Ósvífni aftur iPad okkar, þar sem við getur gert þetta aðeins meira steypu, það gæti hjálpað ef ég skrifa tölur á öllum heimilisföngum hér. Þannig að við vitum að á y, við erum á heimilisfang 14, x er í tölu 10. Þegar við byrjum á b, við dereference b, við erum að fara að grípa gildi 2. Við ætlum að grípa þetta gildi vegna þess að það er gildi sem býr á heimilisfang 14. Og við erum að fara að setja það inn breytu sem býr á heimilisfang 10, sem er rétt þar, sem svarar til breytu X okkar. Þannig að við getum gera a lítill hluti af skrifa of mikið hérna þar við að losna við 1 okkar og stað við að skrifa 2. Svo er allt vel og gott í heiminum, jafnvel þótt við höfum plága x nú. Við höfum geymt gamla gildið x er á breytilegum tmp okkar. Þannig að við getum lokið skipti við næstu línu. Ósvífni aftur laptop okkar. Nú er allt sem á eftir að taka efni úr tímabundið heiltölubreytu okkar og geyma þá í breytu sem býr á heimilisfang sem B er að halda. Þannig að við erum að fara að í raun dereference b til að fá aðgang til að breyta sem er á netfangið sem B hefur í það, og við erum að fara að efni gildi að tmp er að halda í hana. Ósvífni aftur iPad aftur. Ég get eytt þessu gildi hér, 2, og í staðinn munum við afrita 1 rétt inn í það. Þá næsta lína sem keyrir, auðvitað - ef við flettir aftur á fartölvu - er þetta lið 6, sem er að benda á þar sem við vildum að hafa skýringarmynd okkar alveg fyllt út. Svo snúa aftur til iPad aftur, bara svo þú getur séð lokið skýringarmynd þú getur séð að við höfum 10 í, 14 í b, a 1 í tmp, a 2 í x, og 1 í y. Eru einhverjar spurningar um þetta? Er þetta gert meira vit, hafa gengið í gegnum það? Gera minna vit? Vonandi ekki. Allt í lagi. Ábendingar eru mjög erfiður efni. Einn af strákunum sem við vinnum með er mjög algengt að segja: "Til að skilja ábendingum, verður þú fyrst að skilja ábendingum." Sem ég held að sé mjög satt. Það þýðir að taka nokkurn tíma að venjast henni. Teikning fullt af myndum, er að teikna fullt af skýringarmyndum minni eins og þessi mjög gagnlegt, og eftir að ganga í gegnum dæmi eftir dæmi eftir dæmi, það mun byrja að gera smá meira vit og smá meira vit og smá meira vit. Að lokum, einn daginn munt þú hafa allt alveg tökum. Einhverjar spurningar áður en við fara í næstu vandamáli? Allt í lagi. Svo flettir aftur í fartölvu. Næsta vandamál sem við höfum er vandamál númer 33 á skrá I / O. Þysja inn á þessu smá. Vandamál 33 - Já? [Daniel] Ég var bara fljótur spurning. Þessi stjarna, eða stjörnu, það heitir dereferencing þegar þú notar stjörnu áður. Hvað er það kallað þegar þú ert að nota merkið áður? >> Er The merkið fyrir vistfang-af rekstraraðila. Svo skulum fletta aftur upp. Oops. Ég er með stillt á zoom þannig að ég get eiginlega ekki fletta. Ef við lítum á þennan kóða virkilega hratt hérna, aftur, sama gerast. Ef við lítum á þennan kóða hér, á þessari línu þar sem við að hringja til að skipta, the merkið er bara að segja "fá heimilisfang þar sem breyta stöðugur x." Þegar þýðanda þinn safnar kóðann þinn, það hefur í raun líkamlega merkja út stað í minni fyrir allar breytur til að lifa. Og hvað með það að þýðandinn getur þá gert þegar það er saman allt, það veit, "Ó, ég setti x við heimilisfang 10. Ég setti y í tölu 14." Það getur þá fylla í þessi gildi fyrir þig. Svo þú getur þá - það er þá fara framhjá það á og fara & Y í eins og heilbrigður. Þessir krakkar fá heimilisfang, en einnig, þegar þú framhjá þeim í skipti virka, Þessi tegund upplýsinga, þetta int * hérna, segir þýðandinn, "Allt í lagi, við erum að fara að túlka þetta netfang sem heimilisfang heiltala breyta." Sem heimilisfang heiltala, sem er annað heimilisfang staf breytu vegna þess að int tekur upp á 32-bita vél, tekur upp 4 bæti af plássi, en staf tekur aðeins upp 1 bæti af plássi. Svo það er mikilvægt að vita líka hvað er - hvað lifir, hvaða tegund af gildi býr á heimilisfang sem fékk liðið inn Eða það heimilisfang sem þú ert að fást við. Þannig þú veist hversu margir bæti af upplýsingum í raun hlaða úr RAM. Og þá, já, þetta dereference rekstraraðila, eins og þú værir að spyrja, fer og notar upplýsingar á tilteknu heimilisfang. Svo segir það, með þessa breytu hér meðhöndla innihald sem heimilisfang, fara til heimilisfang, og draga út, hlaða í örgjörva, hlaða inn skrá raunverulegt gildi eða innihald sem búa á þeim tölu. Allir fleiri spurningar? Þetta eru góðar spurningar. Það er a einhver fjöldi af nýjum hugtökum líka. Það er líka svona angurvær, sjá og og * á mismunandi stöðum. Allt í lagi. Svo aftur til vandamál 33, skrá I / O. Þetta var eitt af þeim vandamálum sem ég held að nokkrir hlutir gerst. Einn, er það nokkuð nýtt umræðuefni. Það var kynnt fljótlega fyrir prófið og þá held ég að það væri góður af eins og einn af þeim orð vandamál í stærðfræði þar sem þeir gefa þér mikið af upplýsingum, en þú í raun ekki enda ekki upp að þurfa að nota tonn af því. Fyrsti hluti af þessu vandamáli er að lýsa hvað CSV skrá er. Nú, CSV skrá, samkvæmt lýsingu, er kommu-aðskilin gildi skrá. Ástæðan að þetta eru yfirleitt áhugavert, og ástæðan sem þú notar alltaf þá, er, því, hversu margir af þú alltaf notað efni eins og Excel? Mynd af þú hefur sennilega, eða vilja nota á einhverjum tímapunkti í lífi þínu. Þú munt nota eitthvað eins og Excel. Til þess að fá gögn úr Excel töflureikni eða gera hvers konar vinnslu með það, ef þú vildir skrifa C forrit eða Python program, Java forrit, að takast á við þau gögn sem þú hefur vistað í það, einn af algengustu leiðir til að fá það út í CSV skrá. Og þú getur opna Excel og þegar þú ferð í 'Save As' umræðu, er hægt að fá út raunverulegt CSV skrá. Handy að vita hvernig á að takast á við þessa hluti. The vegur það verksmiðja er að það er svipað - ég meina, er það fyrst og fremst herma töflureikni, þar sem við sjáum hér í mjög vinstri-mest stykki, við höfum öll síðustu nöfn. Þannig að við höfum Malan, þá Hardison, og þá Bowden, MacWilliam, og þá Chan. Öll síðustu nöfn. Og þá skilur kommu síðustu nöfn frá fyrstu nöfn. David, Nate, Rob, Tommy, og Zamyla. Ég blanda alltaf upp Robby og Tom. Og svo, að lokum, þriðja dálki er netföng. Þegar þú skilur að, the hvíla af the program er nokkuð einfalt að framkvæma. Það sem við höfum gert til þess að líkja eftir þessari sömu uppbyggingu í C program okkar er við höfum notað uppbyggingu. Við munum byrja að spila með þetta aðeins meira eins og heilbrigður. Við sáum þá í fyrsta smá í setja vandamál 3, þegar við vorum að fást við orðabækur. En þetta starfsfólk strúktúr geymir föðurnafn, fyrsta nafn og tölvupóst. Rétt eins og CSV skrá okkar var að geyma. Þannig að þetta er bara að breyta úr einu sniði í annað. Við verðum að breyta, í þessu tilfelli, að starfsfólk strúktúr í línu, kommu-aðskilin lína, bara svona. Er það skynsamleg? Þið hafið öll tekið próf, svo ég ímynda mér að þú hefur að minnsta kosti haft nokkurn tíma til að hugsa um þetta. Í ráða virka, vandamálið biður okkur að taka á - we'll zoom í á þessum smá - taka í starfsfólk uppbyggingu, starfsfólk strúktúrinn, með nafn, og bæta innihald hennar til staff.csv skrá okkar. Það kemur í ljós að þetta er frekar einfalt í notkun. Við munum konar leika í kring með þessar aðgerðir svolítið meira í dag. En í þessu tilviki er fprintf aðgerð er í raun lykillinn. Svo með fprintf, getum við prentað, eins og þið hafið verið að nota printf þetta allt tíma. Þú getur printf lína í skrá. Svo í stað þess að bara að gera venjulega printf símtal þar sem þú gefa það snið band og þá skipta allar breytur með eftirfarandi rökum, með fprintf, fyrstu rök þín er staðinn skrána sem þú vilt að skrifa. Ef við vorum að horfa á þetta í tækið, td maður fprintf, getum við séð muninn á printf og fprintf. Ég súmma hérna svolítið. Svo með printf, gefum það snið band, og þá síðari rök eru allar breytur fyrir skipti eða útskipting í band snið okkar. Þar með fprintf, fyrsta rifrildi er örugglega þessi skrá * sem kallast á. Flytja aftur hérna að ráða okkar, Við höfum nú þegar fengið skrá * Stream okkar opnaði fyrir okkur. Það er það sem þetta fyrsta línan er, það opnar staff.csv skrá, það opnast það í bæta ham, og allt sem er eftir fyrir okkur að gera er skrifa starfsfólk uppbyggingu á skrá. Og við skulum sjá, ég vil að nota iPad? Ég nota iPad. Við höfum tóm - Við skulum setja þetta á borðið svo ég geti skrifað svolítið betur - ógilt ráða og það tekur í einu rifrildi, með starfsfólk uppbyggingu heitir s. Got axlabönd okkar, höfum við fengið skrá * okkar heitir skrá, við höfum fopen línu okkar gefið okkur, og ég ætla bara að skrifa það eins og punkta þar sem það er nú þegar í pedia. Og þá á næstu línu okkar, við erum að fara að hringja til fprintf og við ætlum að fara í skrána sem við viljum prenta í, og þá sniði band okkar, sem - Ég læt ykkur segja mér hvað það lítur út. Hvað um þig, Stella? Veistu hvað fyrsta hluta sniðstreng lítur út? [Stella] Ég er ekki viss. >> Feel frjáls til að spyrja Jimmy. Veistu, Jimmy? [Jimmy] Væri bara síðast? Ég veit ekki. Ég er ekki alveg viss. >> Lagi. Hvernig væri, var einhver að fá þetta rétt á prófinu? Nei Allt í lagi. Það kemur í ljós að hér er allt sem við þurfum að gera að við viljum alla hluta uppbyggingu starfsfólk okkar að prenta út sem streng í skránni okkar. Við notum bara að skipta band staf þrjár mismunandi sinnum vegna þess að við höfum föðurnafn eftir kommu, þá fyrsta nafn á eftir kommu, og þá loks netfang sem er fylgt - sem er ekki mátun á skjánum mínum - en það er fylgt eftir newline staf. Þannig að ég ætla að skrifa það bara niður þarna. Og þá eftirfarandi sniði band okkar, við höfum bara punktbreytingar, sem við opna með punktur tákn sem við sáum í mengi vandamál 3. Við getum notað s.last, s.first og s.email að skipta á þeim þremur gildum inn band snið okkar. Svo hvernig did það fara? Skynsamleg? Já? Nei? Hugsanlega? Allt í lagi. Endanleg hlutur sem við gerum eftir að við höfum prentað og eftir að við höfum opnað skrá okkar: þegar við höfum opnað skrá, höfum við alltaf að muna eftir að loka henni. Því annars munum við á endanum leka minni, nota upp skrá descriptors. Svo til að loka því, sem virka ekki notum við? Daniel? [Daniel] fclose? >> Fclose, nákvæmlega. Svo síðasta hluti af þessu vandamáli var að rétt loka skrá, með fclose virka, sem lítur út alveg eins og þessi. Ekki of brjálaður. Cool. Svo er það vandamál 33 á prófinu. Við verðum örugglega fleiri skrá I / O koma upp. Við munum gera svolítið meira í fyrirlestri í dag, eða í kafla í dag, því það er það sem er að fara að mynda megnið af þessum komandi pset. Við skulum fara frá spurningakeppni á þessum tímapunkti. Já? [Charlotte]] hverju fclose (skrá) í stað fclose (staff.csv)? >> Ah. Vegna þess að það kemur í ljós að - svo spurningin, hver er a mikill einn, er hvers vegna, þegar við skrifa fclose, við erum að skrifa fclose (skrá) stjörnu breytu í stað þess að skrá nafn, staff.csv? Er það rétt? Já. Svo skulum taka a útlit. Ef ég skipti aftur til minn laptop, og við skulum líta á fclose virka. Svo lokar fclose virka læk og það tekur í bendi á lækinn, sem við viljum að loka, eins og til the raunverulegur skrá nafn sem við viljum loka. Og þetta er vegna þess að á bak við tjöldin, þegar þú hringir á fopen, þegar þú opnar skrá, þú ert í raun að úthluta minni til að geyma upplýsingar um skrá. Svo þú hefur skrá músina sem hefur upplýsingar um skrá, eins og það er opið, stærð hennar, þar sem þú ert nú í skránni, svo að þú getur gert að lesa og skrifa símtöl til viðkomandi stað í skránni. Þú endar loka músina í stað þess að loka skrá nafn. Já? [Daniel] Svo til að nota ráða, myndir þú segja - hvernig er það fá notandi inntak? Er fprintf athöfn eins GetString í þeim skilningi að það verður bara að bíða eftir notandi inntak og biðja þig um að slá þetta - eða bíða eftir þér að slá þetta þrennt í? Eða þarft þú að nota eitthvað til að hrinda í framkvæmd ráða? >> Já. Þannig að við erum ekki - spurningin var, hvernig fáum við notandi inntak í því skyni að hrinda í framkvæmd ráða? Og það sem við höfum hér er sem hringir á leigu, liðið í þessum starfsfólk strúktúr með öll gögn sem eru geymd í strúktúr þegar. Svo fprintf geta bara skrifa þessi gögn beint til the skrá. Það er enginn að bíða eftir notandi inntak. Notandinn er þegar gefið inntak með almennilega að setja það í þessa starfsfólks strúktúr. Og það, auðvitað, myndi brjóta ef eitthvað af þessum ábendingum var null, svo við að fletta aftur upp hér og við lítum á strúktúr okkar. Við höfum band síðast, band fyrst, band tölvupósti. Við vitum nú að allir af þeim raunverulega, undir hetta, eru char breytur *. Það mega eða mega ekki vera að benda á að null. Þau kunna að benda til minni á hrúga, kannski minni á mánudaginn. Við í raun ekki vita, en ef einhver af þessum ábendingum er null eða ógilt, að það verður örugglega hrun leigja virka okkar. Það var eitthvað sem var eins konar utan gildissviðs prófið. Við erum ekki að hafa áhyggjur óður í það. Frábært. Allt í lagi. Svo áhrifamikill á frá spurningakeppni. Við skulum loka þessa dagana, og við erum að fara að horfa á pset 4. Svo ef þið líta á pset sérstakur, þegar þú getur fengið aðgang að henni, cs50.net/quizzes, við erum að fara að fara í gegnum nokkrar af þeim kafla vandamál í dag. Ég er að fletta niður - section spurningum hefst þriðja síðu á pset sérstakur. Og fyrsti hluti biður þig að fara og horfa á stutt á Áframsendi og rör. Hver var svona flott stutt, sýnir þér nýja, kaldur stjórn lína bragðarefur sem þú getur notað. Og svo höfum við fengið nokkrar spurningar fyrir þig eins og heilbrigður. Þessi fyrsta spurning um læki, sem printf skrifar sjálfgefið, við snert konar á réttlátur a lítill hluti í smá stund síðan. Þetta fprintf að við vorum bara að ræða tekur á * Skrá Stream og rök hennar. fclose tekur í * skrá straumi eins og heilbrigður, og skilagildi fopen gefur þér * Skrá Stream eins og heilbrigður. Ástæðan sem við höfum ekki séð þá áður þegar við höfum fjallað printf er vegna printf hefur sjálfgefið á. Og sjálfgefið straum sem það skrifar þú munt finna út óður í stuttu máli. Svo ákveðið að taka a líta á það. Í kafla í dag, við erum að fara að tala svolítið um gdb, þar sem fleiri þekki þú ert með það, því meira starf sem þú færð með það, því betra fær þú verður að raunverulega veiði niður galla í eigin kóðann þinn. Þetta hraða ferli kembiforrit upp ógurlega. Svo með því að nota printf, í hvert skipti sem þú gerir það sem þú ert að laun númerið þitt, þú ert að keyra það aftur, stundum þarf að færa printf hringja í kring, athugasemd út kóða, það tekur bara smá stund. Markmið okkar er að reyna að sannfæra þig um að við GDB, getur þú í raun printf eitthvað á hverjum stað í kóðann þinn og þú ert aldrei að laun það. Þú þarft aldrei að byrja og halda giska hvar printf næst. The fyrstur hlutur til gera er að afrita þessa línu og fá kafla númer burt af vefnum. Ég afrita þessa línu af kóða sem segir, "wget ​​http://cdn.cs50.net". Ég ætla að herma eftir. Ég ætla að fara yfir til tæki minn, zoom út svo þú getur séð hvað ég er að gera, líma það þar, og þegar ég lenti inn, þetta wget skipun bókstaflega er vefur fá. Það er að fara að rífa niður þessa skrá burt af Netinu, og það er að fara að vista það í núverandi möppu. Nú ef ég lista núverandi möppu minn er hægt að sjá að ég hef fengið þetta section5.zip skrá rétt þar. The leiðin til að takast á við þessi strákur er að renna niður hana, sem þú getur gert í the stjórn lína, eins og þetta. Section5.zip. Það mun renna niður hana, búa til möppu fyrir mig, blása allt innihald, setja þá í þar. Svo nú get ég farið inn í hluta minn 5 möppu með CD stjórn. Hreinsa skjáinn með skýr. Svo hreinsa skjáinn. Nú hef ég fengið gott hreint flugstöðinni til að takast á við. Nú ef ég lista allar skrár sem ég sé í þessari skrá, þú sérð að ég hef fengið fjóra skrár: buggy1, buggy2, buggy3 og buggy4. Ég hef líka fengið samsvarandi. C skrá. Við erum ekki að fara að horfa á. C skrá fyrir núna. Í staðinn erum við að fara að nota þá þegar við opna gdb. Við höfum haldið þeim í kring þannig að við höfum aðgang að í raun uppspretta merkjamál þegar við erum að nota GDB, en markmið þessa hluta kafla er að tinker kring með gdb og sjá hvernig við getum notað það til að finna út hvað er að gerast rangt við hvert af þessum fjórum buggy programs. Þannig að við erum bara að fara í kring í herberginu mjög fljótt, og ég ætla að biðja einhvern til að keyra einn af buggy forritum, og þá munum við fara sem hópur með gdb, og við munum sjá hvað við getum gert til að laga þetta forrit, eða að minnsta kosti að finna hvað er að gerast rangt í hvert þeirra. Við skulum byrja hérna með Daníel. Ætlarðu að hlaupa buggy1? Við skulum sjá hvað gerist. [Daniel] Það segir það er forrit kenna. >> Já. Einmitt. Svo ef ég keyrt buggy1, fæ ég seg kenna. Á þessum tímapunkti, ég gæti farið og opna buggy1.c, reyna að reikna út hvað er að gerast rangt, en einn af the obnoxious hluti um þessa seg kenna villa er að það er ekki að segja þér á hvaða línu af the program það í raun fór úrskeiðis og braut. Þú hefur konar til að líta á kóðann og reikna út með ágiskun og stöðva eða printf til að sjá hvað er að fara úrskeiðis. Einn af the kælir hlutur óður í gdb er að það er mjög, mjög auðvelt að reikna út línu þar sem program hrun. Það er alveg þess virði að nota það, jafnvel þótt aðeins fyrir það. Svo til að ræsa upp GDB, tegund I gdb, og þá skal ég gefa honum leið til executable sem mig langar til að hlaupa. Hér er ég að slá gdb ./buggy1. Hit inn. Gefur mér allar þessar upplýsingar um höfundarrétt, og niður hér þú munt sjá þessa línu sem segir "Reading tákn í / home / jharvard/section5/buggy1. " Og ef allt gengur vel, munt þú sjá að það prenta út skilaboð sem lítur svona út. Það verður að lesa tákn, verður það að segja "ég er að lesa tákn úr skrá executable þínum" og þá mun það hafa þetta "gert" skilaboð hérna. Ef þú sérð eitthvað annað afbrigði af þessu, eða þú sérð að það gat ekki fundið tákn eða eitthvað svoleiðis, hvað það þýðir er að þú bara ekki saman executable þína almennilega. Þegar við saman forrit til að nota með GDB, verðum við að nota þessi sérstaka g fána, og það er gert með því að vanræksla ef þú saman forrit, bara með því að slá gera eða gera gallaðir eða að batna, allir af þeim. En ef þú ert að setja saman handvirkt með Clang, þá þarftu að fara í og ​​eru að-g fána. Á þessum tímapunkti, er að við höfum gdb hvetja okkar, það er frekar einfalt að hlaupa the program. Við getum annað hvort tegund hlaupa, eða við getum bara slegið r. Flest gdb skipanir geta verið stytt. Yfirleitt bara einn eða nokkra stafi, sem er nokkuð gott. Svo Saad, ef þú slærð r og ýttu á Enter, hvað gerist? [Saad] Ég fékk SIGSEGV, skiptingu og átölulaust, og svo allt þetta gobbledygook. >> Já. Eins og við erum að sjá á skjánum núna, og eins og Saad sagði þegar við tegund hlaupa eða R og ýttu á Enter, fá við enn sama seg kenna. Svo nota gdb ekki leysa vandamál okkar. En það gefur okkur smá gobbledygook, og það kemur í ljós að þetta gobbledygook í raun segir okkur þar sem það er að gerast. Til að flokka þetta svolítið, þetta fyrsta hluti er hlutverk sem allt er að fara úrskeiðis. Það er þetta __ strcmp_sse4_2, og það segir okkur að það er að gerast í þessari skrá kallað sysdeps/i386, allt þetta, aftur, eins konar óreiðu - en lína 254. Það er góður af harður til flokka. Venjulega þegar þú sérð efni eins og þetta, sem þýðir að það er að seg faulting í einu af kerfi bókasafna. Svo eitthvað að gera með strcmp. Þið hafið séð strcmp áður. Ekki of brjálaður, en þýðir þetta að strcmp er brotinn eða að það er vandamál með strcmp? Hvað finnst þér, Alexander? [Alexander] Er það - er 254 línan? Og - ekki tvöfaldur, en það er ekki loft þeirra, og þá er það annað mál fyrir hverja aðgerð. Er það 254 á þeirri starfsemi, eða -? >> Það er lína 254. Það lítur út eins og í þessu. S skrá, svo það er samkoma kóða sennilega. En, held ég meira áríðandi hlutur er, vegna þess að við höfum fengið seg kenna, og það lítur út eins og það kemur frá strcmp virka, hefur þetta í sér, þá er það strcmp brotinn? Það ætti ekki, vonandi. Svo bara vegna þess að þú ert með skiptingu kenna í einu af kerfi virka, venjulega sem þýðir að þú bara hefur ekki kallað það rétt. The fljótlegasta hlutur að gera til að finna út hvað er raunverulega að gerast þegar þú sérð eitthvað brjálaður eins og þetta, þegar þú sérð seg kenna, sérstaklega ef þú ert með forrit sem er að nota meira en bara helstu, er að nota rakningarskýrslu. Ég skammstafa rakningarskýrslu því að skrifa BT, öfugt við fullt rakningarskýrslu orð. En Charlotte, hvað gerist þegar þú skrifar BT og ýttu á Enter? [Charlotte] Það sýnir mér tvær línur, línu 0 og Lína 1. >> Já. Svo línu 0 og línu 1. Þetta eru í raun rammar stafla sem voru nú í leik þegar forritið hrundi. Byrjun frá hæstur ramma, ramma 0, og fara til the botn-mest, sem er rammi 1. Hæstur ramma okkar er strcmp ramma. Þú getur hugsað þetta eins og svipað við þessi vandamál sem við vorum bara að gera á prófi með ábendingum, þar sem við höfðum skipti stafla ramma ofan á helstu stafla ramma, og við höfðum breytur sem skipti var með ofan á breytum sem helsta var að nota. Hér hrun okkar gerðist í strcmp virka okkar, sem hefur verið kölluð af meginvirkni okkar, og aftur keyrslu gefur okkur ekki aðeins aðgerðir sem það tókst ekki, en það er líka að segja okkur hvar allt var kallaður frá. Svo ef ég fletta yfir smá meira til hægri, getum við séð að já, við vorum á línu 254 þessa strcmp-sse4.s skrá. En kalla var fram á buggy1.c, Line 6. Svo þýðir að við getum gert - er að við getum bara farið kíkja og sjá hvað var að gerast á buggy1.c, Line 6. Again, there ert a par leiðir til að gera þetta. Eitt er að hætta út af gdb eða hafa númerið þitt opnast í öðrum glugga og kross tilvísun. Það, í sjálfu sér, er nokkuð vel því nú ef þú ert á skrifstofutíma og þú hefur got a seg bilunina og TF þín er spá í hvar allt var að brjóta, þú getur bara sagt, "Ó, línu 6. Ég veit ekki hvað er að gerast, en eitthvað um línu 6 veldur áætlun mín að brjóta. " Hin leiðin til að gera það er að þú getur notað þessa skipun sem kallast lista í GDB. Þú getur einnig skammstafa það með l. Svo ef við högg l, hvað fáum við hér? Við fá a heild búnt af undarlegt efni. Þetta er í raun samkoma kóða sem er í strcmp_sse4_2. Þetta lítur svona angurvær, og ástæða þess að við erum að fá þetta er vegna þess að núna, GDB hefur okkur í ramma 0. Svo hvenær við skoðum breytur, hvenær við líta á frumkóða, við erum að horfa á kóða sem varðar við stafla ramma sem við erum nú inn Svo í röð til að fá eitthvað þroskandi, verðum við að færa til stafla ramma sem gerir meira vit. Í þessu tilviki er aðal stafla ramma myndi gera svolítið meira vit, vegna þess að það var í raun númerið sem við skrifuðum. Ekki strcmp kóða. Leiðin sem þú getur skipt á milli ramma, í þessu tilfelli, vegna þess að við höfum tvö, við höfum 0 og 1, þú gerir það með upp og niður stjórn. Ef ég flyt upp einn ramma, núna er ég í helstu stafla ramma. Ég get að fara niður til að fara aftur þar sem ég var, fara aftur, fara aftur, og fara upp aftur. Ef þú gerir alltaf program í GDB, þú færð hrun, færðu rakningarskýrslu, og þú sérð að það er í sumum skrá sem þú veist ekki hvað er að gerast. Þú ert að reyna lista, kóðinn lítur ekki þekkja þig, taka a líta á ramma þína og reikna út hvar þú ert. Þú ert líklega á röngum stafla ramma. Eða að minnsta kosti þú ert í stafla ramma sem er ekki einn sem þú getur raunverulega kemba. Nú þegar við erum í viðeigandi stafla ramma, erum við í helstu, nú getum við notað lista stjórn til að reikna út hvað línan var. Og þú getur séð það, það prenta það fyrir okkur hérna. En við getum högg skrá allt það sama, og listi gefur okkur þessa fallegu útprentun á raunverulegri kóða sem er að gerast hér. Einkum getum við líta á línu 6.. Við sjáum hvað er að gerast hér. Og það lítur út eins og við séum að gera band samanburður milli band "CS50 björg" og argv [1]. Eitthvað um þetta var hrun. Svo Missy, hefur þú einhverjar skoðanir á hvað gæti verið að gerast hér? [Missy] Ég veit ekki af hverju það er hrun. >> Þú veist ekki af hverju það er hrun? Jimmy, einhverjar hugsanir? [Jimmy] Ég er ekki alveg viss, en síðast þegar við notuðum band bera, eða strcmp, við höfðum eins þremur mismunandi tilvikum undir það. Við vildum ekki hafa ==, ég held ekki, rétt í því fyrstu línu. Í stað þess að það var skipt í þrjá, og einn var == 0, einn var <0, held ég, og einn var> 0. Svo kannski eitthvað eins og þessi? >> Já. Svo er það þetta mál á erum við að gera samanburð rétt? Stella? Allar hugsanir? [Stella] Ég er ekki viss. >> Ekki viss. Daniel? Hugsanir? Allt í lagi. Það kemur í ljós hvað er að gerast hérna er þegar við hljóp forritið og fengum við seg kenna, þegar þú hleypur forritið í fyrsta skipti, Daníel, gerðir þú gefa það allir stjórn lína rifrildi? [Daniel] nr >> Nei Í því tilfelli, það er gildi argv [1]? >> Það er ekkert gildi. >> Einmitt. Jæja, það er ekki viðeigandi band gildi. En það er einhver gildi. Hvað er gildi sem fær geymd þar? >> A sorp gildi? >> Það er annaðhvort sorp gildi eða, í þessu tilfelli, enda argv array er alltaf hætt við null. Svo hvað raunverulega got geymdar í það er null. Hin leiðin til að leysa þetta, frekar en að hugsa það í gegnum, er að reyna að prenta það út. Þetta er þar sem ég var að segja að nota gdb er mikill, vegna þess að þú getur prentað út allar breytur, öll þau gildi sem þú vilt nota þessa vel-spjátrungur p stjórn. Svo ef ég tegund p og svo ég tegund gildi breytu eða heiti breytu, segja, argc, sé ég að argc er 1. Ef ég vil prenta út argv [0], get ég gert það bara svona. Og eins og við sáum, argv [0] er alltaf nafn program, alltaf nafn executable. Hér sérðu að það er got the fullur gangstígur nafn. Ég get líka prentað út argv [1] og sjá hvað gerist. Hér fengum við þessa tegund af dularfulla gildi. Við fengum þennan 0x0. Mundu að í upphafi tíma þegar við ræddum um sextánskur tölur? Eða þessi litla spurning í lok pset 0 um hvernig á að tákna 50 í álög? Leiðin sem við skrifa álög tölur í CS, bara ekki rugla okkur við aukastaf tölur, er við forskeyti alltaf þá með 0x. Svo þetta 0x forskeyti alltaf átt bara túlka eftirfarandi númer sem sextánskur númer, ekki sem streng, ekki sem heiltala, ekki eins og a tvöfaldur númer. Þar sem fjöldi 5-0 er gild tala í sextánskur. Og það er númer í tugabrot, 50. Svo er þetta bara hvernig við disambiguate. Svo 0x0 þýðir sextánskur 0, sem er einnig aukastaf 0, tvöfaldur 0. Það er bara gildi 0. Það kemur í ljós að þetta er það null er reyndar í minni. Null er bara 0. Hér er þáttur geymd við argv [1] er null. Þannig að við erum að reyna að bera saman "CS50 ROCKS" okkar band í núll band. Svo dereferencing null, að reyna að opna það á núll, þeir eru yfirleitt að fara að valda einhvers konar sök skiptingu eða öðrum slæmum hlutum að gerast. Og það kemur í ljós að strcmp ekki athuga að sjá hvort þú hefur staðist í verði sem er null. Fremur, það fer bara á undan, reynir að gera hlutur hennar, og ef það seg galla, seg það galla, og það er þitt vandamál. Þú þarft að fara laga það. Raunverulega fljótt, hvernig gætum við laga þetta vandamál? Charlotte? [Charlotte] Þú getur athugað með hvort. Svo ef argv [1] er núll, == 0, síðan aftur 1 eða eitthvað [óskiljanlegur]. >> Já. Svo er það ein góð leið til að gera það, eins og við er að athuga hvort, virði við erum að fara að fara í strcmp, argv [1], er hann null? Ef null það, þá getum við sagt í lagi, hætti. A fleiri algeng leið til að gera þetta er að nota argc gildi. Þú getur séð hérna í byrjun Main, við sleppt að fyrsta próf sem við gerum venjulega þegar við notum stjórn lína rifrildi, sem er að prófa hvort ekki argc gildi okkar er það sem við gerum ráð fyrir. Í þessu tilfelli erum við að búast við að minnsta kosti tvær röksemdir, nafn af the program og eitt annað. Þar sem við erum að nota annað rök hérna. Svo hafa sumir tegund af próf fyrirfram, áður strcmp símtali okkar að próf hvort argv er að minnsta kosti 2, myndi líka gera það sama tegund af hlutur. Við sjáum hvort það virkar með því að keyra forritið aftur. Þú getur alltaf endurræsa program innan gdb, sem er mjög gott. Þú getur keyrt, og þegar þú fara í rifrildi á forritinu, þú framhjá þeim þegar þú kallar hlaupa, ekki þegar þú stígvél upp gdb. Þannig að þú getur haldið skírskota program með mismunandi rökum hverju sinni. Svo hlaupa, eða aftur, ég get slegið r, og við skulum sjá hvað gerist ef við tegund "halló". Það verður alltaf að spyrja þig hvort þú vilt byrja það frá byrjun aftur. Venjulega, þú vilja til byrjun það frá byrjun aftur. Og á þessum tímapunkti, það endurræsa það aftur prenta það út Forritið sem við erum að keyra, buggy1 með rök hello, og það prentar Þessi staðall út, það segir, "Þú færð D," sorglegt andlit. En við ekki seg sök. Það sagði að ferli lauk venjulega. Svo lítur það mjög gott. Ekkert meira seg kenna, gerði við það síðasta, svo það lítur út eins og þessi var örugglega seg kenna galla sem við vorum að fá. Því miður segir það okkur að við erum að fá D. Við getum farið til baka og líta á kóðann og sjá hvað var að gerast þarna að reikna út hvað var - hvers vegna það var að segja okkur að við fengum D. Við skulum sjá, hér var þetta að segja printf að þú got a D. Ef við tegund lista, eins og þú halda að slá lista, heldur iterating niður í gegnum forrit, svo það mun sýna þér fyrstu línur af forritinu. Þá munum sýna þér næsta nokkrar línur, og næsta klumpur og næsta klumpur. Og það mun halda áfram að reyna að fara niður. Og nú munum við fá að "lína númer 16 er út af svæðinu." Vegna þess að það hefur bara 15 línur. Ef þú færð að þessum tímapunkti og þinn að spá, "Hvað á ég að gera?" þú getur notað hjálpa stjórn. Hjálp og þá gefa það nafn á stjórn. Og þú sérð GDB gefur okkur alla þessa tegund af efni. Þar segir: "Með engin rök, listi tíu fleiri línur eftir eða um fyrri skráningu. Listi - listi yfir tíu línur áður - " Svo skulum reyna að nota lista mínus. Og þessi listi er 10 línur fyrri, þú getur spilað í kring með lista svolítið. Þú getur gert lista, lista -, getur þú jafnvel gefa lista númer, eins og listi 8, og það mun lista 10 línur um línu 8. Og þú getur séð hvað er að gerast hér er að þú hafir fengið einföld ef annað. Ef þú slærð inn í CS50 steina, prentar það út "Þú færð A." Annars prentar það út "Þú færð D." Bummer bænum. Allt í lagi. Já? [Daniel] Svo þegar ég reyndi að gera CS50 steina án gæsalappa, það segir "Þú færð D." Ég þurfti að vitna til að fá það til að vinna, hvers vegna er það? >> Já. Það kemur í ljós að þegar - þetta er annar skemmtilegur lítill lostæti - þegar þú keyrir forritið, ef við keyra það og við slá í CS50 steina, bara eins og Daníel var að segja að hann gerði það, og þú högg inn, það segir samt við að fá D. Og spurningin er, af hverju er þetta? Og það kemur í ljós að bæði flugstöðinni okkar og GDB flokka þetta sem tvö aðskilin rök. Því þegar það er pláss, sem er gefið í skyn sem fyrsta rifrildi endaði, næsta rifrildi er um það bil að hefjast. Leiðin til að sameina þær í tvennt, eða miður, í eitt rifrildi, er að nota tilvitnanir. Svo nú, ef við setjum það í gæsalöppum og keyra það aftur, fáum við að A. Svo bara til að ágrip eru ekki vitna, CS50 og klettar flokka sem tveimur aðskildum rök. Með tilvitnunum, það er flokka sem ein rök með öllu. Við sjáum þetta með breakpoint. Svo langt að við höfum verið að keyra forrit okkar, og það hefur verið í gangi þar til annað hvort það seg galla eða lendir villu eða þar til það hefur hætt og allt hefur verið algerlega fínn. Þetta er ekki endilega hjálpsamur hlutur, því að stundum þú ert með villa í forritinu, en það er ekki að valda skiptingu kenna. Það er ekki að valda forritið til að hætta eða eitthvað svoleiðis. Leiðin til að fá gdb að staldra program á ákveðnum tímapunkti er að setja breakpoint. Þú getur annað hvort að gera þetta með því að setja breakpoint á virka nafn eða þú getur sett breakpoint á tiltekinni línu af kóða. Mér finnst að setja Rofstaðir um nöfn virka, vegna þess að - auðvelt að muna, og ef þú ferð í raun í og ​​breytt kóðann þinn upp smá, þá breakpoint mun reyndar vera á sama stað innan kóðann þinn. En ef þú ert að nota línu númer, og lína númer breytast vegna þess að þú bæta við eða eyða nokkur númer, þá breakpoints þín eru öll algerlega ruglaður upp. Ein af algengustu sem ég gera er að setja breakpoint á meginvirkni. Oft ég stígvél upp GDB, ég gerð B MAIN, Enter, og það mun setja breakpoint á meginvirkni sem bara segir "að gera hlé á dagskrá eins fljótt og þú byrjar að keyra," og þannig, þegar ég hlaupa program minn með, segja, CS50 steina sem tvö rök og ýttu á Enter, fær það til the aðalæð virka og það hættir strax í fyrstu línu, rétt áður en það metur strcmp virka. Þar sem ég er í hvíld, nú get ég farið að mucking kring og sjá hvað er að gerast með öllum mismunandi breytur sem eru liðin í áætlun mína. Hér get ég prentað út argc og sjá hvað er að gerast. Sjá að argc er 3, vegna þess að það fékk 3 mismunandi gildi í það. Það fékk nafnið af the program, það er fékk fyrstu rök og annað rifrildi. Við getum prentað þá út með því að horfa á argv [0], argv [1], og argv [2]. Svo nú þú getur líka séð hvers vegna þetta strcmp kalla er að fara að mistakast, vegna þess að þú sérð að það var skipt upp CS50 og steina í tveimur aðskildum rök. Á þessum tímapunkti, þegar þú hefur högg breakpoint, getur þú haldið áfram að stíga með forritinu línu fyrir línu, eins og til að byrja program aftur. Svo ef þú vilt ekki að byrja forritið aftur og bara halda áfram, þú getur notað haldið áfram stjórn og halda áfram að hlaupa the program til enda. Rétt eins og það gerði hér. Hins vegar, ef ég endurræsa forritið, CS50 Rocks, hits hún breakpoint minn aftur, og að þessu sinni, ef ég vil ekki bara að fara alla leið í gegnum the hvíla af the program, Ég get notað næstu skipun, sem ég skammstafa líka með n. Og þetta mun stíga í gegnum forritið línu fyrir línu. Svo er hægt að horfa á eins og það framkvæma, sem breytur breytast, eins og hlutirnir fá uppfærð. Sem er nokkuð gott. Hin kaldur hlutur er frekar en að endurtaka sömu stjórn aftur og aftur og aftur, ef þú högg bara inn - svo hér sem þú sérð að ég hef ekki slegið í neinu - Ef ég lenti bara inn, mun það endurtaka fyrri stjórn, eða fyrri GDB stjórn sem ég setti bara inn Ég get haldið hitting inn og það mun halda stepping gegnum línu kóða mína fyrir línu. Ég myndi hvetja ykkur til að fara kíkja á önnur forrit gallaðir eins og heilbrigður. Við höfum ekki tíma til að komast í gegnum þær allar í dag kafla. Kóðinn er það, svo þú getur konar séð hvað er að gerast bak við tjöldin ef þú færð virkilega fastur, en að minnsta kosti, bara æfa stígvél upp GDB, keyra forritið þar sem það brýtur á þér, fá rakningarskýrslu, vangaveltur út hvað virka hrun var í, hvaða lína það var á, prenta út nokkur breytilega gildi, bara þannig að þú færð tilfinningu fyrir því, vegna þess að það mun virkilega hjálpa þér að fara fram. Á þessum tímapunkti, við erum að fara að hætta út af gdb, sem þú nota hætta eða bara q. Ef kerfið þitt er í the miðja af gangi enn, og það hefur ekki hætt, það verður alltaf að spyrja þig, "Ertu viss um að þú viljir hætta?" Þú getur bara högg já. Nú erum við að fara að horfa á næstu vandamáli sem við höfum, sem er kötturinn program. Ef þú horfir til skamms á Áframsendi og pípur, munt þú sjá að Tommy notar þetta forrit sem prentar í grundvallaratriðum alla framleiðsla skrá til the skjár. Svo ef ég hlaupa köttur, þetta er í raun innbyggður-í forrit á tækið, og ef þú hefur Macs sem þú getur gert þetta á þinn Lagsi líka, ef þú opnar flugstöðinni. Og við - köttur, við skulum segja, cp.c, og ýttu á Enter. Hvað gerði, ef við að fletta upp smá og sjá hvar við hljóp línu, eða þar sem við hljóp köttur stjórn, bókstaflega bara prenta út innihald cp.c á skjánum okkar. Við getum keyrt það aftur og þú getur sett í margar skrár saman. Svo er hægt að gera köttur cp.c, og þá getum við líka concatenate á cat.c skrá, sem er forrit sem við erum að fara að skrifa, og það mun prenta bæði skrár aftur til baka á skjáinn okkar. Þannig að ef við að fletta upp smá, sjáum við að þegar við hljóp þetta köttur cp.c, cat.c, fyrst það prentað út CP skrá, og þá undir það, það prenta út cat.c skrá rétt hérna. Við ætlum að nota þetta til að bara fá fætur okkar blautur. Spila í kring með einfaldri prentun á flugstöðinni, sjá hvernig það virkar. Ef þú krakkar opna með gedit cat.c, Enter, þú getur séð áætlun sem við erum að fara að skrifa. Við höfum látið þetta ágætur ketils disk, þannig að við þurfum ekki að eyða tíma í að skrifa allt það út. Við athuga einnig fjölda rök liðin inn Við prenta út ágætur notkunarleiðbeiningar. Þetta er svoleiðis að, aftur, eins og við höfum verið að tala um, það er næstum eins og minni vöðva. Mundu bara að halda að gera sams konar efni og alltaf að prenta út einhvers konar gagnlegum skilaboð þannig að fólk veit hvernig á að keyra forritið þitt. Með köttur, það er frekar einfalt, við erum bara að fara að fara í gegnum allar mismunandi rök sem voru samþykkt í áætlun okkar, og við erum að fara að prenta innihald þeirra út á skjáinn í einu. Til að prenta skrá til the skjár, við erum að fara að gera eitthvað mjög svipað við það sem við gerðum í lok spurningakeppni. Í lok quiz, sem ráða dagskrá, áttum við að opna skrá, og þá þurftum við að prenta á það. Í þessu tilfelli erum við að fara að opna skrá, og við erum að fara að lesa í henni í staðinn. Svo ætlum við að prenta út, í stað þess að skrá, við erum að fara að prenta á skjáinn. Svo prentun á skjáinn sem þú hefur allt gert áður með printf. Svo er það ekki of brjálaður. En lesa skrá er skrýtin tilfinning. Við förum í gegnum þessi smá í einu. Ef þið farið aftur að síðustu vandamál á prófið, vandamál 33, fyrsta línan sem við erum að fara að gera hér, opna skrána, er mjög svipað og það sem við gerðum þarna. Svo Stella, hvað er þessi lína líta út, þegar við opna skrá? [Stella] Capital FILE *, skrá - >> lagi. >> - Er jafn fopen. >> Jamm. Sem í þessu tilfelli er? Það er í comment. >> Það í comment? argv [i] og r? >> Einmitt. Rétt á. Svo er Stella alveg rétt. Þetta er það línan lítur út. Við ætlum að fá læk skrá breytu skal vista þau í skrá * svo allar húfur, FILE, *, og nafn þessarar breytu verður skrá. Við gætum kalla það hvað sem við viljum. Við gætum kalla það first_file eða file_i, hvað viljum. Og þá var nafnið á skránni samþykkt um stjórn lína til þessarar áætlunar. Svo það er geymt í argv [i] og þá erum við að fara að opna þessa skrá í lesa ham. Nú þegar við höfum opnað skrána, hvað er það sem við þurfum alltaf að muna eftir að gera þegar við höfum opnað skrá? Loka það. Svo Missy, hvernig loka við skrá? [Missy] fclose (skrá) >> fclose (skrá). Einmitt. Frábært. Allt í lagi. Ef við lítum á þetta til að gera athugasemd hérna, segir, "Open argv [i] og prenta innihald hennar til stdout." Standard út er undarlegt nafn. Stdout er bara okkar leið til að segja við viljum að prenta það á flugstöðinni, við viljum að prenta það til staðlaða framleiðsla á. Við getum raunverulega fá losa af this comment hérna. Ég ætla að afrita það og líma það síðan það er það sem við gerðum. Á þessum tímapunkti, nú höfum við að lesa skrá smátt og smátt. Við höfum rætt nokkrar leiðir að lesa skrá. Hver sjálfur ert eftirlæti svo langt? Hvaða leiðir hefur þú séð eða þú manst, að lesa skrár? [Daniel] fread? >> Fread? Svo fread er einn. Jimmy, veistu allir aðrir? [Jimmy] Nei >> lagi. Nope. Charlotte? Alexander? Allir aðrir? Allt í lagi. Svo hinar eru fgetc er eitt sem við munum nota mikið. Það er líka fscanf, þú krakkar sjá mynstur hér? Þeir byrja allir með f. Nokkuð að gera með skrá. Það er fread, fgetc, fscanf. Þetta eru allar lesa virka. Til að skrifa við höfum fwrite, höfum við fputc stað fgetc. Við höfum einnig eins fprintf við sáum á spurningakeppni. Þar sem þetta er vandamál sem felur í sér að lesa úr skrá, við erum að fara að nota eina af þessum þremur aðgerðum. Við erum ekki að fara að nota þessar aðgerðir niður. Þessar aðgerðir eru allar að finna í venjulegu I / O bókasafn. Svo ef þú horfir á efst á þessari áætlun, þú getur séð að við höfum nú þegar með haus skrá til staðlaða I / O bókasafn. Ef við viljum reikna út hver við viljum að nota, við getum alltaf opna manninn síður. Þannig að við getum slegið mann stdio og lesa allt um stdio inntak og úttak aðgerðir í C. Og við getum nú þegar séð ó, sjáðu. Það er að minnast fgetc, það nefna fputc. Svo er hægt að bora niður smá og horfa á, segja, fgetc og líta á síðuna maður hennar. Þú getur séð að það fer með a heild búnt af annar virka: fgetc, fgets, getc, getchar, fær ungetc, og inntak hennar á stafi og strengi. Svo er þetta hvernig við lesum í stafi og strengi úr skrám frá standard input, sem er í raun frá notanda. Og þetta er hvernig við gerum það í raun C. Þannig að þetta er ekki að nota GetString og GetChar aðgerðir sem við notuðum frá CS50 bókasafn. Við ætlum að gera þetta vandamál á nokkrum leiðum þannig að þú getur séð tvær mismunandi leiðir til að gera það. Bæði fread fall sem Daniel nefndi og fgetc eru góðar leiðir til að gera það. Ég held fgetc er svolítið auðveldara, vegna þess að það hefur aðeins, eins og þú sérð, ein rök, og FILE * að við erum að reyna að lesa staf frá, og aftur gildi þess er int. Og þetta er svolítið ruglingslegt, ekki satt? Þar sem við erum að fá staf, svo hvers vegna er þetta ekki skila bleikju? Þið hafið einhverjar hugmyndir um af hverju þetta gæti ekki skila bleikju? [Missy svarar óskiljanlegur] >> Já. Svo Missy algerlega rétt. Ef það er ASCII, þá er þetta heiltala gæti varpað raunveruleg bleikju. Gæti verið ASCII staf og það er rétt. Það er einmitt það sem er að gerast. Við erum að nota int einfaldlega vegna þess að það hefur fleiri bita. Það er stærri en bleikja, bleikju okkar hefur aðeins 8 bita, sem 1 bæti á 32-bita vélum okkar. Og int hefur virði allra 4 Bytes 'pláss. Og það kemur í ljós að leiðin fgetc virkar, ef við skruna niður í ágrip okkar í þessu maður síðu svolítið, fletta alla leið niður. Það kemur í ljós að þeir nota þetta sérstaka gildi sem heitir EOF. Það er sérstakt fasti sem skilagildi fgetc virka þegar þú högg the endir af the skrá eða ef þú færð villu. Og það kemur í ljós að til þess að gera þessar samanburð við EOF almennilega, þú vilt hafa að auka magn af upplýsingum sem þú hefur á int í stað þess að nota char breytu. Jafnvel þó fgetc er í raun fá karakter úr skrá, þú vilt að muna að það er aftur eitthvað sem er int til þín. Að því sögðu, það er nokkuð auðvelt að nota. Það er að fara að gefa okkur staf, svo er allt sem við þurfum að gera að halda að spyrja skrána, "Láttu mig fá næsta staf, gefa mér næsta staf, gefa mér næsta staf," þar til við fá til the endir af the skrá. Og það mun draga í einum staf í einu úr skránni okkar, og þá getum við gert hvað sem við viljum við það. Við getum geymt það, getum við bætt því við streng, sem við getum prentað það út. Ekki allir af því. Zooming út aftur og fara aftur til cat.c program okkar, ef við ætlum að nota fgetc, hvernig gætum við nálgast næstu línu af kóða? Við ætlum að nota - fread vilja gera eitthvað aðeins öðruvísi. Og í þetta sinn, við erum bara að fara að nota fgetc að fá einn staf í einu. Til að vinna heilan skrá, hvað gætum við þurft að gera? Hversu margir stafir eru í skrá? There ert a einhver fjöldi. Svo þú vilt líklega að fá einn og þá fá aðra og fá aðra og fá aðra. Hvers konar reiknirit finnst þér við gætum þurft að nota hérna? Hvaða tegund af -? [Alexander] A til hliðar? >> Einmitt. Sumir tegund af lykkju. A for lykkja er í raun mikil, í þessu tilfelli. Og eins og þú varst að segja, það hljómar eins og þú vilt lykkju á öllu skrá, fá staf í einu. Allar ábendingar um það sem getur litið út? [Alexander, óskiljanlegur] >> Jæja, bara segja mér á ensku hvað þú ert að reyna að gera? [Alexander, óskiljanlegur] Svo í þessu tilfelli, það hljómar eins og við erum bara að reyna að lykkja yfir allan skrá. [Alexander] Svo i > Stærð -? Ég giska á stærð af the skrá, ekki satt? Stærð - we'll skrifa bara svona. Stærð skrá að sinni, i + +. Svo kemur í ljós að leiðin sem þú gerir þetta með því að nota fgetc, og þetta er nýtt, er að það er engin auðveld leið til að bara fá stærð skrá með þessu "sizeof" tegund reisa að þú hefur séð áður. Þegar við notum þessi fgetc virka, við erum að kynna einhvers konar nýtt, angurvær setningafræði til þetta fyrir lykkju, þar sem í stað þess að nota bara einföld gegn að fara staf með staf, þá ætlum við að draga einn staf í einu, einn staf í einu, og hvernig við vitum að við erum í lok er ekki þegar við höfum talið ákveðinn fjölda stafa, en þegar eðli við draga út að sérstakt enda eðli skrá. Þannig að við getum gert þetta með því - ég kalla þetta CH, og við erum að fara að frumstilla hana með fyrsta símtalinu okkar til að fá fyrsta staf úr skránni. Þannig að þetta hluti hérna, þetta er að fara að fá staf út úr skránni og geyma það í breytu breyt. Við erum að fara að halda að gera þetta fyrr en við komum til the endir af the skrá, sem við gerum með því að prófa að eðli ekki vera jafn að sérstakar EOF staf. Og þá í stað þess að gera k + +, sem myndi bara hækka gildi, þannig að ef við lesum að A út af the skrá, höfuðborg A, segja, CH + + myndi gefa okkur b, og svo við myndum fá C og þá d. Það er greinilega ekki það sem við viljum. Það sem við viljum hér í þessum síðasta bita er við viljum fá næsta staf úr skrá. Svo hvernig gætum við fengið næsta staf úr skrá? Hvernig fáum við fyrsta staf úr skrá? [Nemandi] fgetfile? >> Fgetc, eða, því miður, þú varst alveg rétt. Ég rangt stafsett það rétt þar. Svo já. Hér í stað þess að gera k + +, við erum bara að fara að hringja fgetc (skrá) aftur og geyma niðurstöðu í sama CH breytu okkar. [Námsmaður spurning, óskiljanlegur] >> Er þetta þar sem þessi * FILE krakkar eru sérstök. Leiðin sem þeir vinna er það - þegar þú opnar fyrst - þegar þú fyrst að fopen hringja, Skráin * þjónar í raun sem bendill til the byrjun af the skrá. Og svo hvert skipti sem þú hringja fgetc, flytur það einn staf í skránni. Svo þegar þú kallar þetta, þú ert incrementing skrá músina með einum staf. Og þegar þú fgetc aftur, þú ert að færa það annar karakter og annan staf og annar karakter og annar karakter. [Námsmaður spurning, óskiljanlegur] >> Og that's - Já. Það er góður af þessum galdur undir hetta. Þú halda bara incrementing gegnum. Á þessum tímapunkti, þú ert fær um að í raun vinna með staf. Svo hvernig gætum við prenta þetta út á skjánum, nú? Við getum notað sömu printf hlutur sem við notuðum áður. Að við höfum verið að nota alla önn. Við getum hringt printf, og við getum framhjá í eðli bara svona. Önnur leið til að gera það er frekar en að nota printf og að þurfa að gera þetta snið band, Við getum líka notað eitthvað af öðrum aðgerðum. Við getum notað fputc sem prentar staf á skjáinn, nema ef við skoðum fputc - láta mig minnka svolítið. Við sjáum hvað er gott er það tekur á eðli sem við lesum út með fgetc, en þá verðum við að gefa honum straum til að prenta út. Við getum líka notað putchar virka, sem mun setja beint í venjulegt út. Þannig að það eru allt fullt af mismunandi valkosti sem við getum notað fyrir prentun. Þeir eru allir í venjulegu I / O bókasafn. Alltaf þegar þú vilt prenta - svo printf, sjálfgefið, mun prenta í sérstökum staðli út á, sem er að stdout. Þannig að við getum bara átt við það sem góður þessa galdur gildi, stdout hér. Oops. Setjið semíkommu utan. Þetta er mikið af nýjum, angurvær upplýsingar hér. A einhver fjöldi af það er mjög að beita, í þeim skilningi að þetta er númerið sem er skrifað með þessum hætti bara vegna þess að það er hreint að lesa, auðvelt að lesa. Það eru til margar mismunandi leiðir til að gera það, margar mismunandi aðgerðir sem þú getur notað, en við hafa tilhneigingu bara að fylgja þessum sömu mynstur aftur og aftur. Svo verið ekki hissa ef þú sérð númerið svona að koma upp aftur og aftur. Allt í lagi. Á þessum tímapunkti þurfum við að brjóta í dag. Takk fyrir að koma. Takk fyrir að horfa á ef þú ert á netinu. Og við munum sjá þig í næstu viku. [CS50.TV]