[Powered by Google Translate] [SEKCIO 5: malpli da komfortaj] [Nate Hardison, Harvard University] [Jen CS50.] [CS50.TV] Do bonvenigas reen, knaboj. Bonvenon sekcio 5. Je ĉi tiu punkto, esti kompletigita kvizo 0 kaj vidinte, kiel vi faris, espereble vi sentas vere bonan ĉar mi estis tre impresita de la interpunkcioj en ĉi tiu sekcio. Por nia linio spektantoj, ni havis kelkajn demandojn pri la lastaj du problemoj sur la problemo aro - aŭ en la kvizo, prefere. Do ni iras, por transiri tiujn vere rapide tiel ke ĉiuj vidas, kio okazis kaj kiel iros tra la efektiva solvo anstataŭ nur vidi la solvon mem. Ni tuj iros dum la lastaj kelkaj problemoj vere rapide, 32 kaj 33. Ĝuste, denove, por ke la linio de spektantoj povas vidi tion. Se vi revenos al via problemo 32, kiu estas en la paĝo 13, 13 el 16, problemo 32 estas ĉion pri svopoj. Afero temis interŝanĝi du entjeroj. Ĝi estas la problemo, ke ni volonte iris trans kelkajn fojojn en prelego. Kaj en tie, kion ni petas vin fari estas rapida memoro spuro. Por plenigi la valoroj de la variabloj kiuj estas sur la stako kiel la kodo iras tra ĉi interŝanĝa funkcio. En aparta, kion ni rigardis - I'm tuj metis ĉi iPad malsupren - en aparta, kion ni rigardis estas tiu linio kalkulitaj 6 dekstra tie. Kaj ĝi estas kalkulitaj 6 por ĝuste contiguity kun la antaŭa problemo. Kion ni volas fari estas montri aŭ etikedi la stato de memoro kiel estas en la momento kiam ni ekzekuti tiu linio numero 6, kio estas efektive reveno de nia interŝanĝa funkcio ĉi tie. Se ni rulumu malsupren tie, ni rimarkis, ke la adresoj de ĉio en memoro estis provizita por ni. Ĉi tio estas tre ŝlosila; ni revenos al tio en nur momento. Kaj tiam cxi tie malsupre, ni havis iom memoro diagramo kiu ni iras al referi al. Mi vere faris tion sur mia iPad. Do mi iros al alterni tien kaj reen inter la iPad kaj ĉi tiu kodo nur por via referenco. Ni komencu. Unue, ni koncentriĝas pri la unua paro de linioj de ĉefa dekstra tie. Por komenci, ni iras al pravalorizi x al 1 kaj y al 2. Do ni havas du entjeraj variabloj, ili estas ambaŭ tuj estos metita sur la stako. Ni tuj metis 1 kaj 2 en ili. Do se mi klaki super mia iPad, espereble, ni vidu - Apple TV spegulon, kaj tie ni iru. Okay. Do se mi klaki super mia iPad, Mi volas pravalorizi x al 1 kaj y al 2. Ni faras tion sufiĉe simple skribante 1 en la skatolo markita x kaj 2 en la skatolo markita y. Sufiĉe simpla. Do nun ni reiros al la tekkomputilo, vidi kio sekve okazos. Do tiu sekva linio estas kie aĵoj komplikas. Ni pasos la adreso de x kaj la adreson de y kiel la parametroj a kaj b por la interŝanĝa funkcio. La adreso de x kaj la adreso de y estas aĵoj kiuj oni ne povas kalkuli sen referenco al tiuj kuglo notas dekstra cxi tie. Kaj feliĉe, la unuaj du kuglo antaŭ diri al ni precize kion la respondoj estas. La adreso de x en memoro estas 10, kaj la adreso de y en memoro estas 14. Do tiuj estas la valoroj kiuj get pasis en kiel kaj b ĝis supro en nia interŝanĝa funkcio. Do denove, ŝanĝante reen al la diagramo, mi povas skribi 10 en kaj 14 en b. Nun, ĉi tiu punkto estas kie ni procedi kun la interŝanĝa. Do flipping reen al la tekkomputilo denove, ni vidas ke la vojo la interŝanĝa funkcias estas mi unue dereference a kaj tendencas la rezulton en tmp. Do la dereference operatoro diras, "Hej. Treat la enhavon de variabloj tiel adreson. Iru al kiom estas stokita en tiu adreso, kaj montru ĝin. " Kion vi montru el la variablo tuj estos stokitaj en niajn tmp variablo. Flipping reen al la iPad. Se ni iras al adreso 10, ni scias ke adreso 10 estas la varible x ĉar ni ricevis informojn de niaj kuglo punkto, ke la adreso de x en memoro estas 10. Do ni povas iri tien, akiri la valoron de tio, kiu estas 1, kiel ni vidas sur nia iPad, kaj montru ke en tmp. Denove, tio ne estas la fino enhavo. Ni tuj marŝi tra kaj ni atingos nian lastan staton de la programo je la fino. Sed nun, ni havas la valoron 1 stokitaj en tmp. Kaj estas rapida demando super tie. [Aleksandro] Ĉu la dereference operatoro - tio estas nur la stelo ĝuste fronte de la variablo? >> Jes. Do la dereference operatoro, kiel ni klaki al nia tekkomputilo denove, Estas ĉi tiu stelo ĝuste fronte. En tiu senco, ĝi estas - vi kontrastigi ĝin kun la multiplika operatoro kiuj postulas du aferojn: la dereference operatoro estas unuloka operatoro. Nur aplikita al unu valoro kompare al duuma operatoro, kie vi aplikas al du malsamaj valoroj. Do jen kio okazas en tiu linio. Ni ŝarĝis la valoro 1 kaj gardis ŝin en nian temporal entjera variablo. La sekva linio, ni stoki la enhavo de b al - aŭ, pli ĝuste, ni stoki la enhavon ke b estas indikante sur la loko, kie oni notas al. Se ni analizas tiun de dekstra al maldekstra, tuj dereference b, tuj trakti 14, tuj kapti la entjero kiu estas tie, kaj poste ni tuj iros al la adreso 10, kaj ni tuj ĵetu la rezulto de nia dereference de b en tiun spacon. Flipping reen al nia iPad, kie ni povas fari ĉi iom pli konkreta, ĝi povus helpi se mi skribas nombroj sur ĉiu el la adresoj ĉi tie. Do ni scias ke al y, ni estas ĉe adreso 14, x estas ĉe adreso 10. Kiam ni komencos je b, ni dereference b, ni tuj kapti la valoro 2. Ni tuj kapti tiun valoron ĉar tio estas la valoro kiu vivas ĉe adreso 14. Kaj ni tuj metis ĝin en la variablo kiu vivas ĉe adreso 10, kiu estas dekstre tie, respondante al niaj variablo x. Do ni povas fari iom da overwriting tie kie ni forigi niajn 1 kaj anstataŭe ni skribos 2. Do ĉiuj estas bone kaj bonan en la mondo, kvankam ni anstataŭigi x nun. Ni stokas x malnovan valoron en nia tmp variablo. Do ni povas kompletigi la interŝanĝa kun la sekvanta linio. Flipping reen al nia teko. Kaj cxio tio restaĵoj estas preni la enhavo el nia provizora entjera variablo kaj stoki ilin en la variablo kiu vivas je la adreso ke b estas tenante. Do ni tuj efektive dereference b akiri aliron al la variablo tio estas je la adreso kiun b veras en ĝi, kaj ni tuj plenigos la valoro kiu tmp estas tenante en ĝin. Flipping reen al la iPad denove. Mi povas forviŝi ĉi tiun valoron tie, 2, kaj anstataŭ ni kopii la 1 rekte en ĝi. Tiam la sekva linio kiu ekzekutas, kompreneble - se ni klaki reen al la tekkomputilo - estas tiu punkto 6, kiu estas la punkto je kiuj ni volis havi la diagramo tute plenigis eksteren. Do flipping reen al la iPad ankoraŭfoje, ĝuste tial vi povas vidi la kompletigis diagramo, vi povas vidi, ke ni havas 10 en a, a 14 en b, a 1 en tmp, a 2 en x, kaj 1 en kaj. Ĉu estas demandoj pri tio? Ĉu ĉi tiu fari pli sentita, esti iradis tra gxi? Faru malpli senco? Espereble ne. Okay. Punteros estas tre malfacila temo. Unu el la infanoj ni laboras kun ĝi havas tre komuna diro: "Kompreni punteros, vi devas unue kompreni punteros." Kiun mi pensas estas tre vera. Ĝi faras preni momenton por alkutimiĝi al ĝi. Desegno multajn pentraĵojn, desegnado multe da memoro diagramoj kiel ĉi tiu estas tre helpema, kaj kiam vi iros tra ekzemple post ekzemple post ekzemplo, ĝi devos komenci fari iom pli sentita kaj iom pli sentita kaj iom pli senco. Fine, unu tagon, vi devos ĉion tute regata. Demandojn antaŭ ol ni movos al la venonta problemo? Bone. Do klaki reen al la portebla. La sekva problemo ni havas estas problemo nombro 33 en dosiero mi / O. Zomi en ĉi iom. Problemo 33 - Jes? [Daniel] Mi nur havis rapidan demandon. Tiu stelo, aux la asterisko, ĝi estas nomata dereferencing kiam vi uzas asterisko antaŭe. Kio estas tio nomita kiam oni uzas la signon antaŭ? >> La signo antaŭe estas la adreso-de operatoro. Do ni rulumu back up. Oops. Mi estas en zoom modo do mi ne povas vere skribrulajxon. Se ni rigardas tiun kodon vere rapide ĉi tie, denove, samo okazas. Se ni rigardas tiun kodon ĉi tie, sur ĉi tiu linio, kie ni fari la alvokon por interŝanĝi, la signo simple diri "preni la adreson al kiu variablo x vivojn." Kiam via tradukilo kompilas vian kodon, ĝi devas vere fizike marki el loko en memoro por ĉiuj viaj variabloj vivi. Kaj tiel kion la tradukilo povas tiam fari iam ĝi estas kompilitaj ĉio, scias, "Ho, mi metas x ĉe adreso 10. Mi metis y je adreso 14." Ĝi povas tiam plenigu ĉi tiujn valorojn por vi. Do vi povas tiam - ĝi povas tiam pasas ĉi en kaj pasas & y en tiel. Tiuj infanoj ricevi la adreson, sed ankaŭ, kiam vi pasos ilin en la interŝanĝa funkcio, ĉi tiu tipo informo, ĉi int * ĉi tie, rakontas la tradukilo, "Konsentite, ni tuj estos interpreti ĉi tiu adreso kiel adreso de entjero variablo." Kiel adreso de int, kiu estas malsama de la adreso de gravulo variablo ĉar int okupas, sur 32-bita maŝino, reprenas 4 bajtoj de spaco, dum karakteron nur okupas 1 bajto de spaco. Do ĝi estas grave scii ankaŭ kio estas - kio vivas, kio tipo de valoro vivas je la adreso kiun got pasis in Aŭ la adreso kiun vi pritraktas. Tiun vojon, vi scias kiom da bajtoj de informo por fakte montru el via memoro RAM. Kaj tiam, jes, ĉi dereference operatoro, kiel vi demandas, iras kaj aliroj informo je aparta adreso. Do ĝi diras, kun ĉi variablo tie, trakti la enhavon de kiel adreso, iri al tiu adreso, kaj eltiri, montru al la procesoro, ŝarĝo en registriĝi la efektiva valoroj aŭ la enhavon kiu loĝas en tiu adreso. Plu demandoj? Tiuj estas bonaj demandoj. Estas multe da novaj terminologio ankaŭ. Estas ankaŭ speco de funky, vidante & kaj * en malsamaj lokoj. Bone. Do reen al problemo 33, enarkivigi mi / O. Tiu estis unu el tiuj problemoj kiujn mi pensas kelkaj aferoj okazis. Unu, estas sufiĉe nova temo. Ĝi estis prezentita baldaux antaux la kvizo, kaj tiam mi kredas ke estis ia kiel unu el tiuj vorto problemoj en matematiko kie al vi multe da informo, sed vi vere ne finas devi uzi barelon da ĝi. La unua parto de ĉi tiu problemo estas priskribi kia CSV-dosiero estas. Nun, CSV-dosiero, laŭ la priskribo, estas komo-disigita valoroj dosiero. La kialo ĉi tiuj estas tute interesa, kaj la kialo vi iam uzos ilin, estas, ĉar, kiel multaj el vi iam uzis stuff kiel Excel? Figuro plimulto de vi, probable, aŭ uzos en iu momento en via vivo. Vi uzas iun kiel Excel. Por akiri la datumojn el la Excel aŭ fari ian prilaborado per ĝi, se vi volas skribi C-programo aŭ Python programo, Java-programo, trakti kun la datumoj vi stokitaj en tie, unu el la plej komunaj formoj atingi ĝin estas en CSV-dosiero. Kaj vi povas malfermi Excel kaj kiam vi iras al la 'Konservu kiel' dialogo, vi povas akiri el reala CSV-dosiero. Handy scii trakti tion. Tiel funkcias la estas ke ĝi estas simila al - Mi volas diri, ĝi estas esence imitante al ŝtono, kie, kiel ni vidas tie, en la tre forlasis-plej peco, ni havas ĉiujn familinomojn. Do ni havas Malan, tiam Hardison, kaj tiam Bowden, MacWilliam, kaj tiam Chan. Ĉiuj familinomoj. Kaj tiam komo disigas la familinomoj de la unua nomoj. David Nate, Rob, Tommy, kaj Zamyla. Mi ĉiam konfuziĝas Robby kaj Tom. Kaj poste, fine, la tria kolumno estas la retadresoj. Kiam vi komprenos tion, la resto de la programo estas sufiĉe simpla por apliki. Kion ni faris por imiti ĉi sama strukturo en nia C programon estas ni uzis strukturo. Ni komencu ludi kun tiuj iom pli kiel bone. Ni vidis ilin por la unua iom en problemo aro 3, kiam ni pritraktas la vortaroj. Sed tiun bastonon struct stokas familinomo, unua nomo, kaj retmesaĝo. Samkiel nia CSV-dosiero estis stokante. Do ĉi tiu estas nur konverti de unu al alia formato. Ni devas konverti, en ĉi tiu kazo, bastono struct en linio, komo-disigita linio, ĝuste tiel. Ĉu tio havas sencon? You guys ĉiuj prenis la kvizo, tiel mi imagas ke vi almenaŭ havis tempon por pensi pri tiu. En la salajron funkcio, la problemo petas al ni prenu en - we'll zoom en sur tiu iom - preni en personaro strukturo, bastono struct, kun nomo s, kaj aldonas ĝian enhavon al nia staff.csv dosiero. Ĝi rezultas ke ĉi tiu estas sufiĉe simpla al uzi. Ni speco de ludi tie kun tiuj funkcioj iom pli hodiaŭ. Sed en ĉi tiu kazo, la fprintf funkcio estas vere la ŝlosilo. Do kun fprintf, ni povas presi, kiel vi infanoj estis uzante printf ĉi tiu tuta termino. Vi povas printf linion al dosiero. Do anstataŭ simple fari la kutiman printf alvoko kie vi donos la formato kordoj kaj tiam vi anstataŭi ĉiuj variabloj kun la sekva argumentoj, kun fprintf, via unua argumento estas anstataŭ la dosiero kiun vi volas skribi al. Se ni devis rigardi tion en la aparaton, ekzemple, viro fprintf, ni povas vidi la diferencon inter printf kaj fprintf. Mi zomi tie iomete. Do kun printf, donu ĝin al formato ŝnuro, kaj poste la posta argumentoj estas ĉiuj variabloj por anstataŭas aŭ anstataŭo en niajn formato kordoj. Dum kiu kun fprintf, la unua argumento estas ĝuste ĉi tiu dosiero * nomas rojo. Movante reen super ĉi tie por niaj salajron, ni jam atingis nian dosieron * rivereto malfermis por ni. Tion ĉi unua linio faras; ĝi malfermas la staff.csv dosiero, ĝi malfermas ĝin en append reĝimo, kaj ĉiuj ke tio lasis por ni fari estas skribi la bastonon strukturo al la dosiero. Kaj, vidu, cxu mi volas uzi la iPad? Mi uzas la iPad. Ni havas nula - Ni metu tiun sur la tablo tiel mi povas skribi iom pli bona - neniigas salajron kaj portas en unu argumento, bastono strukturo nomita s. Got nia krampoj, ni havas niajn dosiero * nomas dosiero, ni havas nian fopen linio donita al ni, kaj mi ĵus skribi ĝin kiel punktoj ĉar ĝi estas jam en la pedia. Kaj tiam en nia sekva linio, ni tuj faros alvokon al fprintf kaj ni tuj pasos en la dosiero kiun ni volas presi al, kaj tiam nia formato ĉeno, kiu - Mi lasos vin infanoj diru al mi kio gxi aspektas. Kion pri vi, Stella? Ĉu vi scias kio estas la unua parto de la formato string similas? [Stella] Mi ne estas certa. >> Bonvolu peti Jimmy. Ĉu vi scias, Jimmy? [Jimmy] Ĉu ĝi nur estos lasta? Mi ne scias. Mi ne estas tute certa. >> Bone. Kion pri, ĉu neniu get this ĝentila en la ekzameno? Ne Bone. Rezultas, ke ĉi tie ĉiuj ni devas fari estas ni volas ĉiu parto de nia dungitaro strukturo esti presita ekster kiel linio en nian arkivon. Ni nur uzas la kordo anstataŭo karaktero tri malsamaj tempoj ĉar ni havas familinomon sekvita de komo, tiam la unua nomo sekvata de komo, kaj tiam fine la retadreson kiu estas sekvita - kio ne estas persvadi sur mia ekrano - sed ĝi estas sekvata de lino karaktero. Do mi tuj skribos nur tie. Kaj tiam sekva nia formato kordoj, ni nur havas la anstataŭoj, kiun ni aliro uzante la skalara skribmaniero kiun ni vidis en problemo aro 3. Ni povas uzi s.last, s.first, kaj s.email anstataŭigi en tiuj tri valoroj en nia formato kordoj. Do kiamaniere kiuj iras? Sencon? Jes? Ne? Eble? Okay. La fina afero, ke ni faru tion, kion ni presas kaj post ni malfermis niajn dosiero: kiam ni malfermis dosiero, ni ĉiam devas memori por fermi ĝin. Ĉar alie ni devos fini filtri la memoro, uzante supren dosieron descriptores. Do por fermi ĝin, kio funkcio do ni uzas? Daniel? [Daniel] fclose? >> Fclose, precize. Do la lasta parto de ĉi tiu problemo estis adekvate fermi la dosieron, uzante la fclose funkcio, kiu nur aspektas tiel. Ne tro freneza. Cool. Do jen problemo 33 en la kvizo. Ni devos definitive pli dosiero / S antaŭvidi. Ni faros iom pli en prelego hodiaŭ, aŭ en sekcio hodiaŭ, ĉar tio kio okazas por formi la kernon de ĉi venonta pset. Ni movi sur de la kvizo je ĉi tiu punkto. Jes? [Charlotte]] Kial fclose (dosiero) anstataŭ fclose (staff.csv)? >> Ha. Ĉar ĝi rezultas ke - tiel la demando, kio estas granda, estas kial, kiam ni skribas fclose, ni skribi fclose (dosiero) stelo variablo kontraste al la dosiernomo, staff.csv? Ĉu tio estas korekta? Yeah. Do ni rigardu. Se mi ŝanĝos al mia tekkomputilo, kaj ni rigardu la fclose funkcio. Do la fclose funkcio fermas rojo kaj ĝi portas en la sagon al la rivereto, ke ni volas fermi, kontraste al la efektiva dosiernomo kiun ni volas fermi. Kaj tiu estas ĉar malantaŭ la scenoj, kiam vi faras alvokon al fopen, kiam vi malfermas dosieron, vi vere atribuo memoro por konservi informojn pri la dosiero. Do vi havas dosieron puntero kiu havas informojn pri la dosiero, kiel ĝi estas malfermita, lia grandeco, kie vi estas nuntempe en la dosiero, por ke vi povas fari legante kaj skribante alvokoj al tiu aparta loko ene de la dosiero. Vi finos fermante la puntero anstataŭ fermante la dosiernomo. Jes? [Daniel] Do, por uzi salajron, vi dirus - kiel faras ĝi preni la eniro de la uzanto? Ĉu fprintf agi kiel GetString en la senco ke ĝi devos nur atendi ke la eniro de la uzanto kaj peti vin tajpi ĉi tio - aŭ atendi por vi tajpi tiujn tri aferojn en? Aux cxu vi bezonos uzi ion por apliki salajron? >> Jes. Do ni ne estas - la demando, kial ni preni la eniro de la uzanto por apliki salajron? Kaj kion ni havas ĉi tie estas la telefonanto de pago, pasis en tiun bastonon struct kun ĉiuj datumoj stokitaj en la struct jam. Do fprintf povas simple skribi ke datumojn rekte al la dosiero. Ne atendante uzanto enigo. La uzanto jam donis la enigo de taŭge meti ĝin en ĉi bastonon struct. Kaj tion, kompreneble, rompus se iu el tiuj indikoj estis nula, do ni rulumu back up tie kaj ni rigardas nian struct. Ni havas ĉenon lasta, kordoj unue, kordoj retpoŝto. Ni nun scias, ke ĉiuj el tiuj vere, sub la kapuĉo, estas char * variabloj. Tio povas aŭ ne povas montrante al nula. Ili povas esti indikante memoro sur la havaĵon, eble memoro sur la stako. Ni ne vere scias, sed se iu el tiuj indikoj estas nulaj, aŭ nevalida, ke tio estos definitive frakasi nian salajron funkcio. Tio estis iu kiu estis speco de preter la kadro de la ekzameno. Ni ne zorgi pri tio. Granda. Okay. Do pasi de la kvizo. Ni fermu ulo, kaj ni tuj rigardi pset 4. Do se vi infanoj rigardi la pset spec, fojo vi povas aliri gxin, cs50.net/quizzes, tuj iros tra kelkaj el la sekcio problemoj hodiaŭ. Mi movo malsupren - sekcio de demandoj komenciĝas la tria paĝo de la pset spec. Kaj la unua parto petas vin iri kaj rigardi la mallongajn sur redireccionando kaj tuboj. Kiu estis speco de cool mallonga, tie vi iun novan, cool komandlinio lertaĵoj kiujn vi povas uzi. Kaj tiam ni havas kelkajn demandojn por vi ankaŭ. Ĉi tiu unua demando pri torentoj, al kiu printf skribas implicite, ni ia menciita malmulta antaŭ momento. Ĉi fprintf ke ni ĵus diskutis prenas en dosiero * torento kiel ĝia argumento. fclose prenas en dosiero * torento kiel bone, kaj la reveno valoro de fopen donas al vi dosiero * torento kiel bone. La kialo ni ne vidis tiujn antaŭ kiam ni pritraktis kun printf estas ĉar printf havas defaŭlta rivereto. Kaj la defaŭlta rivereto al kiu skribas vi trovos el proksimume en la mallonga. Do nepre rigardu ĝin. En la hodiaŭa sekcio, ni iras por paroli iomete pri GDB, ekde la pli familiara vi estas kun gxi, des pli oportuna vi ricevas per ĝi, la pli kapablaj vi estos por fakte ĉasi erarojn en viaj propraj kodo. Ĉi akcelas la procezon de elpurigante supren terure. Do uzante printf, ĉiufoje vi faros, ke vi havas recompilar vian kodon, vi devas kuri ĝin denove, iam vi devas movi la printf alvoko ĉirkaŭe, komenti el kodon, ĝi nur prenas iom da tempo. Nia celo estas provi kaj konvinki vin, ke kun GDB, vi povas esence printf ion en ajna punkto en via kodo kaj vi neniam devas recompilar ĝin. Vi neniam devas starti kaj observu diveni kie printf proksima. La unua afero por fari estas kopii tiun linion kaj akiri la sekcio kodo ekstere de la retejo. Mi kopias ĉi tiu linio de kodo kiu diras, "wget ​​http://cdn.cs50.net". Mi tuj kopii ĝin. Mi iros, por transiri al mia aparaton, malzomi do vi povas vidi kion mi faras, intergluajn ĝin en tie, kaj kiam mi batis Enter, ĉi wget komando laŭvorte estas retejo akiras. Ĝi tuj disbatos tiu dosiero ekstere de la Interreto, kaj tuj savi ĝin al la aktuala dosierujo. Nun, se mi listigi mia aktuala dosierujo vi povas vidi, ke mi havas ĉi section5.zip dosiero dekstre en tie. La maniero trakti kun tiu ulo estas maldensigi ĝin, kion vi povas fari en la komandlinio, ĝuste kiel ĉi tiu. Section5.zip. Tio estos maldensigi ĝin, krei la dosierujon por mi, ŝveligi ĉiuj enhavoj, metis ilin tien. Do nun mi povas eniri en mian sekcio 5 katalogo uzanta la cd komandon. Certe la ekrano uzante klara. Do certe la ekrano. Nun mi havas belan pura fina trakti. Nun, se mi listigi ĉiujn dosierojn kiujn mi vidas en ĉi tiu dosierujo, vi vidas, ke mi havas kvar dosieroj: buggy1, buggy2, buggy3, kaj buggy4. Mi ankaŭ ricevis siajn respondajn. C dosierojn. Ni ne intencas rigardi la. C dosierojn por nun. Anstataŭe, ni tuj uzi ilin kiam ni malfermas GDB. Ni konservis ĉirkaŭ tiel ke ni havas aliron al la efektiva fontkodo kiam ni uzas GDB, sed la celo de tiu parto de la sekcio estas toquetear tie kun GDB kaj vidi kiel ni povas uzi ĝin por kalkuli kio okazas malĝusta kun ĉiu de tiuj kvar kalesxo programoj. Do ni simple tuj ĉirkaŭ la ĉambron vere rapide, kaj mi tuj demandas iu kuri unu el la kalesxo programoj, kaj poste ni iros kiel grupo tra GDB, kaj ni vidos kion ni povas fari por ripari tiujn programojn, aŭ almenaŭ identigi kio okazas erara en ĉiu el ili. Ni komencu super tie kun Daniel. Ĉu vi kuras buggy1? Ni vidu kio okazos. [Daniel] Ĝi diras ke estas apliko kulpo. >> Jes. Ekzakte. Do se mi kuros buggy1, mi ricevas seg kulpo. Je ĉi tiu punkto, mi povus iri kaj malfermi buggy1.c, klopodi malkovri kio okazas erara, sed unu el la plej malaminda aferojn pri ĉi tiu seg kulpo eraron estas ke ĝi ne diras al vi sur kio linio de la programo aĵoj vere iris malbone kaj rompis. Vi ia devas rigardi la kodo kaj kalkuli uzante guess kaj kontroli aŭ printf por vidi kio okazas erara. Unu el la coolest aferojn pri GDB estas kiu estas vere, vere facila elŝeligi la linio je kiu via programo frakasas. Ĝi estas tute valoris por uzi ĝin, eĉ se nur por tio. Do por startigi supren GDB, mi tajpas GDB, kaj tiam mi donos al ĝi la vojon al la plenumebla, ke mi volas kuri. Jen mi tajpas gdb ./buggy1. Hit Eniru. Donas al mi ĉion ĉi informo pri kopirajto, kaj cxi tie vi vidos ĉi linio kiu diras, "Legante simbolojn de / home / jharvard/section5/buggy1. " Kaj se ĉiu iras bone, vi vidos ĝin presi mesaĝon kiu aspektas kiel ĉi tio. Ĝi legos simboloj, ĝi diros "Mi legis simboloj de via ruleblan dosieron," kaj tiam havos ĉi tiu "fakto" mesaĝo super tie. Se vi vidas iun alian variado de tio, aŭ vi vidas ne povis trovi la simboloj aŭ io simila, kion tio signifas, ke vi simple ne kompilis vian ruleblan konvene. Kiam ni kompilos programoj por uzi kun GDB, ni devas uzi tiun specialan-g flago, kaj tio farita de defaŭlta se vi kompili viajn programojn, kun nur tajpi fari aŭ fari kalesxo aŭ fari rekuperi, iu el tiuj. Sed se vi kompili permane kun Clang, tiam vi devos iri en kaj inkluzivas ke-g flago. Je ĉi tiu punkto, nun ke ni havas niajn GDB prompto, ĝi estas bela simpla ruli la programon. Ni povas aŭ tajpi kuri, aŭ ni povas simple tajpi r. Plej GDB komandojn povas esti mallongigita. Kutime al nur unu aŭ kelkaj leteroj, kiujn estas sufiĉe bela. Do Saad, se vi tajpas r kaj batis Enter, kio okazas? [Saad] I got SIGSEGV, segmentación kulpo, kaj tiam ĉio ĉi gobbledygook. >> Jes. Kiel ni vidas sur la ekrano nun, kaj kiel Saad diris, kiam ni tajpi kuri aŭ r kaj batis Enter, ni ankoraŭ preni la sama seg kulpo. Do uzante GDB ne solvas nian problemon. Sed ĝi donas al ni iun gobbledygook, kaj rezultas ke ĉi gobbledygook fakte diras ni kie okazas. Por analizi ĉi iom, tiu ĉi unua bito estas la funkcio en kiu ĉio okazas erara. Estas ĉi __ strcmp_sse4_2, kaj diras al ni ke okazas en tiu dosiero vokis sysdeps/i386, ĉiuj ĉi, denove, ia malordo - sed linio 254. Tio estas speco de malfacile analizi. Kutime kiam vi vidas aĵojn kiel ĉi tiu, tio signifas, ke ĝi estas seg faulting en unu el la sistemo bibliotekoj. Do iel rilatas al strcmp. You guys vidis strcmp antaŭe. Ne tro freneza, sed faras tio signifas, ke strcmp estas rompita aŭ ke estas problemo kun strcmp? Kion vi opinias, Aleksandro? [Aleksandro] Is that - estas 254 la linio? Kaj la - ne la duuma, sed ĝi ne estas lia plafonoj, kaj tiam ne estas alia lingvo por ĉiu funkcio. Ĉu tio estas 254 en tiu funkcio, aŭ -? >> Estas linio 254. Ĝi aspektas kiel en ĉi. S-dosiero, tiel ke estas asembleo kodo probable. Sed, mi supozas la plej prema afero estas, ĉar ni akiris seg kulpo, kaj ĝi ŝajne venas el la strcmp funkcio, tio ĉi implicas, tiam, ke strcmp estas rompita? Ĝi devus ne, espereble. Do nur ĉar vi havas segmentación kulpo en unu el la sistemo funkcias, tipe, ke signifas, ke vi simple ne nomis ĝin ĝuste. La plej rapida afero por fari eltrovi kio vere okazas kiam vi vidas iun freneza kiel ĉi tiu, kiam vi vidos seg kulpo, precipe se vi havas programon ke tio uzante pli ol nur ĉefaj, estas uzi retrospuro. Mi mallongigi retrospuro skribante bt, kontraste al la plena retrospuro vorto. Sed Charlotte, kio okazas kiam vi tajpas bt kaj sukceson Entajpu? [Charlotte] Ĝi montras al mi du linioj, la linio 0 kaj linio 1. >> Jes. Do linio 0 kaj linio 1. Ĉi tiuj estas la efektiva pilo kadroj, kiuj estis nuntempe en ludo, kiam via programo frakasis. Ekde la plejsupra kadro, framo 0, kaj iras al la fundo-plej, kiu estas framo 1. Nia plejsupra kadro estas la strcmp kadro. Vi povas pensi pri tio kiel simila al tiu problemo ni nur faras en la kvizo kun la indikoj, kie ni estis interŝanĝi pilo kadro sur ĉefa pilo kadro, kaj ni havis la variabloj kiuj interŝanĝa uzis sur la variabloj kiuj ĉefa uzis. Jen nia akcidento okazis en nia strcmp funkcio, kiu estis nomita de nia ĉefa funkcio, kaj retrospuro, donas al ni ne nur la funkcioj en kiujn aferojn malsukcesis, sed ĝi estas ankaŭ dirante al ni kie ĉiu estis nomita de. Do se mi rulumu super iom pli dekstre, ni povas vidi ke jes, ni estis sur linio 254 de ĉi strcmp-sse4.s dosiero. Sed la alvoko estis farita je buggy1.c, linio 6. Do tio signifas ke ni povas fari - estas ni povas simple iru kontroli kaj vidu kio okazas ĉe buggy1.c, linio 6. Denove, estas kelkaj manieroj por fari tion. Unu estas por eliri el GDB aŭ havi vian kodo malfermu en alia fenestro kaj kruco referenco. Tio, en kaj de sin, estas sufiĉe utila ĉar nun se vi estas en oficejo horoj kaj kiam vi mem havigis al seg kulpo kaj via TF la mirantaj kie ĉiu estis rompi, vi povas simple diri: "Ho, linio 6. Mi ne scias kio okazas, sed io pri linio 6 provokas mian programon por rompi. " La alia maniero por fari ĝin estas vi povas uzi tiun komandon nomis lerta en GDB. Vi povas ankaŭ mallongigi ĝin l. Do, se ni batis l, kion ni preni tie? Ni preni tuta amaso de strangaj aĵoj. Ĉi tiu estas la reala asembleo kodo kiu estas en strcmp_sse4_2. Ĉi aspektas ia funky, kaj la kialo estas duumaj ĉi estas ĉar ĝuste nun, GDB havas ni en kadro 0. Do aùton ni rigardas variabloj, ajna tempo ni rigardas fontkodo, ni rigardas fontkodon kiu rilatas al la pilo kadro ni aktuale in Do, por akiri ion signfa, ni devas movi al pilo kadro kiu faras pli senco. En ĉi tiu kazo, la ĉefa pilo kadro farus iom pli senso, ĉar tio estis fakte la kodo kiun ni skribis. Ne la strcmp kodo. La vojo vi povas movi inter kulisoj, en ĉi tiu kazo, ĉar ni havas du, ni havos 0 kaj 1, vi faru tion kun la supren-malsupren ordonojn. Se mi movi supren unu kadro, nun mi estas en la ĉefa pilo kadro. Mi povas movi malsupren reiri al kie mi estis, iru denove, iru malsupren denove, kaj iru denove. Se vi iam fari vian programon en GDB, vi ricevas akcidento, vi ricevas la retrospuro, kaj vi vidos, ke estas en iu dosiero, kiun vi ne scias kio okazas. Vi provu listo, la kodo ne aspektas familiaraj al vi, rigardu vian kadroj kaj eltrovi kie vi estas. Vi estas probable en la malĝusta pilo kadro. Aŭ almenaŭ vi en pilo kadro kiu estas ne tia, oni povas vere elpurigi. Nun ke ni estas en la taŭgan pilo kadro, ni estas en ĉefa, nun ni povas uzi la liston komando elkompreni kiel la linio estis. Kaj vi povas vidi gxin, tio presita ĝin por ni ĉi tie. Sed ni povas kolizii listigi ĉiuj la sama, kaj listo donas al ni tiu bela printaĵo de la reala fonto kodo kiu okazas en ĉi tie. En aparta, ni povas rigardi linio 6. Ni povas vidi kio okazas tie. Kaj ĝi aspektas kiel ni fari ĉenon komparo inter la ĉeno "CS50 rokoj" kaj argv [1]. Ion pri ĉi tio frakasi. Do Missy, ĉu vi havas pensojn sur kio oni povus okazas ĉi tie? [Missy] Mi ne scias kial estas frakasi. >> Vi ne scias kial estas frakasi? Jimmy, ajna pensoj? [Jimmy] Mi ne tute certas, sed la lasta fojo ni uzis string kompari, aŭ strcmp, ni havis kiel tri malsamaj kazoj sub ĝi. Ni ne havas ==, mi ne pensas, ĝuste en tiu unua linio. Anstataŭe ĝi estis disigita en tri, kaj unu estis == 0, estis <0, mi pensas, kaj unu estis> 0. Do eble io simila? >> Jes. Do tie estas tio temo de ni faras la komparon korekte? Stella? Ajna pensoj? [Stella] Mi ne estas certa. >> Not sure. Daniel? Pensoj? Okay. Ĝi rezultas kio okazas ĉi tie estas kiam ni kuris la programo kaj ni ekhavis la seg kulpo, kiam vi kuris de la programo por la unua fojo, Daniel, vi donu ajna komandlinio argumentoj? [Daniel] No >> No En tiu kazo, kio estas la valoro de argv [1]? >> Ne estas valoro. >> Ĝuste. Nu, ne estas taŭgaj string valoro. Sed estas iu valoro. Kio estas la valoro kiu prenas stokitaj en tie? >> A rubo valoro? >> Estas ĉu rubo valoro aŭ, en ĉi tiu kazo, Fine de la argv tabelo estas ĉiam finita kun nula. Do kio reale got stokitaj en tie estas nula. La alia maniero por solvi tion, anstataŭ pensi ĝin tra, estas klopodi presi ĝin. Tie estas kie mi diris ke uzi GDB estas granda, ĉar vi povas presi ĉiuj variabloj, ĉiuj valoroj kiujn vi volas uzante ĉi oportunan-dando p komando. Do se mi tajpas p kaj tiam mi tajpi la valoro de variablo aux la nomo de variablo, diru argc, mi vidas ke argc estas 1. Se mi volas presi argv [0], mi povas tion fari nur tiel. Kaj kiel ni vidis, argv [0] estas ĉiam la nomo de via programo, ĉiam la nomo de la plenumebla. Jen vi vidas ĝi estas atingis la kompletan padon nomo. Mi povas ankaŭ printi argv [1] kaj vidu kio okazas. Jen ni akiris tian mistika valoro. Ni atingis tiun 0x0. Memoru komence de la termino, kiam ni parolis pri deksesuma numero? Aŭ kiu iom demando fine de pset 0 pri kiel reprezenti 50 en deksesuma? La vojo ni skribi deksesumajn numerojn en CS, nur por ne konfuzi nin kun decimalaj nombroj, estas ni ĉiam prefikso ilin kun 0x. Do ĉi prefikson 0x ĉiam nur signifas interpreti la sekvan numeron kiel deksesuma nombro, ne kiel ĉenon, ne kiel dekuma nombro, ne kiel duuma nombro. Ekde la nombro 5-0 estas valida nombro en deksesuma. Kaj ĝi estas nombro en dekuma, 50. Do ĉi tiu estas kiom ni disambiguate. Do 0x0 per deksesumaj 0, kiu estas ankaŭ dekuma 0, duuma 0. Estas nur la valoron 0. Ĝi rezultas ke ĉi tio estas kion nula estas, efektive, en memoro. Nula estas nur 0. Ĉi tie, la elemento stokitaj en argv [1] estas nula. Do ni provas kompari niajn "CS50 rokoj" kordoj al nula linio. Do dereferencing nula, klopodante atingi aĵojn al nula, tiuj estas tipe tuj kaŭzos ian segmentación kulpo aŭ aliaj malbonaj aferoj okazos. Kaj ĝi rezultas ke strcmp ne kontrolu vidi ĉu vi jam pasis en valoro kiu estas nula. Pli ĝuste, ĵus antaŭeniras, provas fari lian aferon, kaj se seg kulpoj, ĝi seg kulpojn, kaj tio estas via problemo. Vi devas iri ripari ĝin. Vere rapide, kiom eble ni ripari tiun problemon? Charlotte? [Charlotte] Vi povas kontroli per se. Do se argv [1] estas nula, == 0, tiam revenu 1, aŭ iu [nekompreneblaj]. >> Jes. Do jen unu granda maniero fari ĝin, kiel ni povas kontroli vidi, la valoron ni baldaŭ pasos en strcmp, argv [1], ĉu nula? Se ĝi estas nula, tiam ni povas diri estas bone, aborti. Pli komuna maniero por fari ĉi estas uzi la argc valoro. Vi povas vidi ĉi tie komence de ĉefa, ni preterlasis tiun unuan provon kiu ni kutime faras kiam ni uzas komandlinio argumentoj, kiu estas por testi ĉu nia argc valoro estas kion ni atendas. En ĉi tiu kazo, ni atendas almenaŭ du argumentoj, la nomo de la programo plus unu alia. Ĉar ni volis uzi la dua argumento ĉi tie. Do havi ian provon antauxe, antaux nia strcmp alvoko ke provoj ĉu argv estas almenaŭ 2, ankaŭ fari la samon tiaj aferoj. Ni povas vidi se kiu laboras por kuri la programon denove. Vi povas ĉiam rekomenci vian programon ene GDB, kiu estas vere bela. Vi povas kuri, kaj kiam vi pasos en argumentoj al via programo, ilin pasas en kiam vi nomas kuri, ne kiam vi startigi supren GDB. Tiel vi povos teni alpreĝante vian programon kun malsamaj argumentoj ĉiufoje. Tiel kuras, aŭ denove, mi povas tajpi r, kaj ni vidu kio okazas se ni tajpi "saluton". Ĝi ĉiam demandi ĉu vi volas komenci ĝin de la komenco denove. Kutime, vi volas komenci ĝin de la komenco denove. Kaj je tiu punkto, ĝi restarts ĝin denove, presas el la programo kiu ni kuris, buggy1, kun la argumento saluton, kaj presas tiun normon eliro; diras, "Vi ricevos D," malgaja vizaĝo. Sed ni ne seg kulpo. Ĝi diras ke procezo eliris kutime. Por ke aspektas sufiĉe bone. Ne plu seg kulpo, ni faris estinteco, tiel ĝi aspektas kiel tio estis ja la seg kulpo cimo ke ni ricevas. Bedaŭrinde, ĝi diras ke ni estas duumaj D. Ni povas reiri kaj rigardu la kodon kaj vidi kio okazas tie elŝeligi kio estis - kial estis rakontanta al ni, ke ni akiris D. Vidu, jen estis ĉi printf dirante ke vi ricevis D. Se ni tajpi liston, ke vi tenas tajpi listo, ĝi gardas ripetanta tra via programo, tial ĝi montros al vi la unuaj kelkaj linioj de via programo. Tiam montros al vi la sekvaj linioj, kaj la sekvan eron kaj la sekvan eron. Kaj ĝi malebligos ke provante iri malsupren. Kaj nun ni ricevos por "vicigi nombro 16 estas el teritorio." Ĉar ĝi nur havas 15 liniojn. Se vi atingos tiun punkton kaj via scivolante, "Kion mi faru?" vi povas uzi la helpon komando. Uzu helpi kaj tiam donu al ĝi la nomon de komando. Kaj vi vidos la GDB donas al ni ĉion ĉi speco de aĵoj. Ĝi diras, "Kun neniu argumento, listas dek pli linioj post aŭ ĉirkaŭ la antaŭa listo. Listo - listas la dek linioj antaŭ - " Do ni provu uzi listo minus. Kaj kiu printas la 10 linioj antaŭa; vi povas ludi tie kun listo iom. Vi povas fari liston, listo - vi povas eĉ doni listigi kelkajn, kiel listo 8, kaj ĝi devos printi la 10 linioj ĉirkaŭ linio 8. Kaj vi povas vidi kio okazas ĉi tie estas vi havas simplan se alia. Se vi tajpas en CS50 rokoj, presas el "Vi ricevas A." Alie ĝi presas el "Vi ricevas D." Bummer vilaĝon. Bone. Jes? [Daniel] Do, kiam mi provis fari CS50 rokoj sen la citiloj, diras "Vi ricevas D." Mi bezonas la citaĵojn por akiri ĝin por labori, kial estas tio? >> Jes. Rezultas ke kiam - tiu ĉi estas alia amuza iom sojfabo - kiam vi kuras la programon, se ni ruli ĝin kaj ni entajpi CS50 rokoj, samkiel Daniel diris li faris, kaj vi batis Enter, ĝi ankoraŭ diras ni preni D. Kaj la demando, kial tio estas? Kaj ĝi rezultas ke ambaŭ niaj fina kaj GDB analizi tiujn kiel du apartaj argumentoj. Ĉar kiam estas spaco, ke tio implicis tiel la unua argumento finigxis la sekvanta argumento estas por komenci. La maniero por kombini tiujn en du aux sorry, en unu argumento, estas uzi la citilojn. Do nun, se ni metas ĝin en citaĵoj kaj ruli ĝin denove, ni ricevas A. Do nur por recap, neniu citaĵoj, CS50 kaj rokoj estas analizitaj kiel du apartajn argumentojn. Kun citaĵoj, ĝi estas analizitaj kiel unu argumento aro. Ni povas vidi ĉi tion kun Haltpunkto. Ĝis nun ni estis kuranta nia programo, kaj ĝi estas estinta kurante ĝis ĉu ĝi seg kulpoj aŭ sukcesoj eraron aŭ ĝis ĝi eliris kaj ĉiuj estis plene fajna. Tio ne estas nepre la plej utila afero, ĉar kelkfoje vi havas eraron en via programo, sed ne kaŭzante segmentación kulpo. Tio ne kaŭzante via programo por halti aŭ nenion tiel. La maniero akiri GDB paŭzi vian programon en aparta punkto Estas por kontrauxmeti Haltpunkto. Vi povas aŭ fari tion per opcio oni Haltpunkto sur funkcio nomo aŭ vi povas agordi Haltpunkto sur aparta linio de kodo. Mi ŝatas starigis breakpoints sur funkcio nomoj, ĉar - facile memorebla, kaj se vi efektive iru kaj ŝanĝu vian fontkodon ĝis iom, tiam via Haltpunkto efektive resti ĉe la sama loko en viaj kodo. Dum se vi uzas linio nombroj, kaj la linio nombroj ŝanĝi ĉar vi aldoni aŭ forigi iom da kodo, tiam via breakpoints estas ĉiuj tute ŝraŭbita supren. Unu de la plej komunaj aferoj mi estas metita al Haltpunkto sur la ĉefa funkcio. Ofte mi startigi supren GDB, mi tajpas b ĉefa, batis Enter, kaj tio estos starigis Haltpunkto sur la ĉefa funkcio kiu nur diras, "pauxzo la programo kiam vi komencos kuri," kaj aliflanken, kiam mi kuros mia programo kun, ni diru, CS50 rokoj kiel du argumentoj kaj batis Enter, alvenas al la ĉefa funkcio kaj li por rajto je la unua linio, ĝuste antaŭ ĝi taksas la strcmp funkcio. Ekde mi paŭzis, nun mi povas komenci mucking sin kaj vidi kio okazas kun ĉiuj de la malsamaj variabloj kiuj pasis en mian programon. Ĉi tie mi povas printi argc kaj vidu kio okazas. Vidu ke argc estas 3, ĉar ĝi estas prenita 3 malsamajn valorojn en ĝi. Oni ricevis la nomon de la programo, ĝi estas ekhavis la unua argumento kaj la dua argumento. Ni povas presi tiujn ekster per rigardante argv [0], argv [1], kaj argv [2]. Do nun vi povas ankaŭ vidi kial ĉi strcmp alvokon tuj malsukcesos, ĉar vi vidas, ke ĝi disigas la CS50 kaj la rokoj en du apartaj argumentoj. Je ĉi tiu punkto, unufoje vi batis Haltpunkto, vi povas daŭre pasas tra via programo linio por linio, kontraste ekde via programo denove. Do se vi ne volas komenci vian programon denove kaj nur daŭrigi de ĉi tie, vi povas uzi la komandon daŭrigi kaj daŭre kuros la programon al la fino. Samkiel ĝi faris ĉi tie. Tamen, se mi restartu la programo, CS50 rokoj, ĝi batas mia Haltpunkto denove, kaj ĉi tiu tempo, se mi ne volas ĝuste iri la tutan vojon tra la resto de la programo, Mi povas uzi la sekvan komandon, kiun mi ankaŭ mallongigi kun n. Kaj tion faros paŝo tra la programon linion por linio. Do vi povas rigardi kiel aĵoj ekzekuti, kiel variabloj ŝanĝo, kiel aĵoj get ĝisdatigita. Kiu estas bela agrabla. La alia cool afero estas iom ol ripetante la saman ordonon denove kaj denove kaj denove, se vi nur batis Entajpu - tiel ĉi tie vi vidas mi ne tajpis en nenio - se Mi nur batis Enter, ĝi ripetos la antaŭa komando, aŭ la antaŭa GDB komando kiu mi ĵus enmetita tien Mi povas teni bati Eniru kaj ĝi malebligos ke tretante per mia kodo linio por linio. Mi kuraĝigas vin infanoj iri kontrolu aliajn kalesxo programoj ankaŭ. Ni ne havas tempon por trairi ĉiuj ili hodiaŭ en sekcio. La fonta kodo estas tie, do vi povas ia vidi kio okazas malantaŭ la scenoj se vi iĝas vere pusxis, sed almenaŭ, simple praktiki booting supren GDB, kurante la programo ĝis ĝi rompiĝas sur vi, atingi la retrospuro, decidi kio funkcii la akcidento estis en, kio linio estis plu, presi iun variablo valoroj, nur tiel vi ricevas sento por tio, ĉar tio estos vere helpi vin tuj antaŭen. Je ĉi tiu punkto, ni tuj forlasis el GDB, kiu vi uzas quit aux simple q. Se via programo estas en la mezo de kurante ankoraŭ, kaj ĝi ne eliris, ĝi estos ĉiam demandas vin, "Ĉu vi vere vere volas forlasi?" Vi povas simple batis jes. Nun ni iras por rigardi la sekvanta problemo ni havas, kiu estas la kato programo. Se vi rigardas la mallonga sur redireccionando kaj tuboj, vi vidos ke Tommy uzas tiun programon kiu esence presas ĉiujn eligo de dosiero al la ekrano. Do se mi kuri kato, tiu estas fakte korpigita programon al la aparato, kaj se vi havas Mac vi povas fari tion en via Mac tro, se vi malfermas terminalo. Kaj ni - kato, diru, cp.c, kaj batis Eniru. Kio ĉi faris, se ni rulumu supren iomete kaj vidu kie ni kuris la linio, aŭ kie ni kuris la kato komando, ĝi laŭvorte ĵus presita ekster la enhavo de cp.c al nia ekrano. Ni povas ruli ĝin denove kaj vi povas meti en plurajn dosierojn kune. Do vi povas fari kato cp.c, kaj poste ni povas ankaŭ concatenate la cat.c dosiero, kiu estas la programo ni volis skribi, kaj ĝi devos presi ambaŭ dosieroj malantaŭo al malantaŭo al nia ekrano. Do, se ni rulumu supren iom, ni vidas ke kiam ni kuris ĉi kato cp.c, cat.c, unue presita ekster la cp-dosiero, kaj poste sub ĝin, presita ekster la cat.c dosiero dekstre cxi tie. Ni tuj uzos tiun por nur ricevi niajn piedojn malsekaj. Ludi tie kun simpla impreso al la fina, vidu kiel tiu funkcias. Se vi infanoj malfermi kun gedit cat.c, batis Enter, vi povas vidi la programon kiu ni volis skribi. Ni komprenis tiun belan kaldrono telero, do ni ne devas pasi tempon tajpi cxiuj eksteren. Ni ankaŭ kontroli la nombro de argumentoj pasis in Ni presi belan uzado mesaĝo. Ĉi tiu estas la speco de afero kiun, denove, kiel ni parolis pri, ĝi estas preskaŭ kiel muskolo memoro. Nur memoras teni fari la saman specon de ŝtofo kaj ĉiam videbligi el ia helpema mesaĝon por ke la homo estu kiel kuras via programo. Kun kato, ĝi estas bela simpla; ni nur tuj iros tra ĉiuj malsamaj argumentoj kiuj pasis al nia programo, kaj ni tuj presi ilia enhavo al la ekrano unuope. Por presi dosierojn al la ekrano, ni tuj faros iun tre simila al kio ni faris al la fino de la kvizo. Fine de la kvizo, ke dungi programo, ni devis malfermi dosieron, kaj poste ni devis presi ĝin. En ĉi tiu kazo, ni tuj malfermi dosieron, kaj ni tuj legis el gxi anstataŭe. Tiam ni iras por presi, anstataŭ al dosiero, ni tuj presi al la ekrano. Do presi al la ekrano vi ĉiuj faris antaŭe kun printf. Do tio ne tro freneza. Sed legante dosieron estas speco de stranga. Ni iros tra tiu iomete samtempe. Se vi infanoj reiros al tiu lasta problemo en via kvizo problemo 33, la unua linio kiu ni faros ĉi tie, malfermante la dosieron, estas tre simila al tio, kion ni faris tie. Do Stella, kion faras tiu linio aspekti, kiam ni malfermas dosieron? [Stella] Ĉefurbo DOSIERO *, dosiero - >> Bone. >> - Estas egala al fopen. >> Yup. Kiu en ĉi tiu kazo estas? Ĝi estas en la komento. >> Ĝi estas en la komento? argv [i] kaj r? >> Ekzakte. Ĝuste plu. Do Stella estas tute prava. Ĉi tio estas kion la linio aspektas. Ni tuj akiri dosieron rivereto variablo, stoki ĝin en DOSIERO *, do ĉiuj ĉapoj, DOSIERO, *, kaj la nomo de ĉi tiu variablo estos dosiero. Ni povus nomi ĝin kion ajn ni volas. Ni povus nomi ĝin first_file, aŭ file_i, kion ajn ni ŝatus. Kaj tiam la nomo de la dosiero estis aprobita en la komanda linio al ĉi tiu programo. Do ĝi estas stokita en argv [i,] kaj poste ni iras por malfermi ĉi dosieron en legu modo. Nun kiam ni malfermis la dosieron, kio estas la afero, ke ni ĉiam devas memori fari kiam ni malfermis dosieron? Fermi ĝin. Do Missy, kiel ni fermi dosieron? [Missy] fclose (dosiero) >> fclose (dosiero). Ekzakte. Granda. Okay. Se ni rigardas tiun fari komenton ĉi tie, diras, "Malfermu argv [i] kaj presi ĝia enhavo al stdout." Normo ekster estas stranga nomo. Stdout estas nur nia maniero diri ni volas presi ĝin al la fina, ni volas presi ĝin al cxefeligo rivereto. Ni povas vere forigi tiun komenton ĉi tie. Mi tuj kopii ĝin kaj almeti ĝin ekde tio kion ni faris. Je ĉi tiu punkto, nun ni devas legi la dosieron iom post iom. Ni diskutis kelkajn manierojn legi dosierojn. Kio tiuj estas viaj preferitaj ĝis nun? Kiuj manieroj vi vidis aŭ ĉu vi memoras, legi dosierojn? [Daniel] fread? >> Fread? Do fread estas unu. Jimmy, ĉu vi konas aliajn? [Jimmy] No >> Bone. Nope. Charlotte? Aleksandro? Ajna aliaj? Okay. Do la aliaj aĵoj estas fgetc, estas kiu ni uzos tre. Ekzistas ankaux fscanf; you guys vidi mastro ĉi tie? Ili ĉiuj komenciĝas per f. Ion fari kun dosiero. Estas fread, fgetc, fscanf. Ĉi tiuj estas ĉiuj la legadon funkcioj. Por skribi ni havas fwrite, ni havas fputc anstataŭ fgetc. Ni ankaŭ fprintf like ni vidis en la kvizo. Ekde ĉi tiu estas problemo kiu engaĝas legado de dosiero, nin tuj uzi unu el tiuj tri funkcioj. Ni ne intencas uzi tiujn funkciojn cxi tie. Ĉi tiuj funkcioj estas ĉiuj troviĝas en la norma / S biblioteko. Do, se vi rigardas la supro de tiu programo, vi povas vidi, ke ni jam inkludis la kaplinion dosiero por la normo / S biblioteko. Se ni volas eltrovi kiujn oni volas uzi, ni povas cxiam malfermi la viro paĝoj. Do ni povas tajpi viro stdio kaj legu pri la stdio enigo kaj eligo funkcioj en C. Kaj ni povas jam vidi ho, rigardu. Oni mencii fgetc, ĝi estas mencii fputc. Do vi povas sondi malsupren iom kaj rigardu, ekzemple, fgetc kaj rigardu lian viro paĝo. Vi povas vidi ke ĝi iras kune kun tuta amaso de aliaj funkcioj: fgetc, fgets, getc, getchar, prenas, ungetc, kaj lia eniro de karakteroj kaj kordoj. Do jen kiel ni legas en karakteroj kaj kordoj de dosieroj de norma enigo, kiu estas fundamente de la uzanto. Kaj jen kiel ni faras en reala C. Do tiu estas ne uzante la GetString kaj GetChar funkcioj ke ni uzis de la CS50 biblioteko. Ni tuj faros tiun problemon en paro da manieroj por ke vi povas vidi du malsamaj manieroj de fari tion. Tiel la fread funkcio ke Daniel menciitaj kaj fgetc estas bonaj manieroj por fari ĝin. Mi kredas fgetc estas iom pli facila, ĉar ĝi nur havas, kiel vi vidas, unu argumento, la DOSIERO * ke ni provas legi la karakteron de, kaj lia reveno valoro estas int. Kaj jen estas iom konfuza, ĉu ne? Ĉar ni estas duumaj karaktero, do kial ne ĉi tiu reveno al char? You guys havas ideojn pri kial ĉi eble ne revenos al char? [Missy respondoj, nekomprenebla] >> Jes. Do Missy estas tute prava. Se estas Askio, tiam ĉi tiu entjero povus esti mapita al reala char. Povus esti ASCII, kaj tio estas prava. Tio estas ĝuste tio, kio okazas. Ni uzante int simple ĉar ĝi havas pli bitoj. Ĝi estas pli granda ol char; nia char nur havas 8 bitojn, ke 1 bajto en nia 32-bita maŝinoj. Kaj int havas ĉiujn 4 bajtoj 'valoro de spaco. Kaj ĝi rezultas ke la vojo fgetc funkcias, se ni rulumu malsupren en nia sinopsis en cxi tiu viro paĝo iomete, rulumu tuta vojo malsupren. Rezultas, ke ili uzas tiun specialan valoron nomis EOF. Ĝi estas speciala konstanta kiel la reveno valoro de la fgetc funkcio kiam vi frapis la fino de la dosiero aŭ se vi ricevas eraron. Kaj ĝi rezultas ke fari tiujn komparojn kun EOF konvene, vi volas havi tiun ekstran kvanton de informo kiun vi havas en int kiel kontraŭ uzante char variablo. Kvankam fgetc estas efektive duumaj karaktero de dosiero, vi volas memori ke estas reveni iu kiu estas de tipo int al vi. Kiu diris, tio estas sufiĉe facila uzi. Oni tuj donos al ni karaktero, do ĉiuj ni devas fari estas subteni petante la dosiero, "Donu al mi la venonta signo, donu al mi la venonta signo, donu al mi la venonta signo" ĝis ni atingos la finon de la dosiero. Kaj tio estos tiri en unu signo samtempe el nia arkivo, kaj poste ni povas fari kion ajn ni ŝatas ĝin. Ni povas gardi ĝin, ni povas aldoni ĝin al ŝnuro, ni povas presi ĝin. Ĉu iu el tio. Zoom reen eksteren kaj tuj reen al nia cat.c programo, se ni tuj uzi fgetc, kiom eble ni alproksimigi tiun sekva linio de kodo? Ni tuj uzos - fread faros ion iomete malsamaj. Kaj ĉi-foje, ni nur tuj uzos fgetc akiri unu signo samtempe. Procesi tutan dosieron, kio povus ni devas fari? Kiom da karakteroj estas tie en dosiero? Estas tre. Do vi probable volas unu kaj poste alia kaj akiri alian kaj atingi alian. Kia algoritmo vi pensas, ke ni eble devus uzi ĉi tie? Kian -? [Aleksandro] A por buklo? >> Ekzakte. Iu tipo de ciklo. A por buklo estas fakte granda, en ĉi tiu kazo. Kaj kiel vi diras, ĝi sonas kiel vi deziras buklo dum la tuta dosiero, duumaj karaktero samtempe. Ajna sugestojn sur kion tio povus aspekti kiel? [Aleksandro, nekomprenebla] >> Konsentite, ĝuste diru al mi en la angla kion vi provas fari? [Aleksandro, nekomprenebla] Do ĉi-kaze, tio sonas kiel ni ĵus provas buklo dum la tuta dosiero. [Aleksandro] Do i > La grandeco de -? Mi supozas ke la grandeco de la dosiero, ĉu ne? La grandeco - we'll ĝuste skribi ĝin kiel ĉi tio. Grandeco de dosiero provizore, i + +. Do rezultas ke la vojo vi ĉi tion uzante fgetc, kaj ĉi estas nova, estas ke ne estas facila maniero por simple akiri la grandeco de dosiero kun tiu "sizeof" tipo de konstrui ke vi vidis antaŭe. Kiam ni uzas tiun fgetc funkcio, ni enkonduki ian nova, funky sintakson por ĉi por ciklo, kie anstataŭ uzi nur bazajn nombrilo iri karaktero de karaktero, ni iras al meso unu signo samtempe, unu signo samtempe, kaj la maniero ni scias ni fine ne kiam ni kalkulis certa nombro da signoj, sed kiam la karaktero ni eltiri estas tiu speciala fino de dosiero karaktero. Do ni povas fari ĉi tion - mi nomas tiun ch, kaj ni iras al pravalorizi ĝin kun nia unua alvoko por ricevi la unuan karakteron el la dosiero. Do ĉi tiu parto dekstra tie, ĉi tiu tuj akiri karaktero el la dosiero kaj stoki ĝin en la variablo ch. Ni tuj observu fari ĉi ĝis ni atingos la finon de la dosiero, kion ni faru por provi por la karaktero ne esti egala al tiu speciala EOF karaktero. Kaj tiam anstataŭ fari ch + +, kiu ĵus pliigo de la valoro, tial se ni legis A el la dosiero, majuskla A, diru, ch + + donus al ni b, kaj tiam ni volonte akiri c kaj tiam d. Tio klare ne kio ni volas. Kion ni volas tie en ĉi tiu lasta bito ni volas ricevi la venonta signo de la dosiero. Do kiel povas ni preni la venonta signo de la dosiero? Kiel ni atingas la unuan karakteron de la dosiero? [Studenta] fgetfile? >> Fgetc, aŭ, sorry, vi estis plene pravas. Mi misspelled ĝin prava. Do jes. Jen anstataŭ fari ch + +, ni nur iri nomi fgetc (dosiero) denove kaj gardi la rezulto en nia sama ch variablo. [Studenta demando, nekomprenebla] >> Tie estas kie tiuj DOSIERO * infanoj estas specialaj. La vojo ili laboras estas ili - kiam vi unue malfermi - kiam vi unue fari tiun fopen alvoko, la DOSIERO * efektive servas kiel sagon al la komenco de la dosiero. Kaj tiam ĉiu tempo vi nomas fgetc, ĝi movas unu signo tra la dosiero. Do kiam ajn vi nomas tiun, vi pliigante la dosiero puntero de unu signo. Kaj kiam vi fgetc denove, vi movis ĝin alian karakteron kaj alia karaktero kaj alian karakteron kaj alian karakteron. [Studenta demando, nekomprenebla] >> Kaj that's - yeah. Estas speco de magio ĉi sub la kapuĉo. Vi nur observu pliigante tra. Je ĉi tiu punkto, vi estas kapabla reale labori kun karaktero. Do kiel povas oni presi ĉi al la ekrano, nun? Ni povas uzi la saman printf aĵo kiun ni uzis antaŭe. Ke ni uzis la tuta semestro. Ni povas nomi printf, kaj ni povas pasi en la karaktero simple tiel. Alia maniero por fari ĝin estas anstataŭ uzi printf kaj devante fari ĉi formato kordoj, ni povas ankaŭ uzi unu el la aliaj funkcioj. Ni povas uzi fputc, kiu presas karakteron al la ekrano, krom se ni rigardas fputc - lasu min malzomi iomete. Ni vidu kion estas agrable estas portas en la karaktero kiu ni legis uzante fgetc, sed tiam ni devas doni ĝin rojo presi al. Ni povas ankaŭ uzi la putchar funkcio, kiu metos rekte al la normo eksteren. Do estas tuta aro da malsamaj ebloj kiujn ni povas uzi por presado. Ili estas ĉiuj en la norma / S biblioteko. Kiam ajn vi volas presi - tiel printf, implicite, presos al la speciala normo ekster rivereto, kiu estas kiu stdout. Do ni povas simple raporti al ĝi kiel speco de ĉi magio valoro, stdout en ĉi tie. Oops. Metu la punktokomo ekstere. Tio estas tre nova, funky informoj en ĉi tie. Multaj ĉi estas tre idiomáticos, en la senso ke tiu estas kodo kio estas skribita tiamaniere nur ĉar ĝi estas pura legi, facile legebla. Estas multaj malsamaj manieroj fari ĝin, multaj malsamaj funkcioj povas uzi, sed ni emas simple sekvi tiuj samaj mastroj super kaj super. Do ne miru se vi vidas kodo kiel tiu venas denove kaj denove. Bone. Je ĉi tiu punkto, ni bezonas rompi por la tago. Dankon pro veni. Dankon pro rigardante se vi estas ensalutintaj. Kaj ni vidos vin proksima semajno. [CS50.TV]