[Powered by Google Translate] [SEHEMU 5: Chini starehe] [Nate Hardison, Chuo Kikuu cha Harvard] [Hii ni CS50.] [CS50.TV] Hivyo kuwakaribisha nyuma, guys. Karibu sehemu ya 5. Katika hatua hii, baada ya kumaliza jaribio 0 na wakayaona jinsi umefanya kosa, hopefully unajisikia kweli nzuri kwa sababu mimi nilikuwa hisia sana na alama katika sehemu hii. Kwa watazamaji wetu online, tulikuwa na wanandoa wa maswali kuhusu miwili iliyopita matatizo juu ya kuweka tatizo - au juu ya chemsha bongo, badala. Hivyo sisi ni kwenda juu ya wale kweli haraka ili kila mtu anaona kile kilichotokea na jinsi ya kwenda kupitia ufumbuzi halisi badala ya kuangalia ufumbuzi yenyewe. Sisi ni kwenda kwenda juu ya wanandoa wa mwisho wa matatizo kweli haraka, 32 na 33. Tu, tena, ili watazamaji online unaweza kuona hili. Kama wewe kugeuka kwa tatizo lako 32, ambayo ni kwenye ukurasa wa 13, 13 nje ya 16, tatizo ni 32 wote kuhusu swaps. Ilikuwa wote kuhusu swapping integers mbili. Ni tatizo kwamba sisi d wamekwenda juu ya wanandoa wa nyakati katika hotuba. Na katika hapa, nini sisi walikuwa kuuliza wewe kufanya ni haraka kumbukumbu kuwaeleza. Kujaza katika maadili ya vigezo kama wao ni juu ya stack kama code huenda kwa njia ya kazi hii byta. Hasa, nini sisi tunataka - I'm kwenda kuweka hii iPad chini - hasa, nini sisi tunataka ni mstari huu kuhesabiwa 6 hapa hapa. Na ni kuhesabiwa 6 kwa ajili tu contiguity na tatizo uliopita. Nini tunataka kufanya ni kuonyesha au studio hali ya kumbukumbu kama ni wakati sisi nitafanya hii idadi mstari 6, ambayo ni ufanisi kurudi kutoka byta kazi yetu hapa hapa. Kama sisi kitabu chini hapa, tumeona kwamba anwani ya kila kitu katika kumbukumbu yalitolewa kwa ajili yetu. Hii ni muhimu sana, tutaweza kuja nyuma yake katika muda tu. Na kisha chini hapa chini, sisi alikuwa kidogo kumbukumbu mchoro kwamba sisi ni kwenda kwa kutaja. I have kweli jambo hili nje kwenye iPad yangu. Hivyo nina kwenda kwa Alternate na kurudi kati ya iPad na kanuni hii tu kwa ajili ya kumbukumbu. Hebu kuanza. Kwanza, hebu kuzingatia michache ya kwanza ya mistari ya haki kuu hapa. Kuanza, tunakwenda initialize x na y kwa 1 na 2. Hivyo tuna mbili vigezo integer, wao ni wawili kwenda kuwekwa katika stack. Sisi ni kwenda kuweka 1 na 2 katika wao. Hivyo kama mimi flip juu kwa iPad wangu, hopefully, hebu angalia - Apple TV mirroring, na kuna sisi kwenda. Sawa. Hivyo kama mimi flip juu kwa iPad wangu, Mimi nataka initialize x na y kwa 1 na 2. Sisi kufanya hivyo kwa urahisi kabisa kwa kuandika katika kisanduku 1 alama x na 2 katika sanduku alama y. Haki rahisi. Hivyo sasa hebu kwenda nyuma ya mbali, kuona nini kitatokea. Hivyo hii ni mstari unaofuata ambapo mambo kupata gumu. Sisi kupita anwani ya x na anuani ya y kama vigezo na b kwa kazi byta. anuani ya x na anuani ya y ni mambo ambayo hatuwezi mahesabu bila akimaanisha risasi haya anasema haki ya chini hapa. Na bahati nzuri, kwanza mbili risasi pointi kutuambia nini hasa majibu ni. anuani ya x katika kumbukumbu ni 10, na anuani ya y katika kumbukumbu ni 14. Hivyo wale ni maadili ambayo kupata kupita katika kama na b juu juu katika byta kazi yetu. Hivyo tena, byte nyuma mchoro wetu, naweza kuandika 10 katika na 14 katika b. Sasa, hatua hii ni mahali ambapo sisi kuendelea na kubadilishana. Hivyo flipping nyuma mbali tena, tunaona kwamba njia byta kazi ni mimi kwanza dereference na kuhifadhi matokeo katika TMP. Hivyo operator dereference anasema, "Hey Treat yaliyomo ya kutofautiana kama anwani.. Nenda chochote ni kuhifadhiwa katika anuani hiyo, na mzigo huo. " Nini mzigo nje ya kutofautiana ni kwenda kuhifadhiwa katika TMP variable yetu. Flipping nyuma iPad. Kama sisi kwenda kushughulikia 10, tunajua kwamba anuani 10 ni x varible kwa sababu tuliambiwa na kumweka risasi yetu kwamba anuani ya x katika kumbukumbu ni 10. Hivyo tunaweza kwenda huko, kupata thamani yake, ambayo ni 1, kama sisi kuona kwenye iPad yetu, na mzigo huo katika TMP. Tena, hii si maudhui ya mwisho. Sisi ni kwenda kutembea kwa njia na tutaweza kupata hali yetu ya mwisho ya mpango mwishoni. Lakini sasa hivi, tuna thamani 1 kuhifadhiwa katika TMP. Na kuna swali haraka zaidi ya hapa. [Alexander] Je operator dereference - kwamba ni haki tu nyota mbele ya kutofautiana? >> Ndiyo. Hivyo operator dereference, kama sisi flip nyuma mbali wetu mara nyingine tena, hii ni nyota haki mbele. Katika hali hiyo, ni - wewe kulinganisha kwa operator kuzidisha ambayo inahitaji mambo mawili; operator dereference ni operator unary. Tu kutumika kwa thamani moja kinyume na operator binary, ambapo wewe yanahusu maadili mbili tofauti. Hivyo kwamba ni nini kinatokea katika mstari huu. Sisi kubeba thamani 1 na kuhifadhiwa ndani ya variable muda wetu integer. line ijayo, sisi kuhifadhi yaliyomo ndani ya b - au, bali sisi kuhifadhi yaliyomo kwamba b ni akizungumzia katika mahali ambapo ni akizungumzia. Kama sisi kuchambua hii kutoka kulia kwenda kushoto, sisi ni kwenda b dereference, sisi ni kwenda kushughulikia 14, sisi ni kwenda kwa kunyakua integer kwamba ni huko, na kisha sisi ni kwenda kwa anuani ya 10, na sisi ni kwenda kutupa matokeo ya dereference wetu wa b katika nafasi hiyo. Flipping nyuma iPad wetu, ambapo tunaweza kufanya hii kidogo zaidi halisi, inaweza kusaidia kama mimi kuandika idadi ya juu yote ya anwani hapa. Hivyo tunajua kwamba katika y, sisi ni katika anuani 14, x ni katika anuani 10. Wakati sisi kuanza saa b, sisi dereference b, tunakwenda kunyakua thamani 2. Sisi ni kwenda kunyakua thamani hii kwa sababu ya kuwa ni thamani ya kwamba anaishi katika anuani 14. Na sisi ni kwenda kuweka katika variable kwamba anaishi katika anuani 10, ambayo ni haki pale, sambamba na x wetu kutofautiana. Hivyo tunaweza kufanya kidogo ya overwriting hapa ambapo sisi kujikwamua 1 yetu na badala yake sisi kuandika 2. Basi wote ni vizuri na wema katika dunia, ingawa tumekuwa x overwritten sasa. Sisi kuhifadhiwa x wa zamani wa thamani katika TMP variable yetu. Hivyo tunaweza kukamilisha byta na line ijayo. Flipping nyuma mbali wetu. Sasa inabakia kwamba wote ni kuchukua yaliyomo nje ya variable muda wetu integer na kuhifadhi katika variable kwamba anaishi katika anuani kwamba b ameshika. Hivyo sisi ni kwenda kwa ufanisi b dereference ili kupata variable kwamba ni katika anuani kwamba b ana ndani yake, na sisi ni kwenda stuff thamani kwamba TMP ameshika ndani yake. Flipping nyuma iPad mara moja zaidi. Naweza kufuta thamani hii hapa, 2, na badala yake tutaweza nakala kulia 1 ndani yake. Kisha mstari unaofuata kwamba executes, bila shaka - kama sisi flip nyuma mbali - ni hii 6 uhakika, ambayo ni hatua ambayo sisi alitaka kuwa na mchoro wetu kabisa kujazwa. Hivyo flipping nyuma iPad mara moja zaidi, tu hivyo unaweza kuona mchoro kukamilika, unaweza kuona kwamba tuna 10 katika, 14 katika b, 1 katika TMP, 2 katika x, y na 1 katika. Je, kuna maswali kuhusu hili? Je, hii kufanya zaidi hisia, baada ya kutembea kwa njia hiyo? Kufanya chini hisia? Hopefully si. Sawa. Kuyatumia ni chini sana suala gumu. Moja ya guys sisi kazi na ana msemo wa kawaida sana: "Ili kuelewa kuyatumia, lazima kwanza tuelewe kuyatumia." Ambayo nadhani ni kweli sana. Ni gani kuchukua muda kupata kutumika yake. Kuchora kura ya picha, kuchora vielelezo kura ya kumbukumbu kama hii moja ni msaada sana, na baada ya kutembea kwa njia ya mfano baada ya mfano baada ya mfano, hivyo itabidi kuanza kufanya kidogo zaidi hisia na akili kidogo zaidi na zaidi kidogo akili. Hatimaye, siku moja, itabidi yote kabisa mastered. Maswali yoyote kabla ya sisi kuondoka na tatizo ijayo? Wote haki. Hivyo flip nyuma mbali. tatizo ijayo tuna tatizo namba 33 kwenye faili I / O. Kuvuta hii kidogo kidogo. Tatizo 33 - Ndiyo? [Daniel] mimi tu alikuwa swali haraka. Hii nyota, au kinyota, ni kuitwa dereferencing wakati matumizi ya kinyota kabla. Nini ni kuitwa wakati matumizi ampersand kabla? >> Ampersand kabla ni anuani ya operator. Basi hebu kitabu nyuma juu. Lo. Mimi niko katika mode zoom hivyo siwezi kweli kitabu. Kama sisi kuangalia code hii kweli haraka haki hapa, tena, kitu kimoja kinachotokea. Kama sisi kuangalia code haki hii hapa, juu ya mstari huu ambapo sisi kufanya wito wabadilishane, ampersand ni kusema tu "kupata anuani ambayo variable x maisha." Wakati compiler yako inaandaa code yako, ina kweli kimwili ukaandike mahali katika kumbukumbu kwa wote wa vigezo yako ya kuishi. Na hivyo kile compiler unaweza kisha kufanya mara moja ni compiled kila kitu, anajua, "Oh, mimi kuweka x katika anuani 10 Mimi kuweka y katika anuani 14.". Inaweza kisha jaza maadili haya kwa ajili yenu. Hivyo unaweza basi - inaweza kisha kupita katika hii na kupita & y katika vilevile. Haya guys kupata anwani, lakini wao pia, wakati wewe kupita yao katika kazi byta, habari hii ya aina, hii * int haki hapa, anaiambia compiler, "Sawa, tunakwenda kuwa kutafsiri anwani hii kama anuani ya variable integer." Kama anwani ya int, ambayo ni tofauti na anwani ya kutofautiana tabia kwa sababu int inachukua hadi, kwenye mashine ya 32-bit, inachukua hadi ka 4 wa nafasi, ambapo tabia tu inachukua hadi 1 Byte wa nafasi. Hivyo ni muhimu kujua pia ni nini - nini anaishi, ni aina gani ya thamani anaishi katika anuani kwamba got kupita in Au anwani ya kuwa wewe ni kushughulika na. Kwa njia hiyo, wengi kujua jinsi bytes wa habari kwa kweli mzigo nje ya RAM yako. Na kisha, ndiyo, hii operator dereference, kama wewe walikuwa kuuliza, huenda na wanapata habari katika anuani fulani. Hivyo anasema, pamoja na hii variable hapa, kutibu yaliyomo kama anuani, kwenda kwa anwani hiyo, na kujiondoa, mzigo katika processor mzigo, katika daftari maadili halisi au yaliyomo kwamba kuishi katika anuani hiyo. Tena maswali? Hizi ni nzuri maswali. Ni mengi ya istilahi mpya pia. Ni pia aina ya funky, kuona & na * katika maeneo mbalimbali. Wote haki. Hivyo nyuma tatizo 33, faili I / O. Hii ilikuwa ni moja ya matatizo hayo ambayo nadhani michache ya mambo yaliyotokea. Moja, ni mada uungwana mpya. Ni iliwasilishwa pretty hivi karibuni kabla ya chemsha bongo, na kisha nadhani ilikuwa aina ya kama moja ya matatizo hayo neno katika math ambapo wao kukupa mengi ya habari, lakini wewe kweli si kuishia kuwa na matumizi ya tani ya hiyo. sehemu ya kwanza ya tatizo hili ni kuelezea nini faili CSV ni. Sasa, faili CSV, kulingana na maelezo, ni koma waliojitenga maadili faili. Sababu hizi ni wakati wote kuvutia, na sababu wewe milele matumizi yao, ni kwa sababu, jinsi wengi wenu wamewahi kutumia mambo kama Excel? Kielelezo zaidi ya wewe, pengine, au kutumia wakati fulani katika maisha yako. Utatumia kitu kama Excel. Ili kupata data nje ya spreadsheet Excel au kufanya aina yoyote ya usindikaji na hilo, kama alitaka kuandika mpango C au Python mpango, Java mpango, kukabiliana na data una kuhifadhiwa huko, moja ya njia ya kawaida ya kupata nje ni katika faili CSV. Na unaweza kufungua Excel na wakati wewe kwenda 'Save As' mazungumzo, unaweza kupata nje halisi CSV faili. Handy kujua jinsi ya kukabiliana na mambo hayo. Njia hiyo kazi ni kwamba ni sawa na - I mean, ni kimsingi mimicking spreadsheet, ambapo, kama sisi kuona hapa, katika kipande sana kushoto-wengi, sisi kuwa na majina yote ya mwisho. Hivyo tuna Malan, kisha Hardison, na kisha Bowden, MacWilliam, na kisha Chan. Majina yote ya mwisho. Na kisha comma hutenganisha majina ya mwisho kutoka majina kwanza. Daudi, Nate, Rob, Tommy, na Zamyla. Mimi daima kuchanganya Robby na Tom. Na kisha, hatimaye, safu ya tatu ni anwani ya barua pepe. Mara baada ya kuelewa kwamba, wengine wa mpango ni haki moja kwa moja kutekeleza. Nini tumekuwa kufanyika ili kuiga muundo sawa katika mpango wetu C ni tumekuwa kutumika muundo. Tutaweza kuanza kucheza na haya zaidi kidogo pia. Tuliona yao kwa kidogo kidogo kwanza katika tatizo kuweka 3, tulipokuwa kushughulika na Mkwawa. Lakini hii struct wafanyakazi maduka jina la mwisho, jina la kwanza, na barua pepe. Tu kama faili wetu CSV alikuwa kuhifadhi. Hivyo hii ni haki ya kuwabadili kutoka format moja hadi nyingine. Tuna kubadili, katika kesi hii, struct wafanyakazi katika mstari, line comma-waliojitenga, tu kama hiyo. Je, hiyo mantiki? You guys wote kuchukuliwa quiz, hivyo mimi kufikiria una angalau alikuwa na muda wa kufikiri juu ya hili. Katika kazi mshahara, tatizo anatuomba kuchukua katika - zoom we'll katika hii kidogo kidogo - kuchukua katika muundo wa wafanyakazi, struct wafanyakazi, kwa jina s, na append yaliyomo yake na faili wetu staff.csv. Ni zinageuka kuwa hii ni haki moja kwa moja kwa kutumia. Tutaweza aina ya kucheza karibu na kazi hizi kidogo zaidi leo. Lakini katika kesi hii, kazi fprintf ni kweli muhimu. Hivyo, pamoja na fprintf, tunaweza magazeti, kama wewe guys wamekuwa wakitumia printf muda huu wote. Unaweza printf line kwa faili. Hivyo badala ya maamuzi tu ya kawaida printf wito ambapo wewe kuwapa string format na kisha wewe kuchukua nafasi ya vigezo vyote kwa hoja zifuatazo, na fprintf, hoja yako ya kwanza ni badala faili unataka kuandika. Kama sisi kuangalia hii katika appliance, kwa mfano, mtu fprintf, tunaweza kuona tofauti kati ya printf na fprintf. Mimi itabidi zoom katika hapa kidogo. Hivyo, pamoja na printf, sisi kuwapa string format, na kisha hoja ya baadae ni vigezo vyote kwa ajili ya uwekaji au badala ndani ya muundo wa kamba yetu. Ambapo kwa fprintf, hoja ya kwanza ni kweli hii * faili inayoitwa mkondo. Kusonga nyuma zaidi ya hapa kwa kukodisha yetu, tumekuwa tayari got faili wetu * mkondo kufunguliwa kwa ajili yetu. Hiyo ni nini mstari huu kwanza gani; ni kufungua faili staff.csv, ni kufungua hiyo katika mode append, na wote wa kushoto kwa sisi kufanya ni andika muundo wafanyakazi na faili. Na, hebu angalia, kufanya mimi nataka kutumia iPad? Mimi itabidi kutumia iPad. Tuna utupu - basi s kuweka hii juu ya meza ili niweze kuandika kidogo bora - kuibatilisha kukodisha na inachukua katika hoja moja, muundo wafanyakazi kuitwa s. Got braces yetu, sisi tumepewa faili wetu * kuitwa faili, tuna fopen yetu line tuliyopewa na mimi itabidi kuandika ni kama dots tangu ni tayari katika pedia. Na kisha kwenye line yetu ijayo, sisi ni kwenda kufanya wito kwa fprintf na sisi ni kwenda kupita katika faili kwamba tunataka magazeti na, na kisha muundo wetu kamba, ambayo - Mimi itabidi basi guys kuniambia nini inaonekana kama. Vipi kuhusu wewe, Stella? Unajua nini sehemu ya kwanza ya string format inaonekana kama? [Stella] mimi nina uhakika. >> Jisikie huru kuuliza Jimmy. Unajua, Jimmy? [Jimmy] Je, ni tu kuwa mwisho? Mimi sijui. Mimi si uhakika kabisa. >> Sawa. Vipi kuhusu, hakuwa mtu yeyote kupata hii sahihi kwenye mtihani? No wote wa kulia. Ni zinageuka kuwa hapa wote sisi kufanya ni tunataka kila sehemu ya wafanyakazi muundo wetu kuchapishwa kwa kama kamba ndani ya faili wetu. Sisi tu kutumia badala string tabia ya mara tatu tofauti kwa sababu tuna jina la mwisho ikifuatiwa na comma, basi jina la kwanza na kufuatiwa na comma, na kisha hatimaye anuani ya barua pepe ambayo ni ikifuatiwa - ambayo si kufaa juu ya screen yangu - lakini ni ikifuatiwa na tabia newline. Hivyo nina kwenda kuandika tu chini huko. Na kisha kufuatia muundo wetu kamba, sisi tu substitutions, ambayo sisi kupata kutumia nukuu dot kuwa tuliona katika tatizo kuweka 3. Tunaweza kutumia s.last, s.first, na s.email mbadala katika maadili hayo matatu katika format string yetu. Hivyo ni jinsi gani kwamba kwenda? Mantiki? Ndiyo? Hakuna? Inawezekana? Sawa. Jambo la mwisho kwamba sisi kufanya baada tumekuwa kuchapishwa na baada tumekuwa kufunguliwa faili yetu: wakati wowote tumekuwa kufunguliwa faili, sisi daima kuwa kukumbuka kulifunga. Kwa sababu vinginevyo sisi kuishia kinachovuja kumbukumbu, kutumia up descriptors faili. Hivyo kuifunga, ambayo kazi gani sisi kutumia? Danieli? [Daniel] fclose? >> Fclose, hasa. Hivyo sehemu ya mwisho ya tatizo hili lilikuwa vizuri karibu faili, kutumia kazi fclose, ambayo tu inaonekana kama kwamba. Si pia mambo. Cool. Basi hiyo ni tatizo 33 juu ya chemsha bongo. Tutaweza kuwa dhahiri zaidi faili I / O kuja juu. Tutaweza kufanya kidogo zaidi katika hotuba ya leo, au katika sehemu ya leo, kwa sababu hiyo ni nini kinaendelea na kuunda wingi wa pset hii ujao. Hebu hoja juu ya kutoka Jaribio katika hatua hii. Ndiyo? [Charlotte]] Mbona fclose (faili) badala ya fclose (staff.csv)? >> Ah. Kwa sababu ni zinageuka kuwa - hivyo swali, ambayo ni moja kubwa, ni kwa nini, wakati sisi kuandika fclose, ni sisi kuandika fclose (faili) nyota variable kinyume na jina la faili, staff.csv? Ni kwamba ni sahihi? Yeah. Basi hebu tuangalie. Kama mimi kubadili nyuma kwa mbali yangu, na hebu angalia kazi fclose. Hivyo kazi fclose kufunga mkondo na inachukua katika pointer mkondo kwamba tunataka kuifunga, kinyume na jina halisi faili kwamba tunataka kuifunga. Na hii ni kwa sababu ya nyuma ya pazia, wakati kufanya wito kwa fopen, unapojitangaza SVG, wewe ni kweli kugawa kumbukumbu kuhifadhi habari kuhusu faili. Hivyo una faili pointer kwamba ina taarifa kuhusu faili, kama vile ni wazi, ukubwa wake, ambapo sasa uko katika faili, hivyo kwamba unaweza kufanya kusoma na kuandika wito kwa mahali fulani ndani ya faili. Unaishia kufunga pointer badala ya kufunga jina faili. Ndiyo? [Daniel] Hivyo ili kutumia mshahara, ungeweza kusema - jinsi gani kupata pembejeo user? Je fprintf kutenda kama GetString kwa maana kwamba itabidi kusubiri kwa ajili ya pembejeo user na kuuliza wewe andika haya - au kusubiri kwa wewe andika mambo haya matatu katika? Au wewe haja ya kutumia kitu kutekeleza kukodisha? >> Yeah. Hivyo sisi siyo - Swali, ni jinsi gani sisi kupata pembejeo user ili kutekeleza kukodisha? Na nini sisi hapa ni mpigaji wa kukodisha, kupita katika hii struct wafanyakazi na yote ya data kuhifadhiwa katika struct tayari. Hivyo fprintf ni uwezo wa kuandika tu kwamba data moja kwa moja na faili. Hakuna kusubiri kwa ajili ya pembejeo mtumiaji. user Tayari aliyopewa pembejeo na vizuri kuweka katika struct hii wafanyakazi. Na mambo, bila shaka, inaweza kuvunja kama yoyote ya kuyatumia wale walikuwa null, hivyo sisi kitabu nyuma hadi hapa na sisi kuangalia struct yetu. Tuna string mwisho, kamba ya kwanza, kamba ya barua pepe. Sasa tunajua kwamba wale wote kweli, chini ya Hood, ni Char * vigezo. Kwamba wanaweza au kuwa akizungumzia null. Wanaweza kuwa akizungumzia kumbukumbu juu ya chungu, labda kumbukumbu juu ya stack. Sisi kwa kweli sijui, lakini ikiwa yoyote ya kuyatumia haya ni null, au batili, kwamba utakuwa dhahiri ajali mshahara wetu kazi. Hiyo ilikuwa kitu ambacho ilikuwa ni aina ya zaidi ya upeo wa mtihani. Sisi siyo wasiwasi juu ya hilo. Mkuu. Sawa. Hivyo kuhama kutoka chemsha bongo. Hebu kuifunga guy, na sisi ni kwenda kuangalia pset 4. Hivyo kama wewe guys kuangalia spec pset, mara moja unaweza kupata hiyo, cs50.net/quizzes, sisi ni kwenda kupitia wachache wa matatizo leo sehemu. Mimi nina scrolling chini - sehemu ya maswali huanza kwenye ukurasa wa tatu wa spec pset. Na sehemu ya kwanza anauliza wewe kwenda na kuangalia mfupi juu ya imetuma na mabomba. Ambayo ilikuwa aina ya short baridi, inaonyesha baadhi ya mwezi, baridi tricks mstari amri kwamba unaweza kutumia. Na kisha sisi tumepewa maswali kadhaa kwa ajili yenu pia. Hii swali la kwanza kuhusu mito, ambayo printf anaandika by default, sisi aina ya kuguswa juu kidogo kidogo tu wakati iliyopita. Hii fprintf kwamba tulikuwa tu kujadili inachukua katika mkondo faili * kama hoja yake. fclose inachukua katika mkondo * faili kama vile, na thamani ya kurudi kwa fopen inakupa * faili mkondo pia. sababu hatujaona walio kabla wakati tumekuwa kushughulikiwa na printf ni kwa sababu ana printf mkondo default. Na mkondo default ambayo anaandika utagundua kuhusu katika muda mfupi. Hivyo dhahiri kuangalia ni. Katika sehemu ya leo, sisi ni kwenda kuzungumza kidogo kuhusu GDB, tangu zaidi ya ukoo wewe ni pamoja na hayo, mazoezi zaidi kupata pamoja na hayo, bora na uwezo utakuwa kwa kweli kuwasaka mende katika code yako mwenyewe. Hii kasi ya mchakato wa debugging juu mno. Hivyo kwa kutumia printf, kila wakati kufanya kwamba una recompile code yako, una kuendesha tena, wakati mwingine una hoja wito printf kote, maoni nje code, ni tu inachukua muda. Lengo letu ni kujaribu na kuwashawishi kwamba kwa GDB, unaweza kimsingi printf chochote katika hatua yoyote katika code yako na wewe kamwe kuwa na recompile yake. Huwezi kuwa na kuanza na kuendelea guessing ambapo kwa printf ijayo. Kitu cha kwanza kufanya ni nakala line hii na kupata kanuni ya sehemu ya mbali ya mtandao. Mimi nina kuiga line hii ya kificho kwamba anasema, "wget ​​http://cdn.cs50.net". Mimi naenda nakala yake. Mimi nina kwenda juu kwa appliance wangu, zoom nje hivyo unaweza kuona nini mimi kufanya, pasting ni huko, na wakati mimi hit Enter, amri hii wget literally ni mtandao kupata. Ni kwenda kubomoa faili hii mbali ya mtandao, na ni kwenda kuokoa ni saraka ya sasa. Sasa kama mimi kuorodhesha saraka yangu sasa unaweza kuona kwamba mimi nimepata faili hii section5.zip haki huko. njia ya kukabiliana na kwamba guy ni unzip yake, ambayo unaweza kufanya katika mstari amri, kama hii. Section5.zip. Kwamba kutakuwa na unzip yake, kutengeneza folda kwa ajili yangu, inflate yote yaliyomo, kuziweka katika huko. Hivyo sasa naweza kwenda katika sehemu ya saraka yangu 5 kutumia amri cd. Wazi screen kutumia wazi. Hivyo wazi screen. Sasa mimi nimepata nzuri safi terminal kushughulikia. Sasa kama mimi orodha files wote kwamba mimi kuona katika saraka hii, unaweza kuona kwamba mimi nimepata files nne: buggy1, buggy2, buggy3, na buggy4. Nimekuwa pia got files yao sambamba. C. Sisi siyo kwenda kuangalia files. C kwa sasa. Badala yake, tunakwenda kuzitumia wakati sisi kufungua GDB. Tumekuwa naendelea yao karibu ili tuweze kupata code halisi chanzo wakati sisi ni kutumia GDB, lakini lengo la sehemu hii ya sehemu ni kwa tinker karibu na GDB na kuona ni jinsi gani tunaweza kuitumia kufikiri nini kinaendelea kibaya na kila moja ya hizi programu Buggy nne. Hivyo sisi ni kwenda tu kuzunguka chumba kweli haraka, na mimi naenda kuuliza mtu kukimbia moja ya mipango Buggy, na kisha tutaweza kwenda kama kikundi kupitia GDB, na tutaweza kuona nini tunaweza kufanya kwa kurekebisha programu hizi, au kwa angalau kutambua nini kinaendelea katika makosa ya kila mmoja wao. Hebu kuanza hapa kwa Danieli. Je kukimbia buggy1? Hebu kuona nini kinatokea. [Daniel] Ni anasema kuna kosa maombi. >> Yeah. Hasa. Hivyo kama mimi kukimbia buggy1, mimi kupata kosa seg. Katika hatua hii, mimi naweza kwenda na kufungua buggy1.c, kujaribu na kufikiri nini kinaendelea vibaya, lakini moja ya mambo ya obnoxious kuhusu kosa hili seg kosa ni kwamba haina kukuambia juu ya nini mstari wa mambo mpango kweli potoka na kukatika. Wewe aina ya kuwa na kuangalia code na takwimu nje kwa kutumia dhana na kuangalia au printf kwa kuona nini kinaendelea vibaya. Moja ya mambo ya coolest kuhusu GDB ni kwamba ni kweli, kweli rahisi kufikiri mstari wa saa ambayo programu yako shambulio. Ni kabisa na thamani yake na kuitumia, hata kama tu kwa ajili hiyo. Hivyo kwa Boot juu GDB, ninapoandika GDB, na kisha mimi kuwapa njia ya executable kwamba nataka kukimbia. Hapa mimi nina kuandika gdb ./buggy1. Hit Ingiza. Anitiaye habari hii yote hakimiliki, na chini hapa utaona mstari huu kwamba anasema, "ishara Akisoma / nyumbani / jharvard/section5/buggy1. " Na kama yote inakwenda vizuri, utaona ni magazeti ujumbe kwamba inaonekana kama hii. Ni itabidi kusoma alama, hivyo itabidi kusema "mimi nina kusoma alama kutoka executable faili yako," na kisha itakuwa na hii "kufanyika" ujumbe zaidi ya hapa. Kama unaweza kuona baadhi ya tofauti nyingine ya hii, au unaweza kuona ni hakuweza kupata alama au kitu kama hicho, nini maana ya ni kwamba wewe tu si compiled executable yako vizuri. Wakati sisi kukusanya mipango kwa ajili ya matumizi na GDB, inabidi kutumia bendera maalum-g, na kwamba ni kosa kwa default kama wewe kukusanya mipango yako, tu na kuandika kufanya au kufanya Buggy au kufanya kuokoa, yoyote ya wale. Lakini kama wewe ni kuandaa manually na Clang, basi itabidi kwenda katika na ni pamoja na kwamba-g bendera. Katika hatua hii, sasa kwamba tuna GDB wetu haraka, ni pretty rahisi kuendesha programu. Tunaweza aidha aina ya kukimbia, au tunaweza aina tu r. Wengi GDB amri inaweza kuwa abbreviated. Kawaida kwa moja tu au barua wanandoa, ambayo ni pretty nice. Hivyo Saad, kama aina r na hit Enter, nini kitatokea? [Saad] I got SIGSEGV, kosa segmentation, na kisha gobbledygook hii yote. >> Yeah. Kama sisi ni kuona kwenye screen hivi sasa, na kama Saad alisema, wakati sisi aina kukimbia au r na hit Enter, sisi bado kupata huo seg kosa. Hivyo kutumia GDB haina kutatua tatizo letu. Lakini inatupa baadhi gobbledygook, na zinageuka kuwa hii gobbledygook kweli inatuambia ambapo ni kinachotokea. Kuchanganua hii kidogo kidogo, hii kidogo kwanza ni kazi ambayo kila kitu kinaendelea vibaya. Kuna hii __ strcmp_sse4_2, na inatuambia kwamba kinachotokea katika faili hii kuitwa sysdeps/i386, yote hii, tena, aina ya fujo - lakini line 254. Hiyo ni aina ya vigumu kuchanganua. Kawaida wakati unaweza kuona mambo kama haya, hiyo ina maana kwamba ni seg faulting katika moja ya maktaba mfumo. Hivyo kitu cha kufanya na strcmp. You guys tumeona strcmp kabla. Si pia mambo, lakini anafanya hii ina maana kwamba strcmp ni kuvunjwa au kwamba kuna tatizo na strcmp? Unafikiri, Alexander? [Alexander] Je kwamba - ni 254 mstari? Na - sio binary, lakini siyo taken zao, na kisha kuna lugha nyingine kwa ajili ya kazi ya kila. Ni kwamba 254 katika kazi hiyo, au -? >> Ni line 254. Inaonekana kama katika faili hii. Hii, hivyo ni mkutano code pengine. Lakini, mimi nadhani jambo kubwa zaidi ni, kwa sababu tumekuwa Gotten kosa seg, na inaonekana kama ni kuja kutoka kazi strcmp, nini hii inadokeza, basi, strcmp kwamba ni kuvunjwa? Ni lazima si, hopefully. Hivyo tu kwa sababu una kosa segmentation katika moja ya kazi za mfumo, kawaida hiyo ina maana kwamba wewe tu si iitwayo kwa usahihi. kitu ya haraka ya kufanya kufikiri nini ni kweli kinachoendelea wakati unaweza kuona kitu kama mambo haya, wakati wowote unaweza kuona kosa seg, hasa kama una mpango wa hiyo kutumia zaidi kuliko tu kuu, ni kutumia backtrace. Mimi abbreviate backtrace kwa kuandika bt, kinyume na neno kamili backtrace. Lakini Charlotte, nini kinatokea pale unapoandika bt na hit Enter? [Charlotte] Inaonyesha yangu mistari mbili, line 0 na mstari 1. >> Yeah. Hivyo mstari na mstari 0 1. Hizi ni halisi stack muafaka kuwa walikuwa sasa katika kucheza wakati mpango wako kugonga. Kuanzia sura topmost, sura 0, na kwenda chini-wengi, ambayo ni sura ya 1. Frame yetu topmost ni sura strcmp. Unaweza kufikiri ya hii kama sawa na kwamba tatizo tulikuwa tu kufanya juu ya chemsha bongo kwa kuyatumia, ambapo tulikuwa wabadilishane stack frame juu ya sura kuu stack, na tulikuwa na vigezo kwamba byta alikuwa kutumia juu ya vigezo kwamba alikuwa kutumia kuu. Hapa ajali wetu kilichotokea katika kazi yetu strcmp, ambayo aliitwa na kazi yetu kuu, na backtrace anatupa si tu kazi katika mambo ambayo alishindwa, lakini ni pia anatuambia ambapo kila kitu aliitwa kutoka. Hivyo kama mimi kitabu juu zaidi kidogo kwa haki, tunaweza kuona kwamba yeah, tulipokuwa kwenye mstari 254 ya faili hii strcmp-sse4.s. Lakini wito huo ulitolewa katika buggy1.c, mstari 6. Hivyo kwamba maana tunaweza kufanya - ni sisi unaweza tu kwenda kuangalia nje na kuona nini kinachoendelea katika buggy1.c, mstari 6. Tena, kuna njia kadhaa za kufanya hivyo. Moja ni exit nje ya GDB au kuwa na code yako wazi katika dirisha lingine na rejea msalaba. Kwamba, katika yenyewe, ni pretty Handy kwa sababu sasa kama wewe ni katika masaa ya ofisi na nimepata kosa seg na TF yako s wanashangaa ambapo kila kitu kilikuwa kuvunja, unaweza tu kusema, "Oh, mstari 6 sijui nini kinaendelea., lakini kitu kuhusu mstari 6 ni kusababisha mpango wangu kuvunja. " njia nyingine ya kufanya hivyo ni unaweza kutumia amri hii inaitwa orodha katika GDB. Unaweza pia abbreviate kwa l. Hivyo kama sisi hit l, je, sisi hapa? Sisi kupata rundo zima ya mambo weird. Hii ni halisi mkutano code kwamba ni katika strcmp_sse4_2. Hii inaonekana aina ya funky, na sababu sisi ni kupata hii ni kwa sababu sasa hivi, GDB ana yetu katika sura 0. Hivyo wakati wowote sisi kuangalia vigezo, wakati wowote sisi kuangalia chanzo code, sisi ni kuangalia chanzo code linafanywa na sura stack tuko sasa in Hivyo ili kupata kitu chochote maana, tuna hoja kwa frame stack kwamba mantiki zaidi. Katika kesi hiyo, kuu stack frame zingeweza kidogo maana zaidi, kwa sababu kwamba alikuwa kweli kificho kwamba sisi aliandika. Si code strcmp. njia unaweza hoja kati ya muafaka, katika kesi hii, kwa sababu tuna mbili, tuna 0 na 1, unaweza kufanya hivyo kwa juu na amri chini. Kama mimi hoja juu frame moja, sasa mimi nina katika sura kuu stack. Mimi unaweza hoja chini kwenda nyuma ambapo mimi nilikuwa, kwenda juu tena, kwenda chini tena, na kwenda juu tena. Kama umewahi kufanya mpango wako katika GDB, kupata ajali, unaweza kupata backtrace, na unaweza kuona kwamba ni katika baadhi faili kwamba huwezi kujua nini kinaendelea. Unaweza kujaribu orodha, code haangalii familiar na wewe, kuangalia muafaka yako na takwimu kutoka wapi. Wewe pengine katika sura makosa stack. Au angalau wewe ni katika sura ya stack ambayo si moja kuwa unaweza kweli Debug. Sasa kwa kuwa tuko katika sura sahihi stack, tuko katika kuu, sasa tunaweza kutumia amri orodha kufikiri nini line ilikuwa. Na unaweza kuona, ni printed hivyo kwa ajili yetu hapa hapa. Lakini tunaweza hit kuorodhesha wote ni sawa, na orodha hii inatupa printout nzuri wa chanzo halisi kificho kwamba kinaendelea katika hapa. Hasa, tunaweza kuangalia mstari 6. Tunaweza kuona nini kinaendelea hapa. Na inaonekana kama sisi ni kufanya kulinganisha string kati ya string "CS50 miamba" na argv [1]. Kitu kuhusu hili crashing. Hivyo Missy, je, una mawazo yoyote juu ya nini kinaweza kuwa kinachoendelea hapa? [Missy] Mimi sijui ni kwa nini ni crashing. >> Wewe sijui nini ni crashing? Jimmy, mawazo yoyote? [Jimmy] Mimi si uhakika kabisa, lakini mara ya mwisho sisi kutumika string kulinganisha, au strcmp, tulikuwa kama kesi tatu tofauti chini yake. Hatukuwa na ==, sidhani, haki katika mstari ule wa kwanza. Badala yake ilikuwa waliojitenga katika tatu, na moja ilikuwa == 0, moja alikuwa <0, nadhani, na moja ilikuwa> 0. Hivyo labda kitu kama hicho? >> Yeah. Hivyo kuna suala hili wa tunafanya kulinganisha kwa usahihi? Stella? Mawazo yoyote? [Stella] mimi nina uhakika. >> Si uhakika. Danieli? Mawazo? Sawa. Ni zinageuka nini kinatokea hapa hapa ni wakati sisi mbio mpango na sisi got kosa seg, wakati wewe mbio mpango kwa mara ya kwanza, Danieli, gani kuwapa yoyote hoja mstari amri? [Daniel] No No >> Katika kesi hiyo, ni nini thamani ya argv [1]? >> Kuna faida yeyote. >> Haki. Naam, hakuna mwafaka string thamani. Lakini kuna baadhi ya thamani. Nini thamani ya kwamba anapata kuhifadhiwa katika huko? >> Thamani takataka? >> Ni ama thamani ya takataka au, katika kesi hii, mwisho wa safu argv daima ni terminated na null. Basi nini kweli got kuhifadhiwa katika kuna null. njia nyingine ya kutatua hili, badala ya kufikiria njia, ni kujaribu kuchapa nje. Hii ni pale ambapo mimi alikuwa akisema kwamba kwa kutumia GDB ni kubwa, kwa sababu unaweza magazeti nje vigezo vyote, maadili yote ya kwamba unataka kutumia hii Handy-dandy p amri. Hivyo kama ninapoandika p na kisha ninapoandika thamani ya variable au jina la kutofautiana, kusema, argc, naona ya kuwa argc ni 1. Kama mimi nataka magazeti nje argv [0], siwezi kufanya hivyo tu kama hiyo. Na kama tuliona, argv [0] daima ni jina la mpango wako, daima jina la kutekelezwa. Hapa unaweza kuona ni got kamili njia jina. Mimi pia magazeti nje argv [1] na kuona nini kinatokea. Hapa sisi got aina hii ya thamani ya fumbo. Sisi got hii 0x0. Kumbuka mwanzoni mwa muhula wakati sisi aliyesema kuhusu idadi hexadesimoli? Au swali kidogo mwisho wa pset 0 kuhusu jinsi ya kuwakilisha 50 katika hex? njia ya sisi kuandika hex idadi katika CS, tu si kuwavurugia wenyewe pamoja na idadi decimal, ni sisi daima kiambishi yao na 0x. Hivyo hii kiambishi awali 0x daima tu ina maana kutafsiri idadi zifuatazo kama idadi hexadesimoli, si kama kamba, si kama idadi decimal, si kama idadi binary. Tangu idadi 5-0 ni idadi halali katika hexadesimoli. Na ni idadi katika decimal, 50. Hivyo hii ni jinsi tu sisi disambiguate. Hivyo 0x0 njia hexadesimoli 0, ambayo pia ni decimal 0, binary 0. Ni tu 0 thamani. Ni zinageuka kuwa hii ni nini null ni, kwa kweli, katika kumbukumbu. Null ni 0. Hapa, kipengele kuhifadhiwa katika argv [1] ni null. Hivyo sisi ni kujaribu kulinganisha yetu "miamba CS50" kamba kamba null. Hivyo dereferencing null, kujaribu kupata mambo katika null, wale ni kawaida ya kwenda kusababisha baadhi ya aina ya segmentation kosa au nyingine mambo mabaya kutokea. Na zinageuka kuwa strcmp haina kuangalia kuona kama au wewe ve kupita katika thamani hiyo null. Badala yake, ni tu inakwenda mbele, anajaribu kufanya jambo yake, na kama ni seg makosa, ni seg makosa, na ni tatizo lako. Una kwenda kurekebisha. Kweli haraka, jinsi tunavyoweza kurekebisha tatizo hili? Charlotte? [Charlotte] Unaweza kuangalia kama kutumia. Hivyo kama argv [1] ni null, == 0, kisha kurudi 1, au kitu [unintelligible]. >> Yeah. Basi hiyo ni moja kubwa njia ya kufanya hivyo, kama tunaweza kuangalia kuona, thamani sisi ni juu ya kupita katika strcmp, argv [1] Je, ni null? Kama ni null, basi tunaweza kusema sawa, abort. njia zaidi ya kawaida ya kufanya hivyo ni kutumia thamani argc. Unaweza kuona haki hapa katika mwanzo wa kuu, sisi omitted kwamba mtihani wa kwanza kwamba sisi kawaida kufanya wakati sisi kutumia hoja mstari amri, ambayo ni mtihani kama au thamani yetu argc ni nini sisi kutarajia. Katika kesi hii, sisi ni kutarajia hoja angalau mbili, jina la mpango plus moja nyingine. Kwa sababu sisi ni juu ya kutumia hoja pili kulia hapa. Hivyo kuwa na baadhi ya aina ya mtihani kabla, kabla ya wito wetu strcmp kwamba vipimo kama au argv ni angalau 2, ingekuwa pia kufanya aina moja ya kitu. Tunaweza kuona kama kwamba kazi kwa kuendesha mpango tena. Daima unaweza kuanzisha upya mpango wako ndani ya GDB, ambayo ni nzuri kwa kweli. Unaweza kukimbia, na wakati kupita katika hoja kwa mpango wako, wewe kupita yao katika wakati wito kukimbia, si wakati Boot juu GDB. Kwa njia hiyo unaweza kushika kuliungama mpango wako kwa hoja tofauti kila wakati. Hivyo kukimbia, au tena, mimi unaweza aina r, na hebu angalia nini kinatokea kama sisi aina "hello". Ni daima kuuliza wewe kama unataka kuanza yake tangu mwanzo tena. Kawaida, wewe unataka kuanza yake tangu mwanzo tena. Na katika hatua hii, ni restarts tena, ni Prints nje mpango kwamba sisi ni mbio, buggy1, na hoja hello, na Prints hii nje ya kiwango; inasema, "Unaweza kupata D," sura ya huzuni. Lakini hatukuwa seg kosa. Ni alisema mchakato kwamba exited kawaida. Hivyo kwamba inaonekana pretty nzuri. Hakuna kosa zaidi seg, sisi kuifanya nyuma, hivyo inaonekana kama kwamba ilikuwa kweli seg kosa bug kwamba sisi kupata. Bahati mbaya, ni inatuambia kwamba sisi ni kupata D. Tunaweza kwenda nyuma na kuangalia code na kuona nini kinaendelea huko kufikiri nini ilikuwa - ni kwa nini alikuwa akitwambia kwamba tulipata D. Hebu angalia, hapa ilikuwa hii printf akisema kwamba got D. Kama sisi aina orodha, kama wewe kushika kuandika orodha, ni kuvaa iterating chini kupitia mpango wako, hivyo nitawaonyesheani kwanza mistari michache ya programu yako. Kisha nitawaonyesheani ijayo mistari michache, na chunk ijayo na chunk ijayo. Na nitaendelea kujaribu kwenda chini. Na sasa tutaweza kupata na "kujipanga idadi 16 ni nje ya mbalimbali." Kwa sababu tu ina mistari 15. Kama wewe kupata hatua hii na wako anashangaa, "Nitafanya nini?" unaweza kutumia amri msaada. Matumizi ya kusaidia na kisha kuwapa jina la amri. Na unaona GDB inatupa aina hii yote ya mambo. Ni anasema, "Kwa hoja hakuna, orodha ya kumi mistari zaidi baada ya au karibu na orodha ya awali. Orodha - orodha ya mistari kumi kabla - " Basi hebu jaribu kutumia minus orodha. Na kwamba orodha ya mistari 10 ya awali; unaweza kucheza karibu na orodha kidogo. Unaweza kufanya orodha, orodha -, unaweza hata kutoa orodha ya namba, kama orodha 8, na kutakuwa na kuorodhesha mistari 10 kuzunguka mstari 8. Na unaweza kuona nini kinaendelea hapa ni nimepata rahisi kama mwingine. Kama aina katika miamba CS50, ni Prints nje "Unaweza kupata A." Vinginevyo Prints nje "Unaweza kupata D." Bummer mji. Wote haki. Ndiyo? [Daniel] Basi nilipojaribu kufanya miamba CS50 bila quotes, inasema "Unaweza kupata D." Mimi zinahitajika quotes kwa kupata kazi, kwa nini ni hivyo? >> Yeah. Ni zinageuka kuwa wakati - hii ni mwingine furaha kidogo tidbit - wakati kukimbia mpango, kama sisi kukimbia na sisi aina katika miamba CS50, tu kama Danieli alikuwa akisema alifanya hivyo, na wewe hit Enter, bado anasema sisi kupata D. Na swali ni, nini hii? Na zinageuka kuwa wote terminal wetu na GDB Hazrat hizi mbili kama hoja tofauti. Kwa sababu wakati kuna nafasi, kwamba ni kumaanisha kama Hoja ya kwanza kumalizika; hoja ya pili ni kuhusu kuanza. njia ya kuchanganya wale mara mbili au sorry, ndani ya hoja moja, ni kutumia quotes. Hivyo sasa, kama sisi kuiweka katika quotes na kukimbia tena, sisi kupata A. Hivyo tu kwa kurejea, quotes hakuna, CS50 na miamba ni parsed kama hoja mbili tofauti. Pamoja na quotes, ni parsed kama moja hoja kabisa. Tunaweza kuona kwa breakpoint. Hadi sasa tumekuwa mbio mpango wetu, na imekuwa ni mbio mpaka ama ni seg makosa au hitilafu hits au mpaka ina exited na wote imekuwa kabisa faini. Hii ni lazima si kitu manufaa zaidi, kwa sababu wakati mwingine una kosa katika mpango wako, lakini si kosa na kusababisha segmentation. Si kusababisha mpango wako na kuacha au kitu kama hicho. njia ya kupata GDB pause mpango wako katika hatua fulani ni kuweka breakpoint. Unaweza ama kufanya hili kwa kuweka breakpoint juu ya jina kazi au unaweza kuweka breakpoint kwenye mstari fulani ya code. Mimi kama kuweka breakpoints juu ya majina ya kazi, kwa sababu - rahisi kukumbuka, na kama kweli kwenda katika na kubadili chanzo yako code juu kidogo, kisha breakpoint yako itakuwa kweli kukaa katika sehemu moja ndani ya code yako. Wakati kama wewe ni kutumia namba line, na idadi ya mstari kubadilika kwa sababu wewe kuongeza au kufuta baadhi ya kanuni, basi breakpoints yako yote kabisa Star up. Moja ya mambo ya kawaida mimi kufanya ni kuweka breakpoint juu ya kazi kuu. Mara nyingi mimi itabidi Boot juu GDB, mimi itabidi aina b kuu, hit Enter, na kwamba kutakuwa na kuweka breakpoint juu ya kazi kuu ambayo husema tu "pause mpango haraka kama wewe kuanza mbio," na kwa njia hiyo, wakati mimi kuendesha programu yangu na, kusema, miamba CS50 kama mbili hoja na hit Enter, anapata kwa kazi kuu na ataacha haki katika mstari wa kwanza kabisa, haki kabla ya kutathmini kazi strcmp. Tangu mimi nina paused, sasa naweza kuanza mucking karibu na kuona nini kinaendelea na wote wa vigezo mbalimbali ambayo ni kupita katika mpango wangu. Hapa naweza magazeti nje argc na kuona nini kinaendelea. Kuona kwamba argc ni 3, kwa sababu ni got 3 maadili tofauti ndani yake. Ni got jina la mpango, ni got hoja kwanza na hoja ya pili. Tunaweza magazeti wale nje kwa kuangalia argv [0], argv [1], na argv [2]. Hivyo sasa unaweza pia kuona nini wito huu strcmp ataenda kushindwa, kwa sababu unaweza kuona kwamba hawakuwa wameigawanya CS50 na miamba katika hoja mbili tofauti. Katika hatua hii, mara moja umefanya hit breakpoint, unaweza kuendelea na hatua ya kupitia mpango wako mstari kwa mstari, kinyume na kuanza programu yako tena. Hivyo kama wewe hawataki kuanza programu yako tena na kuendelea tu kutoka hapa, unaweza kutumia amri kuendelea na kuendelea kukimbia mpango wa mwisho. Tu kama ilivyokuwa hapa. Hata hivyo, kama mimi kuanzisha upya mpango, miamba CS50, ni hits breakpoint yangu tena, na wakati huu, kama mimi sitaki tu kwenda njia zote wengine wa mpango, Naweza kutumia amri ya pili, ambayo mimi pia abbreviate na n. Na hii hatua kupitia line mpango na mstari. Hivyo unaweza kuangalia kama mambo nitafanya, vigezo kama mabadiliko, kama mambo kupata updated. Ambayo ni pretty nice. nyingine kitu baridi ni badala ya kurudia amri sawa juu na juu tena na tena, kama wewe tu hit Enter - hivyo unaweza kuona hapa mimi si typed katika kitu chochote - kama mimi tu hit Enter, itakuwa kurudia amri ya awali, au uliopita GDB amri kwamba mimi tu ya kuweka in Naweza kushika kupiga Ingiza na itabidi kuweka wanazidi kupitia line code yangu na mstari. Napenda moyo guys kwenda kuangalia nje ya mipango Buggy nyingine pia. Hatuna muda wa kupata njia ya wote leo katika sehemu. chanzo code ni huko, hivyo unaweza aina ya kuona nini kinaendelea nyuma ya pazia kama wewe kupata kweli kukwama, lakini kwa uchache sana, tu mazoezi ya booting up GDB, mbio mpango mpaka inavunja juu yenu, kupata backtrace, kuhesabia nje nini kazi ajali alikuwa katika, nini mstari huu ulikuwa katika, uchapishaji nje maadili baadhi variable, hivyo tu kupata kujisikia kwa ajili yake, kwa sababu kwamba itakuwa kweli kukusaidia kwenda mbele. Katika hatua hii, sisi ni kwenda nje ya kujiondoa GDB, ambayo huna kutumia kujiondoa au tu q. Kama mpango wako ni katikati ya mbio bado, na ina si exited, itakuwa daima kukuuliza, "Je una uhakika kweli unataka kuacha?" Unaweza tu hit ndiyo. Sasa sisi ni kwenda kuangalia tatizo ijayo tuna, ambayo ni programu ya paka. Kama wewe kuangalia mfupi juu ya imetuma na mabomba, utaona kwamba Tommy anatumia programu hii ya kwamba kimsingi Prints pato yote ya faili screen. Hivyo kama mimi kukimbia paka, hii ni kweli mpango wa kujengwa katika appliance, na kama una Macs unaweza kufanya hili juu ya Mac yako pia, kama wewe kufungua terminal. Na sisi - paka, hebu sema, cp.c, na hit Enter. Nini hii alivyofanya, kama sisi kitabu juu kidogo na kuona ambapo sisi mbio line, au ambapo sisi mbio amri paka, ni literally tu kuchapishwa yaliyomo ya cp.c na screen zetu. Tunaweza kukimbia tena na unaweza kuweka katika files nyingi pamoja. Hivyo unaweza kufanya paka cp.c, na kisha tunaweza pia concatenate faili cat.c, ambayo ni mpango sisi ni juu ya kuandika, na kutakuwa na magazeti files wote nyuma kwa nyuma na screen zetu. Hivyo kama sisi kitabu juu kidogo, tunaona kwamba wakati sisi mbio hii cp.c paka, cat.c, kwanza ni kuchapishwa faili linganisha, na kisha chini yake, kuchapishwa faili cat.c haki ya chini hapa. Sisi ni kwenda kutumia hii kupata tu miguu yetu mvua. Kucheza karibu na uchapishaji rahisi terminal, kuona jinsi kazi. Kama wewe guys kufungua na gedit cat.c, hit Enter, unaweza kuona kwamba mpango tuko tayari kuandika. Tumekuwa pamoja hii nice boiler sahani, hivyo hatuna kutumia muda kuandika nje kwamba wote. Sisi pia kuangalia idadi ya hoja kupita in Sisi magazeti nje nzuri ya matumizi ya ujumbe. Hii ni aina ya kitu tena kuwa, kama tumekuwa kuzungumza juu, kwa karibu ni kama kumbukumbu ya misuli. Kumbuka tu kuendelea kufanya aina moja ya mambo na daima uchapishaji nje baadhi ya aina ya ujumbe kusaidia ili watu kujua jinsi ya kuendesha programu yako. Na paka, ni pretty rahisi; sisi ni kwenda tu kwenda kwa yote ya hoja mbalimbali kwamba walikuwa kupita kwa programu yetu, na sisi ni kwenda magazeti yaliyomo yao nje na screen moja kwa wakati mmoja. Ili magazeti files nje screen, tunakwenda kufanya kitu sawa sana kwa nini tulifanya mwisho wa chemsha bongo. Wakati wa mwisho wa jaribio, kwamba kuajiri mpango, tulikuwa na kufungua faili, na kisha tulikuwa na magazeti hayo. Katika kesi hii, sisi ni kwenda kufungua faili, na sisi ni kwenda kusoma kutoka humo badala yake. Kisha tunakwenda magazeti, badala ya SVG, tunakwenda magazeti kwa screen. Hivyo uchapishaji na screen ve yote kufanyika kabla na printf. Hivyo si kwamba pia mambo. Lakini kusoma faili ni aina ya weird. Tutaweza kwenda kupitia kidogo kidogo kwa wakati. Kama wewe guys kurejea tatizo kwamba mwisho juu ya chemsha bongo yako, tatizo 33, mstari wa kwanza kwamba sisi ni kwenda kufanya hapa, kufungua faili, ni sawa na sisi alivyofanya huko. Hivyo Stella, ni nini kwamba kuangalia line kama, wakati sisi kufungua faili? [Stella] Capital JALADA *, faili - >> Sawa. >> - Ni sawa na fopen. >> Yup. Ambayo katika kesi hii ni? Ni katika maoni. >> Ni katika maoni? argv [i] na r? >> Hasa. Haki juu. Hivyo ni Stella kabisa kulia. Hii ni nini mstari inaonekana kama. Sisi ni kwenda kupata mkondo faili variable, kuhifadhi katika * JALADA, hivyo wote kofia, JALADA, *, na jina la kutofautiana hii itakuwa faili. Tunaweza kuuita chochote sisi kama. Tunaweza kuuita first_file, au file_i, chochote tunatarajia. Na kisha jina la faili ilipitishwa katika juu ya mstari amri kwa mpango huu. Hivyo ni kuhifadhiwa katika argv [i,] na kisha tunakwenda kufungua faili hii katika mode kusoma. Sasa kwa kuwa tumekuwa kufunguliwa faili, nini kitu sisi daima kuwa kukumbuka kufanya wakati wowote tumekuwa kufunguliwa faili? Funga. Hivyo Missy, jinsi gani sisi karibu faili? [Missy] fclose (faili) >> fclose (faili). Hasa. Mkuu. Sawa. Kama sisi kuangalia hii kufanya comment haki hapa, inasema, "Open argv [i] na magazeti yaliyomo yake kwa stdout." Darasa la nje ni jina weird. Stdout ni njia yetu ya kusema tunataka magazeti kwa terminal; tunataka magazeti kwa mkondo kiwango pato. Tunaweza kweli kujikwamua ya maoni hayo hapa hapa. Mimi naenda nakala yake na kuuweka tangu kwamba ni nini sisi alivyofanya. Katika hatua hii, sasa tuna kusoma kidogo faili kidogo. Tumekuwa kujadiliwa michache ya njia za files kusoma. Ambayo ndio ni favorites yako hadi sasa? Ambayo njia umeona au unakumbuka, kusoma files? [Daniel] fread? >> Fread? Hivyo fread ni moja. Jimmy, unajua wengine yoyote? [Jimmy] No >> Sawa. Nope. Charlotte? Alexander? Yoyote ya wengine? Sawa. Hivyo wale wengine ni fgetc, ni moja kwamba tutaweza matumizi mengi. Kuna pia fscanf; guys kuona ruwaza hapa? Wao wote kuanza na f. Kitu cha kufanya na faili. Kuna fread, fgetc, fscanf. Haya yote ni ya kazi ya kusoma. Kwa kuandika tuna fwrite, tuna fputc badala ya fgetc. Sisi pia fprintf kama tuliona juu ya chemsha bongo. Tangu hii ni tatizo kwamba inahusisha kusoma kutoka faili, tunakwenda kutumia moja ya kazi hizi tatu. Sisi siyo kwenda kutumia kazi hizo chini hapa. Kazi hizi ni wote kupatikana katika maktaba standard I / O. Hivyo kama wewe kuangalia juu ya mpango huu, unaweza kuona kwamba tumekuwa tayari ni pamoja na faili header kwa ajili ya maktaba standard I / O. Kama tunataka kufikiri ambayo moja tunataka kutumia, tunaweza daima kufungua kurasa mtu. Hivyo tunaweza aina mtu stdio na kusoma yote juu ya pembejeo stdio na kazi pato katika C. Na sisi tayari kuona oh, kuangalia. Ni kutaja fgetc, kutajwa fputc. Hivyo unaweza drill chini kidogo na kuangalia, kusema, fgetc na kuangalia mtu ukurasa wake. Unaweza kuona kwamba huenda pamoja na rundo zima la kazi nyingine: fgetc, fgets, getc, getchar, anapata, ungetc, na mchango wake wa wahusika na masharti. Hivyo hii ni jinsi sisi kusoma katika wahusika na masharti kutoka files kutoka pembejeo kiwango, ambayo kimsingi ni kutoka kwa mtumiaji. Na hii ni jinsi sisi kufanya hivyo katika C. halisi Hivyo hii si kutumia GetString na kazi GetChar kwamba sisi kutumika kutoka maktaba CS50. Sisi ni kwenda kufanya tatizo hili katika michache ya njia hivyo kwamba unaweza kuona njia mbili tofauti ya kufanya hivyo. Wote kazi fread kwamba Danieli zilizotajwa na fgetc ni nzuri njia ya kufanya hivyo. Nadhani fgetc ni rahisi kidogo, kwa sababu tu ana, kama unaweza kuona, moja hoja, * JALADA kwamba sisi ni kujaribu kusoma tabia kutoka, na kurudi thamani yake ni int. Na hii ni utata kidogo, haki? Kwa sababu sisi ni kupata tabia, hivyo kwa nini hana hii kurudi Char? You guys kuwa na mawazo yoyote juu ya nini hii ili asirudi Char? [Missy majibu, unintelligible] >> Yeah. Hivyo ni Missy kabisa kulia. Kama ni ASCII, basi integer hii inaweza mapped Char halisi. Inaweza kuwa tabia ASCII, na hiyo ni haki. Hiyo ni nini hasa kinatokea. Sisi ni kutumia int kwa sababu tu ana bits zaidi. Ni kubwa kuliko Char; Char yetu pekee ya bits 8, kwamba 1 Byte juu ya mashine yetu 32-bit. Na int ina thamani yote ka 4 'wa nafasi. Na zinageuka kuwa njia fgetc kazi, kama sisi kitabu chini katika Synopsis wetu katika ukurasa huu mtu kidogo kidogo, kitabu njia yote chini. Ni zinageuka kuwa wao kutumia thamani hii maalum iitwayo EOF. Ni mara kwa mara maalum kama thamani ya kurudi kwa kazi fgetc wakati wowote wewe hit mwisho wa faili au kama wewe kupata kosa. Na zinageuka kuwa kufanya kulinganisha hizi na EOF vizuri, unataka kuwa na kwamba kiasi ya ziada ya habari kwamba una katika int kinyume na kutumia variable Char. Hata ingawa fgetc Inazidi tabia kutoka faili, unataka kukumbuka kwamba ni kurudi kitu ambacho ni cha int aina na wewe. Kwamba alisema, ni haki rahisi kutumia. Ni kwenda kutupa tabia, hivyo wote sisi kufanya ni kuendelea kuuliza faili, "Nipe tabia ijayo, nipe tabia ijayo, nipe tabia ijayo," mpaka sisi kupata mwisho wa faili. Na kwamba kuvuta katika tabia moja kwa wakati mmoja kutoka faili yetu, na basi tunaweza kufanya chochote sisi kama na hayo. Tunaweza kukihifadhi, tunaweza kuongeza kwa kamba, tunaweza magazeti nje. Je yoyote ya kwamba. Zooming nyuma nje na kurejea kwa programu yetu cat.c, kama sisi ni kwenda kutumia fgetc, jinsi tunavyoweza mbinu line hii ya pili ya kificho? Sisi ni kwenda kutumia - fread kufanya kitu tofauti kidogo. Na wakati huu, tuko tu kwenda kutumia fgetc kupata moja tabia kwa wakati. Kuchakata faili nzima, nini kinaweza tuna kufanya? Ngapi wahusika ni pale katika faili? Kuna mengi. Hivyo pengine wanataka kupata moja na kisha kupata mwingine na kupata mwingine na kupata mwingine. Ni aina gani ya algorithm unafikiri sisi tupate kuwa na matumizi ya hapa? Ni aina gani ya -? [Alexander] A kwa kitanzi? >> Hasa. Baadhi ya aina ya kitanzi. kwa kitanzi ni kweli mkuu, katika kesi hii. Na kama wewe walikuwa wakisema, inaonekana kama unataka kitanzi juu ya faili nzima, kupata tabia kwa wakati. Mapendekezo yoyote juu ya nini kuwa ili kuangalia kama? [Alexander, unintelligible] >> Sawa, niambie tu katika Kiingereza unachojaribu kufanya? [Alexander, unintelligible] Hivyo katika kesi hii, inaonekana kama sisi ni kujaribu tu kitanzi juu ya faili nzima. [Alexander] Hivyo i > Ukubwa wa -? Nadhani ukubwa wa faili, haki? kawaida - we'll andika tu kama hii. Ukubwa wa faili kwa wakati kuwa, i + +. Hivyo ni zinageuka kuwa njia hii huna kutumia fgetc, na hii ni mpya, ni kwamba hakuna njia rahisi tu kupata ukubwa wa faili pamoja na "sizeof" aina ya kujenga kwamba ve kuona mbele. Wakati sisi kutumia kwamba kazi fgetc, sisi ni kuanzisha aina fulani ya mpya, funky syntax kwa hii kwa kitanzi, ambapo badala ya kutumia tu counter ya msingi kwenda tabia na tabia, sisi ni kwenda kuvuta moja tabia kwa wakati, mhusika mmoja kwa wakati, na njia ya sisi kujua tuko mwishoni si wakati tumekuwa kuhesabiwa idadi fulani ya wahusika, lakini wakati sisi tabia kujiondoa ni kwamba mwisho wa tabia maalum faili. Hivyo tunaweza kufanya hivyo kwa - Mimi wito huu ch, na tunakwenda initialize ni na wito wetu wa kwanza kupata tabia ya kwanza nje ya faili. Hivyo hii sehemu haki hapa, hii ni kwenda kupata tabia nje ya faili na kuhifadhi katika ch kutofautiana. Sisi ni kwenda kuendelea kufanya hili mpaka sisi kupata mwisho wa faili, ambayo sisi kufanya kwa kupima kwa ajili ya tabia si kuwa sawa na tabia ya kuwa maalum EOF. Na kisha badala ya kufanya ch + +, ambayo ingekuwa tu increment thamani, hivyo kama sisi kusoma nje ya SVG, mji mkuu, wanasema, ch + + atatupa b, na kisha tunatarajia kupata c na kisha d. Hiyo ni wazi si nini tunataka. Tunachotaka hapa katika kidogo hii ya mwisho ni tunataka kupata tabia ijayo kutoka faili. Hivyo jinsi tunavyoweza kupata tabia ijayo kutoka faili? Jinsi gani sisi kupata tabia ya kwanza kutoka faili? [Mwanafunzi] fgetfile? >> Fgetc, au, sorry, ungekuwa kabisa kulia. Mimi misspelled ni haki pale. Hivyo yeah. Hapa badala ya kufanya ch + +, sisi ni tu kwenda kuwaita fgetc (faili) tena na kuhifadhi matokeo katika variable yetu sawa ch. [Mwanafunzi swali, unintelligible] >> Hii ni wapi hawa * JALADA guys ni maalum. njia ya wao kufanya kazi ni wao - wakati wa kwanza kufungua - wakati wewe kwanza kufanya wito fopen, * JALADA ufanisi mtumishi kama pointer mwanzo ya faili. Na kisha kila wakati wewe piga fgetc, ni hatua moja tabia kupitia faili. Hiyo wakati wowote wewe piga hii, wewe incrementing pointer faili na tabia moja. Na wakati wewe fgetc tena, wewe ni kusonga ni mwingine tabia na mwingine tabia na mwingine tabia na mwingine tabia. [Mwanafunzi swali, unintelligible] >> Na that's - yeah. Ni aina ya uchawi huu chini ya Hood. Wewe tu kuweka incrementing kupitia. Katika hatua hii, uko na uwezo wa kweli kazi pamoja na tabia. Hivyo jinsi tunavyoweza magazeti hii nje ya screen, sasa? Tunaweza kutumia moja printf kitu kwamba sisi kutumika kabla. Kwamba sisi tumekuwa kutumia wote muhula. Tunaweza kuwaita printf, na tunaweza kupita katika tabia kama hiyo. Njia nyingine ya kufanya hivyo ni badala ya kutumia printf na baada ya kufanya hii string format, tunaweza pia kutumia moja ya kazi nyingine. Tunaweza kutumia fputc, ambayo Prints tabia ya screen, isipokuwa kama tunaangalia fputc - ngoja zoom nje kidogo. Sisi kuona nini ni nzuri ni inachukua katika tabia ya kuwa sisi kusoma nje kwa kutumia fgetc, lakini basi tuna kuwapa mkondo wa magazeti ya. Tunaweza pia kutumia kazi putchar, ambayo kuweka moja kwa moja na nje ya kiwango. Hivyo kuna rundo zima ya chaguzi mbalimbali kwamba tunaweza kutumia kwa ajili ya uchapishaji. Wao ni wote katika maktaba standard I / O. Kila unataka na magazeti - hivyo printf, kwa default, itakuwa magazeti kwa kiwango maalum nje mkondo, ambayo ni stdout kwamba. Hivyo tunaweza tu rejea ni kama aina ya thamani hii uchawi, stdout katika hapa. Lo. Weka semicolon nje. Hii ni mengi ya habari mpya, funky katika hapa. mengi ya hii ni nahau au msemo wenye sana, kwa maana kwamba hii ni code yaliyoandikwa kwa njia hii tu kwa sababu ni safi kusoma, rahisi kusoma. Kuna njia nyingi tofauti ya kufanya hivyo, wengi tofauti kazi unaweza kutumia, lakini sisi huwa tu kufuata ruwaza hizi sawa juu na juu. Hivyo msishangae kama wewe kuona kanuni kama hii kuja tena na tena. Wote haki. Katika hatua hii, tunahitaji kuvunja kwa siku. Shukrani kwa kuja. Shukrani kwa ajili ya kuangalia kama uko online. Na tutaweza kuona wewe wiki ijayo. [CS50.TV]