1 00:00:00,000 --> 00:00:02,730 [Powered by Google Translate] [5 SKIRSNIS mažiau patogūs] 2 00:00:02,730 --> 00:00:05,180 [Nate Hardison, Harvardo universitetas] 3 00:00:05,180 --> 00:00:08,260 [Tai CS50.] [CS50.TV] 4 00:00:08,260 --> 00:00:11,690 Taigi welcome back, vaikinai. 5 00:00:11,690 --> 00:00:16,320 Sveiki atvykę į 5 skyriuje. 6 00:00:16,320 --> 00:00:20,220 Šiuo metu, baigęs viktorinoje 0 ir matęs, kaip tu padarei, 7 00:00:20,220 --> 00:00:25,770 tikiuosi jums jaustis tikrai geras, nes man buvo labai sužavėtas šiame skyriuje balai. 8 00:00:25,770 --> 00:00:28,050 Mūsų interneto žiūrovų, mes turėjo porą klausimų 9 00:00:28,050 --> 00:00:33,680 apie problemą, apie paskutiniąsias dvi problemas - ar viktorinoje, o. 10 00:00:33,680 --> 00:00:39,690 Taigi, mes ketiname eiti per tas tikrai greitai, kad visi mato, kas atsitiko 11 00:00:39,690 --> 00:00:45,060 ir kaip eiti per konkretaus sprendimas, o ne tiesiog peržiūrėti sprendimą pats. 12 00:00:45,060 --> 00:00:50,330 Mes ketiname eiti per pastaruosius porą problemų tikrai greitai, 32 ir 33. 13 00:00:50,330 --> 00:00:53,240 Tik antrą kartą, tad, kad interneto žiūrovai gali pamatyti. 14 00:00:53,240 --> 00:00:59,080 >> Jei kreiptis į jūsų problemą 32, 13 psl, 15 00:00:59,080 --> 00:01:02,730 13 iš 16 32, problema yra visa informacija apie apsikeitimo sandorių. 16 00:01:02,730 --> 00:01:05,010 Visa tai buvo apie Swapping du sveikieji skaičiai. 17 00:01:05,010 --> 00:01:08,740 Tai problema, kad mes norime perėjo kelis kartus paskaitos. 18 00:01:08,740 --> 00:01:13,590 Ir čia, ką mes klausė, jums reikia padaryti, yra greitai atminties pėdsakų. 19 00:01:13,590 --> 00:01:17,000 Užpildyti kintamųjų reikšmių, nes jie yra kamino 20 00:01:17,000 --> 00:01:20,250 kodas eina per šią apsikeitimo funkcija. 21 00:01:20,250 --> 00:01:24,500 Visų pirma, tai, kas mes žiūri - Aš ketina pateikti šį iPad - 22 00:01:24,500 --> 00:01:29,650 visų pirma, tai, ką mes ieškome yra ši eilutė sunumeruoti 6 čia. 23 00:01:29,650 --> 00:01:36,740 Ir tai tik už artumą su ankstesne problema sunumeruoti 6. 24 00:01:36,740 --> 00:01:41,720 Ką mes norime padaryti, rodyti arba ženklinti atminties būklę 25 00:01:41,720 --> 00:01:46,090 nes ji yra tuo metu, kai mes vykdyti šį eilutės numeris 6, 26 00:01:46,090 --> 00:01:52,540 kuri yra efektyviai grąžinti iš mūsų apsikeitimo funkciją čia. 27 00:01:52,540 --> 00:01:59,450 Jei mes slinkti žemyn čia, pamatėme, kad viskas atminties adresai buvo suteikta mums. 28 00:01:59,450 --> 00:02:02,540 Tai labai raktas, mes grįžti į ją tik akimirką. 29 00:02:02,540 --> 00:02:09,240 Ir tada žemyn čia apačioje, mes turėjome šiek tiek atminties diagramą, kad mes ketiname kreiptis į. 30 00:02:09,240 --> 00:02:12,490 Aš iš tikrųjų tai padarė mano iPad. 31 00:02:12,490 --> 00:02:20,720 Taigi, aš ruošiuosi pakaitomis pirmyn ir atgal tarp iPad ir tik dėl prašymo priimti prejudicinį sprendimą šio kodekso. 32 00:02:20,720 --> 00:02:26,540 >> Pradėkime. Pirma, galime sutelkti dėmesį į pirmuosius porą eilučių pagrindinis čia. 33 00:02:26,540 --> 00:02:30,220 Norėdami pradėti, mes ketiname inicijuoti x 1 ir Y 2. 34 00:02:30,220 --> 00:02:33,040 Taigi mes turime du sveikasis skaičius kintamųjų, jie abu bus ant kamino. 35 00:02:33,040 --> 00:02:36,050 Mes ketiname juos įdėti 1 ir A 2. 36 00:02:36,050 --> 00:02:43,150 Taigi, jei aš apversti mano iPad, tikiuosi, pažiūrėkime, - 37 00:02:43,150 --> 00:02:48,660 "Apple TV" veidrodžius, ir čia mes einame. Gerai. 38 00:02:48,660 --> 00:02:51,670 Taigi, jei aš apversti mano iPad, 39 00:02:51,670 --> 00:02:56,220 Noriu inicijuoti X 1 ir Y 2. 40 00:02:56,220 --> 00:03:00,580 Mes darome, kad paprasčiausiai rašyti 1 grafa x 41 00:03:00,580 --> 00:03:07,730 ir 2 langelyje pažymėti y. Gana paprasta. 42 00:03:07,730 --> 00:03:11,620 Taigi, dabar grįžkime prie nešiojamojo kompiuterio, pamatyti, kas vyksta šalia. 43 00:03:11,620 --> 00:03:15,810 Taigi tai kitą eilutę, kai viskas pasidaro gana painu. 44 00:03:15,810 --> 00:03:28,110 Mes pereiname x adresą ir y adresą parametrų a ir b apsikeitimo funkcija. 45 00:03:28,110 --> 00:03:32,380 X ir y adresas adresas yra dalykų, kad mes negalime apskaičiuoti 46 00:03:32,380 --> 00:03:36,360 nesikreipdama į šių kulka taškų, nustatančio teisę čia. 47 00:03:36,360 --> 00:03:39,750 Ir, laimei, pirmieji du kulka taškų pasakykite mums, ką atsakymai. 48 00:03:39,750 --> 00:03:44,740 X atminties adresas yra 10, ir y atminties adresas yra 14. 49 00:03:44,740 --> 00:03:51,870 Taigi tie, kurie vertybės, gauti praėjo, kaip ir b iki viršaus mūsų apsikeitimo funkciją. 50 00:03:51,870 --> 00:04:00,760 Taigi dar kartą, pereiti atgal į mūsų schemoje, galiu rašyti 10, 51 00:04:00,760 --> 00:04:07,400 ir b 14. 52 00:04:07,400 --> 00:04:11,610 Dabar, tai yra, jei mes toliau su apsikeitimo sandoriu. 53 00:04:11,610 --> 00:04:14,520 Taigi prakeiktas atgal vėl prie nešiojamojo kompiuterio, 54 00:04:14,520 --> 00:04:21,079 matome, kad būdas apsikeitimo veikia, aš pirmą kartą dereference ir parduotuvė tmp rezultatas. 55 00:04:21,079 --> 00:04:27,650 Taigi dereference operatorius sako: "Ei, Gydyti kintamasis turinį adresą. 56 00:04:27,650 --> 00:04:33,830 Eiti į kokia yra saugomi šiuo adresu ir įkelti jį. " 57 00:04:33,830 --> 00:04:41,720 Ką jums įkelti kintamojo bus saugomi į mūsų tmp kintamąjį. 58 00:04:41,720 --> 00:04:45,150 Velniškas atgal į iPad. 59 00:04:45,150 --> 00:04:51,690 Jei mes einame spręsti 10, mes žinome, kad adresas 10 yra varible x 60 00:04:51,690 --> 00:04:55,480 , nes mums buvo pasakyta, mūsų kulka, kad x atminties adresas yra 10. 61 00:04:55,480 --> 00:05:00,180 Taigi, mes galime eiti ten, gaunate jį vertė, kuri yra 1, kaip matome mūsų iPad, 62 00:05:00,180 --> 00:05:06,300 ir įkelti į tmp. 63 00:05:06,300 --> 00:05:08,250 Vėlgi, tai nėra galutinis turinys. 64 00:05:08,250 --> 00:05:14,350 Mes ketiname eiti per, ir mes susisieksime su mūsų galutinę būklę programos pabaigoje. 65 00:05:14,350 --> 00:05:17,210 Bet dabar, mes turime vertė 1 saugomi tmp. 66 00:05:17,210 --> 00:05:19,210 >> Ir ten greitas klausimas čia. 67 00:05:19,210 --> 00:05:23,980 [Aleksandras] Ar dereference operatorius - tai tik žvaigždė prieš kintamojo teisė? 68 00:05:23,980 --> 00:05:27,600 >> Taip. Taigi dereference operatorius, kaip mes apversti atgal į mūsų kompiuterį dar kartą, 69 00:05:27,600 --> 00:05:33,780 yra tai priešais žvaigždė. 70 00:05:33,780 --> 00:05:37,460 Ta prasme, tai - jums supriešinti ją su daugybos operatorius 71 00:05:37,460 --> 00:05:42,400 kurioms būtini du dalykus; dereference operatorius Smūginės operatorius. 72 00:05:42,400 --> 00:05:46,130 Tik vieną reikšmę o ne dvejetainiu operatoriaus, 73 00:05:46,130 --> 00:05:48,810 jei taikote dviejų skirtingų reikšmių. 74 00:05:48,810 --> 00:05:52,080 Taip, kad tai, kas vyksta šioje eilutėje. 75 00:05:52,080 --> 00:05:58,390 Mes pakrautas vertė 1 ir saugomi jį į mūsų laikiną kintamąjį. 76 00:05:58,390 --> 00:06:05,800 Kitą eilutę, mes saugome b turinį į 77 00:06:05,800 --> 00:06:12,630 arba, tiksliau sakant, mes saugome turinį, kad b yra nukreipta į vietą, kurioje yra nukreipta. 78 00:06:12,630 --> 00:06:17,690 Jei mes analizuojame iš dešinės į kairę, mes ketiname dereference b, 79 00:06:17,690 --> 00:06:23,580 mes ketiname spręsti 14, mes ketiname patraukti sveikasis skaičius, kad yra ten, 80 00:06:23,580 --> 00:06:26,900 ir tada mes ketiname pereiti nurodytu adresu 10, 81 00:06:26,900 --> 00:06:34,240 ir mes ketiname mesti į tą erdvę rezultatą mūsų dereference b. 82 00:06:34,240 --> 00:06:40,080 Velniškas atgal į mūsų iPad, kur mes galime padaryti tai šiek tiek daugiau konkrečių, 83 00:06:40,080 --> 00:06:44,070 tai gali padėti, jei aš rašau numerius adresų. 84 00:06:44,070 --> 00:06:53,820 Taigi mes žinome, kad y, mes esame Adresas 14 x 10 adresu. 85 00:06:53,820 --> 00:07:00,180 Kai mes pradedame b, mes dereference b, mes ketiname patraukti vertė Vertė 2. 86 00:07:00,180 --> 00:07:08,320 Mes ketiname patraukti šią vertę, nes tai yra vertė, kuri gyvena 14 adresu. 87 00:07:08,320 --> 00:07:15,700 Ir mes ketiname įdėti jį į kintamąjį, kuri gyvena 10 adresu, 88 00:07:15,700 --> 00:07:19,160 , kas yra teisinga, atitinkantys mūsų kintamasis X. 89 00:07:19,160 --> 00:07:21,810 Taigi, mes galime padaryti šiek tiek perrašyti čia 90 00:07:21,810 --> 00:07:35,380 kai mes atsikratyti mūsų 1, o vietoj to mes rašome 2. 91 00:07:35,380 --> 00:07:39,560 Taigi, visi gerai ir gerai pasaulyje, nors mes jau perrašyti x. 92 00:07:39,560 --> 00:07:44,890 Mes saugomi x seną vertę mūsų tmp kintamąjį. 93 00:07:44,890 --> 00:07:50,210 Taigi, mes galime užbaigti apsikeitimo sandorio su į kitą eilutę. 94 00:07:50,210 --> 00:07:53,030 Velniškas atgal į mūsų kompiuterį. 95 00:07:53,030 --> 00:07:58,150 Dabar telieka imtis turinį iš mūsų laikiną kintamąjį 96 00:07:58,150 --> 00:08:05,630 ir laikyti juos į kintamąjį, kuris gyvena tuo adresu, b. 97 00:08:05,630 --> 00:08:10,230 Taigi, mes ketiname efektyviai dereference b gauti prieigą prie kintamasis 98 00:08:10,230 --> 00:08:14,340 , kuri yra adresu, kad B turi, 99 00:08:14,340 --> 00:08:19,190 ir mes ketiname stuff, kad tmp į jį akcijų vertę. 100 00:08:19,190 --> 00:08:23,280 Velniškas atgal į iPad dar kartą. 101 00:08:23,280 --> 00:08:31,290 Galiu ištrinti šią vertę, 2, 102 00:08:31,290 --> 00:08:41,010 ir vietoj to, mes kopijuoti 1 teisę į jį. 103 00:08:41,010 --> 00:08:43,059 Tada kitą eilutę, kuri vykdo, žinoma - 104 00:08:43,059 --> 00:08:47,150 jei mes apversti atgal į nešiojamas - tai 6 punktas, 105 00:08:47,150 --> 00:08:52,500 tai yra taškas, kuriame mes norėjome mūsų schema visiškai užpildyti. 106 00:08:52,500 --> 00:08:58,940 Taigi prakeiktas atgal į iPad, dar kartą, tik, kad jūs galite pamatyti užpildytą diagramą, 107 00:08:58,940 --> 00:09:06,610 galite matyti, kad mes turime į 10 a, 14 b, tmp 1, 2 x, ir y 1 a. 108 00:09:06,610 --> 00:09:11,000 Ar yra kokių nors klausimų apie šį? 109 00:09:11,000 --> 00:09:14,640 Ar tai, kad daugiau prasmės, ėjo per jį? 110 00:09:14,640 --> 00:09:24,850 Padaryti mažiau prasmės? Tikimės, kad ne. Gerai. 111 00:09:24,850 --> 00:09:28,230 >> Pointeriai yra labai sudėtinga tema. 112 00:09:28,230 --> 00:09:33,420 Vienas iš vaikinų, mes dirbame su posakis yra labai dažnas: 113 00:09:33,420 --> 00:09:36,590 "Norėdami suprasti nurodymus, jums reikia pirmiausia suprasti patarimų." 114 00:09:36,590 --> 00:09:40,530 O aš manau, yra labai teisinga. Jis imtis šiek tiek laiko priprasti prie jo. 115 00:09:40,530 --> 00:09:45,360 Piešimas daug nuotraukų, daug atminties diagramas kaip šis, yra labai naudinga, 116 00:09:45,360 --> 00:09:49,480 ir po to, kai jūs einate per, pavyzdžiui, po pavyzdžiui, po to, kai, pavyzdžiui, 117 00:09:49,480 --> 00:09:54,450 jis bus pradėti uždirbti šiek tiek daugiau prasmės ir šiek tiek daugiau prasmės ir šiek tiek daugiau prasmės. 118 00:09:54,450 --> 00:10:01,560 Galiausiai, vieną dieną, jūs visa tai visiškai įsisavinti. 119 00:10:01,560 --> 00:10:13,800 Kokių nors klausimų Prieš mes pereiti į kitą problemą? Gerai. 120 00:10:13,800 --> 00:10:18,840 Taigi apversti pirmyn prie nešiojamojo kompiuterio. 121 00:10:18,840 --> 00:10:23,300 Kita problema, mes turime, yra problema numeris 33 failą I / O. 122 00:10:23,300 --> 00:10:26,350 Priartinti šioje šiek tiek. 123 00:10:26,350 --> 00:10:28,710 Problema 33 - Taip? 124 00:10:28,710 --> 00:10:32,110 >> [Daniel], aš tiesiog turėjo greitai klausimą. Ši žvaigždė ar žvaigždutė, 125 00:10:32,110 --> 00:10:35,590 ji vadinama dereferencing, kai jūs naudojate žvaigždutę prieš. 126 00:10:35,590 --> 00:10:38,820 Kas tai pavadinti, kai jūs naudojate ampersendo prieš? 127 00:10:38,820 --> 00:10:43,140 >> Ampersand prieš adresas operatoriaus. 128 00:10:43,140 --> 00:10:45,880 Taigi leiskite slinkti atgal iki. 129 00:10:45,880 --> 00:10:49,310 Oi. Aš priartinimo režimu, todėl aš negaliu tikrai slinkties. 130 00:10:49,310 --> 00:10:52,780 Jei pažvelgsime į šio kodekso tikrai greitai čia, 131 00:10:52,780 --> 00:10:54,980 dar kartą, tas pats vyksta. 132 00:10:54,980 --> 00:10:59,180 Jei pažvelgsime į šio kodekso čia, į šią eilutę, kurioje norite skambinti apsikeitimo, 133 00:10:59,180 --> 00:11:10,460 tiesiog pasakyti, Ampersand "gauti adresu, kuriuo gyvena kintamasis X". 134 00:11:10,460 --> 00:11:14,460 Kai jūsų sudarytojas kaupia savo kodą, 135 00:11:14,460 --> 00:11:20,590 jis turi iš tikrųjų fiziškai išskirti vietą atmintyje visiems savo kintamiesiems gyventi. 136 00:11:20,590 --> 00:11:24,910 Ir kas kompiliatorius gali tada daryti, kai jis jau parengė viską, 137 00:11:24,910 --> 00:11:31,110 jis žino, "O, aš įdėti x 10 adresu. aš įdėti y 14 adresu." 138 00:11:31,110 --> 00:11:34,640 Jis gali užpildyti šių jūsų vertybes. 139 00:11:34,640 --> 00:11:44,740 Todėl jūs galite tada - jis gali tada pereiti tai ir pass ir Y taip pat. 140 00:11:44,740 --> 00:11:50,730 Šie vaikinai gauti adresą, bet jie taip pat, kai pereisite į apsikeitimo funkcija, 141 00:11:50,730 --> 00:11:55,690 šio tipo informacija, šis int * čia, sako, kompiliatorių, 142 00:11:55,690 --> 00:12:01,350 "Gerai, mes ketiname būti aiškina šį adresą kaip kintamąjį adresą. 143 00:12:01,350 --> 00:12:05,900 Kaip int adresą, kuris skiriasi nuo charakterio rodiklio adresą 144 00:12:05,900 --> 00:12:09,930 nes int užima 32-bitų mašina, užima 4 baitų erdvės, 145 00:12:09,930 --> 00:12:13,310 kadangi simbolis užima tik 1 baitas vietos. 146 00:12:13,310 --> 00:12:17,310 , Todėl labai svarbu žinoti, taip pat, kas yra kas gyvena, ką tipo reikšmės 147 00:12:17,310 --> 00:12:20,340 gyvena adresu, kad gavo praėjo. 148 00:12:20,340 --> 00:12:22,020 Arba adresą, kad jūs esate, susijusius su. 149 00:12:22,020 --> 00:12:29,020 Tokiu būdu, jūs žinote, kiek baitų informacijos, kad iš tikrųjų įkelti iš savo atminties. 150 00:12:29,020 --> 00:12:31,780 Ir tada, taip, tai dereference operatorius, kaip jūs klausia, 151 00:12:31,780 --> 00:12:37,200 eina ir pasiekia informaciją tam tikru adresu. 152 00:12:37,200 --> 00:12:42,820 Todėl ji sako, šio kintamojo čia, gydyti turinį kaip adresas, 153 00:12:42,820 --> 00:12:47,880 eiti tuo IP adresu, ir ištraukite, įkelti į procesorių, apkrovos į registrą 154 00:12:47,880 --> 00:12:56,340 faktinių reikšmių arba turinį, kurie gyvena šiuo adresu. 155 00:12:56,340 --> 00:12:59,620 Ar turite klausimų? Tai yra geras klausimai. 156 00:12:59,620 --> 00:13:01,650 Tai nauja terminologija per daug. 157 00:13:01,650 --> 00:13:09,800 Taip pat rūšies funky, matydamas & ir * skirtingose ​​vietose. 158 00:13:09,800 --> 00:13:13,180 >> Gerai. 159 00:13:13,180 --> 00:13:18,530 Taigi atgal į problemą 33, failą I / O. 160 00:13:18,530 --> 00:13:22,540 Tai buvo viena iš tų problemų, kurias, manau, porą dalykų nutiko. 161 00:13:22,540 --> 00:13:25,400 Viena, tai gana nauja tema. 162 00:13:25,400 --> 00:13:30,590 Gana greitai ji buvo pristatyta prieš viktorinoje 163 00:13:30,590 --> 00:13:33,400 ir tada aš manau, kad jis buvo natūra kaip vieną iš tų žodžių problemų matematikos 164 00:13:33,400 --> 00:13:39,720 kur jie suteiks jums daug informacijos, bet jūs iš tikrųjų nereikia baigti naudoti jo toną. 165 00:13:39,720 --> 00:13:44,060 Pirmoji dalis šios problemos yra aprašoma tai, ką CSV failą. 166 00:13:44,060 --> 00:13:50,620 Dabar CSV failą, Pagal aprašymą, yra kableliais atskirtų reikšmių failas. 167 00:13:50,620 --> 00:13:55,300 Priežastis, tai yra ne visi, kas įdomu, ir priežastis, jūs kada nors naudoti juos, 168 00:13:55,300 --> 00:14:00,800 , nes, kaip daugelis iš jūsų kada nors naudojamas dalykų, kaip "Excel"? 169 00:14:00,800 --> 00:14:03,240 Išsiaiškinti, dauguma iš jūsų, tikriausiai, arba naudoti tam tikru momentu savo gyvenime. 170 00:14:03,240 --> 00:14:06,430 Jums naudoti kažką panašaus į "Excel". 171 00:14:06,430 --> 00:14:10,940 Siekiant gauti duomenis iš Excel skaičiuoklę arba su juo daryti bet tvarkymo rūšiuoti, 172 00:14:10,940 --> 00:14:17,240 jei norite parašyti C programa ar Python programą, "Java" programa, 173 00:14:17,240 --> 00:14:20,070 kovoti su duomenų, kurie saugomi ten, 174 00:14:20,070 --> 00:14:23,170 vienas iš labiausiai paplitusių būdų, kaip gauti jį į CSV failą. 175 00:14:23,170 --> 00:14:26,850 Ir jūs galite atverti programą "Excel", ir kai jūs einate į "Save As" dialogo, 176 00:14:26,850 --> 00:14:32,840 galite gauti iš faktinė CSV failą. 177 00:14:32,840 --> 00:14:35,890 >> Patogu žinoti, kaip elgtis su šių dalykų. 178 00:14:35,890 --> 00:14:42,010 Kaip ji veikia, yra tai, kad jis panašus į - turiu galvoje, tai iš esmės mėgdžiodami skaičiuoklę, 179 00:14:42,010 --> 00:14:47,590 kur, kaip matome čia, labai kairę pačią gabalas, 180 00:14:47,590 --> 00:14:49,910 mes turime visas pavardes. 181 00:14:49,910 --> 00:14:54,670 Taigi, mes turime Malan, tada Hardison ir tada Bowden, MacWilliam ir tada Chan. 182 00:14:54,670 --> 00:14:59,470 Visi pavardės. Ir tada kableliais atskiriami iš vardai pavardes. 183 00:14:59,470 --> 00:15:02,970 David, Nate, Rob, Tommy, ir Zamyla. 184 00:15:02,970 --> 00:15:06,850 Aš visada išmaišyti Robby ir Tom. 185 00:15:06,850 --> 00:15:10,940 Ir tada, pagaliau, trečiasis stulpelis elektroninio pašto adresus. 186 00:15:10,940 --> 00:15:18,500 Kai jūs suprantate, kad likusi programos dalis yra gana paprasta įgyvendinti. 187 00:15:18,500 --> 00:15:23,850 Ką mes padarėme, siekiant imituoti tą pačią struktūrą, mūsų C programos 188 00:15:23,850 --> 00:15:27,510 yra mes naudojame struktūrą. 189 00:15:27,510 --> 00:15:30,520 Mes pradėsime žaisti su jais šiek tiek daugiau, taip pat. 190 00:15:30,520 --> 00:15:35,790 Mes juos pamatė pirmą šiek tiek problemą, 3, kai mes buvo susijusios su žodynų. 191 00:15:35,790 --> 00:15:40,290 Bet tai darbuotojai struct saugo pavardę, vardą ir elektroninio pašto adresą. 192 00:15:40,290 --> 00:15:44,500 Tiesiog kaip mūsų CSV failą saugoti. 193 00:15:44,500 --> 00:15:47,950 Todėl tai konvertuoti iš vieno formato į kitą. 194 00:15:47,950 --> 00:15:54,630 Mes turime konvertuoti, šiuo atveju, Komisijos tarnybų struct į liniją, 195 00:15:54,630 --> 00:15:59,060 atskirkite kableliais linija, kaip kad. 196 00:15:59,060 --> 00:16:01,500 Ar tai prasminga? Jus vaikinai quiz, 197 00:16:01,500 --> 00:16:07,680 todėl aš įsivaizduokite, kad turite bent jau turėjo šiek tiek laiko pagalvoti apie tai. 198 00:16:07,680 --> 00:16:16,410 >> Nuomos funkcija, problema prašo mums imtis - we'll padidinti šioje šiek tiek - 199 00:16:16,410 --> 00:16:22,480 personalo struktūrą, personalo struct, vardas-ai, 200 00:16:22,480 --> 00:16:30,900 ir pridėti savo turinį į mūsų staff.csv failą. 201 00:16:30,900 --> 00:16:34,230 Pasirodo, kad tai yra gana paprasta naudoti. 202 00:16:34,230 --> 00:16:37,430 Mes rūšies pažaisti su šių funkcijų šiek tiek daugiau šiandien. 203 00:16:37,430 --> 00:16:44,510 Tačiau šiuo atveju, fprintf funkcija yra tikrai labai svarbus. 204 00:16:44,510 --> 00:16:51,960 Taigi fprintf, mes galime spausdinti, kaip jus vaikinai naudojant printf visą šį terminą. 205 00:16:51,960 --> 00:16:55,050 Galite printf linija į failą. 206 00:16:55,050 --> 00:16:59,030 Taigi, o ne tik įprastą printf skambutį, kai jūs suteikiate jai formato eilutę 207 00:16:59,030 --> 00:17:05,380 ir tada jums pakeisti visus kintamuosius su šiais argumentais, 208 00:17:05,380 --> 00:17:11,290 fprintf, jūsų labai pirmasis argumentas yra, o ne failą, kurį norite įrašyti į. 209 00:17:11,290 --> 00:17:21,170 Jei mes pažvelgti į tai, į prietaisą, pavyzdžiui, vyras fprintf, 210 00:17:21,170 --> 00:17:25,980 mes galime pamatyti skirtumą tarp printf ir fprintf. 211 00:17:25,980 --> 00:17:28,960 Aš priartinti čia šiek tiek. 212 00:17:28,960 --> 00:17:33,140 Taigi su printf, mes suteikiame jai format string ir tada vėlesni argumentai 213 00:17:33,140 --> 00:17:37,580 yra visi kintamieji pakeitimo ar keičia į mūsų formato eilutę. 214 00:17:37,580 --> 00:17:47,310 Kadangi fprintf, pirmasis argumentas iš tiesų yra upelis vadinamas šį failą *. 215 00:17:47,310 --> 00:17:51,800 >> Juda atgal čia mūsų nuoma, 216 00:17:51,800 --> 00:17:54,550 Mes jau mūsų failas * srautas atvėrė mums. 217 00:17:54,550 --> 00:17:57,810 Štai ką pirmoji eilutė; ji atveria staff.csv failą, 218 00:17:57,810 --> 00:18:01,690 ji atidaro papildymo režimui ir visi, kad liko mums daryti 219 00:18:01,690 --> 00:18:08,640 personalo struktūros rašyti į failą. 220 00:18:08,640 --> 00:18:10,870 Ir, pažiūrėkime, aš noriu naudoti iPad? 221 00:18:10,870 --> 00:18:17,900 Aš naudoti iPad. Mes turime negaliojančiu - tegul tai ant stalo, kad aš galiu rašyti šiek tiek geriau - 222 00:18:17,900 --> 00:18:33,680 netekti nuoma, ir tai trunka vieną argumentą, personalo struktūra, vadinama-ai. 223 00:18:33,680 --> 00:18:44,120 Turime savo petnešos, mes turime mūsų failą * "failą, 224 00:18:44,120 --> 00:18:48,380 mes turime fopen linija mums dovanotą, 225 00:18:48,380 --> 00:18:51,890 ir aš tiesiog parašykite jį kaip taškai, nes tai jau į PEDIA. 226 00:18:51,890 --> 00:19:00,530 Ir tada mūsų kitą eilutę, mes ketinate skambinti į fprintf 227 00:19:00,530 --> 00:19:03,700 ir mes ketiname pereiti į failą, kad mes norime spausdinti, 228 00:19:03,700 --> 00:19:10,290 ir tada mūsų format string, kuris - 229 00:19:10,290 --> 00:19:14,300 Aš tegul jus vaikinai man pasakyti, kaip jis atrodo. 230 00:19:14,300 --> 00:19:20,500 Kaip apie jus, Stella? Ar žinote, kas pirmoji dalis iš formato eilutę atrodo? 231 00:19:20,500 --> 00:19:24,270 [Stella] Nesu tikras. >> Feel free to ask Jimmy. 232 00:19:24,270 --> 00:19:27,690 Ar žinote, Jimmy? 233 00:19:27,690 --> 00:19:31,000 [Jimmy] Ar tai tiesiog būti paskutinis? Nežinau. Aš nesu visiškai tikras. 234 00:19:31,000 --> 00:19:39,020 >> Gerai. Kaip apie tai, ar kas nors į egzaminą gauti tai teisinga? 235 00:19:39,020 --> 00:19:41,770 Nr Gerai. 236 00:19:41,770 --> 00:19:47,920 Pasirodo, kad čia visi mes turime padaryti, norime kiekvienas mūsų personalo struktūros dalį 237 00:19:47,920 --> 00:19:53,290 turi būti spausdinami taip, kaip į mūsų failo eilutę. 238 00:19:53,290 --> 00:19:59,900 Mes tiesiog naudoti STRING Keitimas pobūdžio tris skirtingus kartus, nes mes turime pavardę 239 00:19:59,900 --> 00:20:07,160 po kablelio, tada vardas, atskirti kableliais, 240 00:20:07,160 --> 00:20:12,430 ir galiausiai jo elektroninio pašto adresą, kuris yra po - tai ne 241 00:20:12,430 --> 00:20:15,140 montuoti ant mano ekrano, bet tai po naujos eilutės simboliai. 242 00:20:15,140 --> 00:20:20,060 Taigi, aš ruošiuosi rašyti tik ten. 243 00:20:20,060 --> 00:20:23,560 Ir tada po mūsų format string, 244 00:20:23,560 --> 00:20:27,880 mes tiesiog keitimus, kuriuos mes pasiekti naudodami taškinę žymėjimą 245 00:20:27,880 --> 00:20:31,370 kad mes matėme problemą, 3. 246 00:20:31,370 --> 00:20:48,820 Mes galime naudoti s.last, s.first ir s.email 247 00:20:48,820 --> 00:20:58,990 pakeisti šių trijų verčių į mūsų formato eilutę. 248 00:20:58,990 --> 00:21:06,190 Taigi, kaip, kad eiti? Prasminga? 249 00:21:06,190 --> 00:21:09,700 Taip? Ar ne? Galbūt? Gerai. 250 00:21:09,700 --> 00:21:14,180 >> Galutinis dalykas, kad mes po to, kai mes spausdinami ir po to, kai mes atidarėme mūsų failą: 251 00:21:14,180 --> 00:21:17,370 kai mes atidarė failą, mes visada turite prisiminti, kad jį uždaryti. 252 00:21:17,370 --> 00:21:19,430 Nes kitaip mes galų gale nesandarus atminties, 253 00:21:19,430 --> 00:21:22,500 naudojant failų aprašai. 254 00:21:22,500 --> 00:21:25,950 Taigi, norint uždaryti, kuri funkcija mes naudojame? Daniel? 255 00:21:25,950 --> 00:21:30,120 [Daniel] fclose? >> Fclose, tiksliai. 256 00:21:30,120 --> 00:21:37,520 Taigi paskutinė dalis šios problemos buvo tinkamai uždarykite failą, naudojant fclose funkciją, 257 00:21:37,520 --> 00:21:40,370 tik atrodo, kad. 258 00:21:40,370 --> 00:21:43,880 Ne per kvailai. 259 00:21:43,880 --> 00:21:46,990 Cool. 260 00:21:46,990 --> 00:21:49,520 Taigi, kad viktorina 33 problema. 261 00:21:49,520 --> 00:21:52,480 Mes turime tikrai daugiau failą I / O artėja. 262 00:21:52,480 --> 00:21:55,130 Mes padarysime šiek tiek daugiau paskaitą šiandien, arba skyriuje šiandien 263 00:21:55,130 --> 00:22:01,710 , nes tai, kas vyksta sudaro didžiąją šio artėjančius pset. 264 00:22:01,710 --> 00:22:05,020 Pereikime nuo viktorinoje šiame taške. Taip? 265 00:22:05,020 --> 00:22:10,880 >> [Charlotte]] Kodėl fclose (failas), o ne fclose (staff.csv)? 266 00:22:10,880 --> 00:22:19,100 >> Ah. Nes paaiškėja, kad - taip į klausimą, kuris yra puikus vienas, 267 00:22:19,100 --> 00:22:27,800 Štai kodėl, kai mes rašome fclose, mes raštu fclose (failas) žvaigždučių kintamąjį 268 00:22:27,800 --> 00:22:33,680 , o ne į failo pavadinimą, staff.csv? Ar tai teisinga? Taip. 269 00:22:33,680 --> 00:22:39,570 Taigi leiskite pažvelgti. Jei aš perjungiu atgal į mano nešiojamas, 270 00:22:39,570 --> 00:22:45,040 ir pažiūrėkime tuo fclose funkcija. 271 00:22:45,040 --> 00:22:51,460 Taigi fclose funkcija uždaro srautą, ir tai trunka, kad rodyklė prie upelio, kad mes norime uždaryti, 272 00:22:51,460 --> 00:22:57,010 o ne faktinės bylos pavadinimą, kad mes norime uždaryti. 273 00:22:57,010 --> 00:23:01,620 Ir tai yra todėl užkulisiuose, kai skambinate fopen, 274 00:23:01,620 --> 00:23:12,020 kai atidarote failą, jūs iš tikrųjų skiriant atminties saugoti informaciją apie failą. 275 00:23:12,020 --> 00:23:16,380 Taigi jūs turite failo rodyklę, kad turi informacijos apie failą, 276 00:23:16,380 --> 00:23:23,080 pavyzdžiui, jis yra atviras, jo dydis, kur jūs esate šiuo metu į failą, 277 00:23:23,080 --> 00:23:29,100 taip, kad jūs galite padaryti, skaityti ir rašyti toje konkrečioje vietoje per failo skambučius. 278 00:23:29,100 --> 00:23:38,060 Jūs galų gale uždaryti rodyklę, o ne uždaryti failo pavadinimą. 279 00:23:38,060 --> 00:23:48,990 >> Taip? [Daniel] Taigi, kad būtų galima panaudoti nuoma, norėtumėte pasakyti - kaip ji gauti vartotojo įvesties? 280 00:23:48,990 --> 00:23:53,830 Ar fprintf veikti kaip GetString ta prasme, kad jis bus tiesiog laukti naudotojo įvesties 281 00:23:53,830 --> 00:23:57,180 ir paprašys jūsų įvesti arba laukti, kol jums įrašyti šiuos tris dalykus? 282 00:23:57,180 --> 00:24:00,480 Ar jums reikia naudoti kažką įgyvendinti nuoma? 283 00:24:00,480 --> 00:24:04,100 >> Taip. Taigi, mes ne - klausimas buvo, kaip mes gauti vartotojo įvesties 284 00:24:04,100 --> 00:24:09,220 siekiant įgyvendinti nuoma? Ir ką mes turime čia, yra nuomos skambintojo 285 00:24:09,220 --> 00:24:17,690 priimtas šio darbuotojai struct visus saugomus duomenis struct jau. 286 00:24:17,690 --> 00:24:22,990 Taigi fprintf gali tiesiog parašyti, kad duomenis tiesiogiai į failą. 287 00:24:22,990 --> 00:24:25,690 Ten nereikia laukti naudotojo įvesties. 288 00:24:25,690 --> 00:24:32,110 Vartotojo jau įvesties tinkamai išleisti jį šio darbuotojai struct. 289 00:24:32,110 --> 00:24:36,510 Ir viskas, be abejo, būtų galima nutraukti, jei bet kuris iš šių rodykles null, 290 00:24:36,510 --> 00:24:40,370 todėl mes pereikite atgal čia ir mes pažvelgti į mūsų struct. 291 00:24:40,370 --> 00:24:43,640 Mes turime eilutės paskutinis, styginių pirma, styginių el.pašto. 292 00:24:43,640 --> 00:24:48,530 Mes dabar žinome, kad visi iš tų, iš tikrųjų, po gaubtu, char * kintamieji. 293 00:24:48,530 --> 00:24:53,470 , Kurie gali arba negali būti nukreipta į nulis. 294 00:24:53,470 --> 00:24:55,800 Jie gali būti nukreipta į atmintį dėl krūvą, 295 00:24:55,800 --> 00:24:59,650 gal atminties kamino. 296 00:24:59,650 --> 00:25:04,580 Mes tikrai žinome, bet, jei bet kuris iš šių rodykles yra nulis, arba neteisingas, 297 00:25:04,580 --> 00:25:08,120 , kad bus tikrai katastrofos mūsų nuomos funkciją. 298 00:25:08,120 --> 00:25:11,050 Tai buvo kažkas, kad buvo natūra už egzaminą. 299 00:25:11,050 --> 00:25:16,440 Mes ne nerimauti, kad. 300 00:25:16,440 --> 00:25:22,170 Didysis. Gerai. Taigi, pereinant nuo viktorinoje. 301 00:25:22,170 --> 00:25:25,760 >> Leiskite uždaryti šį vaikiną, ir mes ketiname pažvelgti į pset 4. 302 00:25:25,760 --> 00:25:34,700 Taigi, jei jus vaikinai pažvelgti į pset spec, kai galite jį pasiekti, cs50.net/quizzes, 303 00:25:34,700 --> 00:25:42,730 mes ketiname eiti per "Section problemų šiandien. 304 00:25:42,730 --> 00:25:52,240 Aš Pereikite - Klausimų skyriuje prasideda iš pset spec trečiame puslapyje. 305 00:25:52,240 --> 00:25:57,800 Ir pirmoji dalis prašo jūsų eiti ir žiūrėti trumpas ir detalaus vamzdžių. 306 00:25:57,800 --> 00:26:02,820 , Kuris buvo natūra Cool short, rodo jums keletą naujų, cool komandų eilutės gudrybės, kad jūs galite naudoti. 307 00:26:02,820 --> 00:26:06,050 Ir tada mes turime keletą klausimų jums, taip pat. 308 00:26:06,050 --> 00:26:10,860 Šis klausimas apie srautus, į kurį printf rašo pagal nutylėjimą, 309 00:26:10,860 --> 00:26:15,920 mes tipo tik šiek tiek užsiminė apie metu senumo. 310 00:26:15,920 --> 00:26:22,380 Tai fprintf, kad mes buvome tik aptarti priima kaip savo argumentą, FILE * srautas. 311 00:26:22,380 --> 00:26:26,580 fclose trunka FILE * srautas, taip pat, 312 00:26:26,580 --> 00:26:32,660 ir gražinama reikšmė fopen suteikia jums FILE * srautas, taip pat. 313 00:26:32,660 --> 00:26:36,060 Priežastis, kodėl mes nematėme tų, kurie buvo, kai mes nagrinėjami printf 314 00:26:36,060 --> 00:26:39,450 yra nes printf turi numatytąjį srautą. 315 00:26:39,450 --> 00:26:41,810 Ir numatytasis upelis, su kuriuo jis rašo 316 00:26:41,810 --> 00:26:45,190 sužinosite apie per trumpą laiką. 317 00:26:45,190 --> 00:26:50,080 Taigi tikrai atsižvelgti į jo išvaizdą. 318 00:26:50,080 --> 00:26:53,010 >> Skyriuje šiandienos, mes ketiname kalbėti šiek tiek apie GDB, 319 00:26:53,010 --> 00:26:57,720 nes labiau susipažinę esate su juo, daugiau praktikos jūs gaunate su juo, 320 00:26:57,720 --> 00:27:01,390 gali geriau jums bus faktiškai medžioti žemyn klaidas savo kodą. 321 00:27:01,390 --> 00:27:05,540 Tai pagreitina derinimo iki ypatingai. 322 00:27:05,540 --> 00:27:09,230 Taigi, naudojant printf, kiekvieną kartą jums, kad jūs turite perkompiliuoti savo kodą, 323 00:27:09,230 --> 00:27:13,000 turite paleisti jį dar kartą, kartais turite aplink perkelti printf skambutį, 324 00:27:13,000 --> 00:27:17,100 komentaras iš kodo, tereikia šiek tiek laiko. 325 00:27:17,100 --> 00:27:20,850 Mūsų tikslas yra išbandyti ir įtikinti jus, kad su GDB, galite iš esmės 326 00:27:20,850 --> 00:27:26,810 printf nieko, bet savo kodą, ir jūs niekada neturite perkompiliuoti. 327 00:27:26,810 --> 00:27:35,120 Jūs niekada neturite pradėti ir išlaikyti atspėti kur printf kitą. 328 00:27:35,120 --> 00:27:40,910 Pirmas dalykas, kurį reikia padaryti, tai nukopijuokite šią eilutę ir gauti sekcijos kodą iš interneto. 329 00:27:40,910 --> 00:27:47,530 Aš nukopijavę šią kodo eilutę, kad sako, "wget ​​http://cdn.cs50.net". 330 00:27:47,530 --> 00:27:49,510 Aš ruošiuosi nukopijuokite jį. 331 00:27:49,510 --> 00:27:55,950 Aš ruošiuosi eiti į mano prietaiso, nutolinti, todėl jūs galite pamatyti, ką aš darau, 332 00:27:55,950 --> 00:28:01,890 įklijuodami jį ten, ir kai aš paspauskite "Enter", tai wget komanda tiesiog yra interneto gauti. 333 00:28:01,890 --> 00:28:06,210 Ji ketina nugriauti šį failą iš interneto, 334 00:28:06,210 --> 00:28:11,790 ir tai vyksta įrašyti jį į einamojo katalogo. 335 00:28:11,790 --> 00:28:21,630 Dabar, jei aš sąrašą savo dabartinę direktoriją galite pamatyti, kad aš turiu šį section5.zip failą teisę ten. 336 00:28:21,630 --> 00:28:25,260 Būdas kovoti su tuo vaikinu, išpakuokite jį, 337 00:28:25,260 --> 00:28:27,650 tai galite padaryti į komandų eilutę, kaip tai. 338 00:28:27,650 --> 00:28:31,880 Section5.zip. 339 00:28:31,880 --> 00:28:36,980 Kad bus išpakuokite jį, sukurti man aplanką, 340 00:28:36,980 --> 00:28:40,410 išpūsti turinį, juos ten. 341 00:28:40,410 --> 00:28:47,410 Taigi, dabar aš galiu eiti į mano 5 skirsnis kataloge naudojant komandą cd. 342 00:28:47,410 --> 00:28:58,310 Išvalyti ekraną, naudojant aiškius. Taigi išvalyti ekraną. 343 00:28:58,310 --> 00:29:02,280 Dabar aš turiu gražų švarų terminalą spręsti. 344 00:29:02,280 --> 00:29:06,200 >> Dabar, jei aš sąrašą visus failus, kad matau šiame kataloge, 345 00:29:06,200 --> 00:29:12,270 matote, kad aš turiu keturi failai: buggy1, buggy2, buggy3, ir buggy4. 346 00:29:12,270 --> 00:29:16,180 Aš taip pat gavo savo atitinkamas C failus. 347 00:29:16,180 --> 00:29:20,400 Mes neketiname pažvelgti į C failus dabar. 348 00:29:20,400 --> 00:29:24,140 Vietoj to, mes ketiname juos naudoti, kai mes atverti GDB. 349 00:29:24,140 --> 00:29:28,220 Mes nuolat juos aplink, kad mes turime prieigą prie šaltinio kodą, kai mes naudojame GDB 350 00:29:28,220 --> 00:29:32,740 tačiau šiame skyriuje tikslas Taisome aplink su GDB 351 00:29:32,740 --> 00:29:40,370 ir pamatyti, kaip mes galime jį naudoti išsiaiškinti, kas vyksta negerai su kiekviena iš šių keturių Buggy programų. 352 00:29:40,370 --> 00:29:43,380 Taigi, mes tiesiog vyksta aplink kambarį tikrai greitai, 353 00:29:43,380 --> 00:29:47,000 ir aš norėčiau paprašyti ką nors paleisti vieną Buggy programų, 354 00:29:47,000 --> 00:29:54,730 ir tada mes eiti kaip per GDB grupės, ir mes pamatyti, ką mes galime padaryti, kad išspręsti šias programas, 355 00:29:54,730 --> 00:29:58,460 arba bent jau nustatyti, kas vyksta neteisingai kiekvienoje iš jų. 356 00:29:58,460 --> 00:30:04,760 Pradėkime nuo čia Daniel. Bėgsi buggy1? Leiskite pamatyti, kas atsitiks. 357 00:30:04,760 --> 00:30:09,470 [Daniel] Ji sako, kad prašymas sutrikimą. >> Taip. Tiksliai. 358 00:30:09,470 --> 00:30:12,460 Taigi, jei aš paleisti buggy1, gaunu seg kaltės. 359 00:30:12,460 --> 00:30:16,210 Šiuo metu, aš gali eiti ir atverti buggy1.c 360 00:30:16,210 --> 00:30:19,450 išbandyti ir išsiaiškinti, kas vyksta neteisingai, 361 00:30:19,450 --> 00:30:22,000 bet vienas iš labiausiai bjaurius dalykus apie šį SEG klaidos 362 00:30:22,000 --> 00:30:27,610 yra tai, kad nėra pasakyti, ką linija programos dalykų iš tiesų nutiko ir sumušė. 363 00:30:27,610 --> 00:30:29,880 Jūs rūšies pažvelgti kodą 364 00:30:29,880 --> 00:30:33,990 ir išsiaiškinti, naudojant atspėti ir patikrinti, ar printf pamatyti, kas vyksta blogai. 365 00:30:33,990 --> 00:30:37,840 Vienas iš super dalykų apie GDB yra tai, kad tikrai, tikrai paprasta 366 00:30:37,840 --> 00:30:42,170 išsiaiškinti liniją, kurios jūsų programa sugenda. 367 00:30:42,170 --> 00:30:46,160 Tai visiškai verta jį naudoti, net jei tik už tai. 368 00:30:46,160 --> 00:30:56,190 Taigi, paleisti GDB, I tipo gdb, ir tada aš suteikti jai kelią į vykdomąjį failą, kad aš noriu paleisti. 369 00:30:56,190 --> 00:31:01,960 Čia aš rašyti gdb ./buggy1. 370 00:31:01,960 --> 00:31:06,600 Paspauskite Enter. Suteikia man visą šią informaciją apie autorines teises, 371 00:31:06,600 --> 00:31:13,000 ir žemyn, čia pamatysite šią eilutę, kad sako, "skaito simbolius iš / home / 372 00:31:13,000 --> 00:31:17,680 jharvard/section5/buggy1 ". 373 00:31:17,680 --> 00:31:22,060 Ir jei viskas vyks gerai, pamatysite, kad jis išspausdinti pranešimą, kad atrodo taip. 374 00:31:22,060 --> 00:31:25,500 Jis bus skaityti simbolius, jums pasakyti "Aš skaito simbolius iš savo vykdomąjį failą, 375 00:31:25,500 --> 00:31:29,900 ir tada ji turės šį pranešimą "DONE" čia. 376 00:31:29,900 --> 00:31:35,410 Jei matote, kai kurios kitos variacijos, arba matote, kad ji negalėjo rasti simbolius 377 00:31:35,410 --> 00:31:41,460 ar kažkas panašaus, ką tai reiškia, kad jūs tiesiog nerenkami savo vykdomąjį tinkamai. 378 00:31:41,460 --> 00:31:49,980 Kai mes kompiliuoti programas, skirtų naudoti su GDB, mes turime naudoti, kad specialios g vėliava, 379 00:31:49,980 --> 00:31:54,540 ir tai daroma pagal nutylėjimą, jei sudaryti savo programas, tiesiog įvesdami padaryti 380 00:31:54,540 --> 00:31:59,320 arba padaryti Buggy arba susigrąžinti, nors iš tų. 381 00:31:59,320 --> 00:32:07,800 Bet jei jūs rankiniu būdu sudarant su Apsukite metalinis garsas, tada jūs turėsite eiti ir kad-g vėliava. 382 00:32:07,800 --> 00:32:10,310 >> Šiuo metu, kad dabar mes turime gdb eilutę, 383 00:32:10,310 --> 00:32:12,310 tai gana paprasta paleisti programą. 384 00:32:12,310 --> 00:32:19,740 Mes galime įvesti paleisti, ar mes galime tiesiog įveskite r. 385 00:32:19,740 --> 00:32:22,820 Dauguma GDB komandos gali būti pateikiami sutrumpintai. 386 00:32:22,820 --> 00:32:25,940 Paprastai tik vieną ar dvi raidės, kuri yra gana gražus. 387 00:32:25,940 --> 00:32:30,980 Taigi, Saad, jei įvesite R ir paspauskite "Enter", kas atsitiks? 388 00:32:30,980 --> 00:32:39,390 [Saad] Aš turiu SIGSEGV, segmentavimo kaltės ir vėliau visa tai nesuprantama. 389 00:32:39,390 --> 00:32:43,650 >> Taip. 390 00:32:43,650 --> 00:32:47,990 Kaip mes matome ekrane dabar, ir kaip Saad sakė, 391 00:32:47,990 --> 00:32:53,430 , kai mes įvesti paleisti arba R ir paspauskite "Enter", mes vis dar gauti tą patį seg kaltės. 392 00:32:53,430 --> 00:32:55,830 Taigi, naudojant GDB nepadeda išspręsti mūsų problemą. 393 00:32:55,830 --> 00:32:59,120 Bet jis suteikia mums šiek tiek nesuprantama, ir paaiškėja, kad tai nesuprantama 394 00:32:59,120 --> 00:33:03,080 iš tikrųjų mums sako, kur jis vyksta. 395 00:33:03,080 --> 00:33:10,680 Išanalizuoti truputį, šis pirmasis bitas yra funkcija, kurioje viskas vyksta blogai. 396 00:33:10,680 --> 00:33:20,270 Ten tai __ strcmp_sse4_2, ir jis mums sako, kad tai vyksta šį failą 397 00:33:20,270 --> 00:33:29,450 vadinamas sysdeps/i386, visa tai, dar kartą, netvarka rūšies - bet linija 254. 398 00:33:29,450 --> 00:33:31,670 Tai tipo sunku apdoroti. Paprastai, kai pamatysite stuff like this, 399 00:33:31,670 --> 00:33:38,770 tai reiškia, kad jis manimi seg klaida, viena iš sisteminių bibliotekų. 400 00:33:38,770 --> 00:33:43,220 Taigi ką daryti su strcmp. Jus vaikinai matė strcmp anksčiau. 401 00:33:43,220 --> 00:33:52,730 Ne per kvailai, bet ar tai reiškia, kad strcmp neveikia arba, kad yra problema su strcmp? 402 00:33:52,730 --> 00:33:57,110 Ką manote, Aleksandras? 403 00:33:57,110 --> 00:34:04,890 [Aleksandras] Ar tai - 254 linija? Ir - ne dvejetainis, bet tai ne jų viršutinių ribų, 404 00:34:04,890 --> 00:34:10,590 ir tada kiekvienai funkcijai yra kita kalba. Yra tai, kad 254 tai veiklai, arba -? 405 00:34:10,590 --> 00:34:21,460 >> Tai linija 254. Atrodo, kad šioje S failo, todėl asamblėja kodas tikriausiai. 406 00:34:21,460 --> 00:34:25,949 >> , Bet aš manau, vis aktualesnis dalykas yra, nes mes Dotarłeś seg kaltės, 407 00:34:25,949 --> 00:34:29,960 ir atrodo, kad jis ateina iš strcmp funkcija, 408 00:34:29,960 --> 00:34:38,030 nereiškia, kad jis, tada, kad strcmp neveikia? 409 00:34:38,030 --> 00:34:42,290 Jis neturėtų, tikiuosi. Taigi, tik todėl, kad jūs turite segmentavimo kaltės 410 00:34:42,290 --> 00:34:49,480 sistemos funkcijų, paprastai tai reiškia, kad jūs tiesiog pavadino jį teisingai. 411 00:34:49,480 --> 00:34:52,440 Greičiausias dalykas, kurį reikia padaryti, siekiant išsiaiškinti, kas iš tikrųjų vyksta 412 00:34:52,440 --> 00:34:55,500 kai pamatysite kažką kvailai, kaip šis, Kai matote seg kaltės, 413 00:34:55,500 --> 00:34:59,800 ypač jei turite programą, kuri naudoja daugiau nei vien tik pagrindinis, 414 00:34:59,800 --> 00:35:03,570 naudoti pėdsako. 415 00:35:03,570 --> 00:35:13,080 Mažėjo tokie žodžiai, pėdsako raštu BT, o ne į visą pėdsako žodį. 416 00:35:13,080 --> 00:35:16,510 Bet Charlotte, kas atsitinka, kai jūs įvedate "BT" ir paspauskite Enter? 417 00:35:16,510 --> 00:35:23,200 [Charlotte] Tai man rodo dvi eilutes, eilutės 0 ir 1 eilutė. 418 00:35:23,200 --> 00:35:26,150 >> Taip. Taip, kad virvės 0 ir 1 eilutė. 419 00:35:26,150 --> 00:35:34,560 Tai yra tikrieji kamino rėmeliai, šiuo metu žaidimą, kai jūsų programa sudužo. 420 00:35:34,560 --> 00:35:42,230 Pradedant nuo viršutinės rėmo, rėmo 0, ir vyksta žemiausioje, kuris yra 1 kadrą. 421 00:35:42,230 --> 00:35:45,140 Mūsų strateginę partnerystę svarbiausias rėmas yra strcmp rėmas. 422 00:35:45,140 --> 00:35:50,080 Jūs galite galvoti apie tai, kaip panaši į šią problemą, mes buvome tik atlieka viktorinoje su rodyklės, 423 00:35:50,080 --> 00:35:54,890 kur mes turėjome apsikeitimo kamino pagrindinio kamino rėmo ant rėmo, 424 00:35:54,890 --> 00:35:59,700 ir mes turėjome kintamųjų, kurie apsikeitimo naudojami kintamųjų, kad pagrindinis naudojant ant. 425 00:35:59,700 --> 00:36:08,440 Čia mūsų avarijos įvyko strcmp funkcija, kuri vadinosi mūsų pagrindinė funkcija, 426 00:36:08,440 --> 00:36:14,370 ir Backtrace suteikia mums ne tik funkcijas, kurioje dalykai nepavyko, 427 00:36:14,370 --> 00:36:16,440 tačiau ji taip pat sako mums, kur viskas buvo vadinamas. 428 00:36:16,440 --> 00:36:18,830 Taigi, jei aš slenkant per šiek tiek daugiau į dešinę, 429 00:36:18,830 --> 00:36:26,110 matome, kad taip, mes buvome šio strcmp sse4.s failo 254 eilutėje. 430 00:36:26,110 --> 00:36:32,540 Bet buvo skambinta ne buggy1.c, 6 eilutė. 431 00:36:32,540 --> 00:36:35,960 Taigi, tai reiškia, kad mes galime padaryti - tai mes galime tiesiog eiti patikrinti ir pamatyti, kas vyksta 432 00:36:35,960 --> 00:36:39,930 ne buggy1.c, 6 eilutė. 433 00:36:39,930 --> 00:36:43,780 Vėlgi, yra keletas būdų, kaip tai padaryti. Vienas iš jų yra išeiti iš GDB 434 00:36:43,780 --> 00:36:49,460 arba, kad jūsų kodas atidaryti kitame lange ir kryžminė nuoroda. 435 00:36:49,460 --> 00:36:54,740 , Kad ir pati, yra labai patogu, nes dabar, jei esate ne darbo valandomis 436 00:36:54,740 --> 00:36:57,220 ir jūs turite seg kaltės ir jūsų TF manimi įdomu, kur viskas buvo nutraukti, 437 00:36:57,220 --> 00:36:59,710 galite tiesiog pasakyti: "O, 6 eilutė. aš nežinau, kas vyksta, 438 00:36:59,710 --> 00:37:03,670 bet kažkas apie LINE 6 sukelia mano programa pertraukos. " 439 00:37:03,670 --> 00:37:10,430 Kitas būdas tai padaryti, galite naudoti šią komandą, pavadintą GDB sąrašas. 440 00:37:10,430 --> 00:37:13,650 Taip pat galite jį mažinti su l. 441 00:37:13,650 --> 00:37:18,910 Taigi, jei mes paspauskite l, ką mes gauname? 442 00:37:18,910 --> 00:37:21,160 Mes gauname visa krūva Weird Stuff. 443 00:37:21,160 --> 00:37:26,030 Tai yra faktinis surinkimas kodas 444 00:37:26,030 --> 00:37:29,860 kad yra strcmp_sse4_2. 445 00:37:29,860 --> 00:37:32,440 Tai atrodo rūšies funky, 446 00:37:32,440 --> 00:37:36,520 ir priežastis, mes gauname tai yra todėl, kad dabar, 447 00:37:36,520 --> 00:37:40,160 GDB mus rėmo 0. 448 00:37:40,160 --> 00:37:43,070 >> Taigi, kada mes pažvelgti kintamųjų, bet kuriuo metu, mes pažvelgti į šaltinio kodą, 449 00:37:43,070 --> 00:37:50,530 mes ieškome šaltinio kodą, kad yra susijęs su kamino tarpą mes šiuo metu in 450 00:37:50,530 --> 00:37:53,200 Taigi, siekiant gauti ką nors prasmingo, turime 451 00:37:53,200 --> 00:37:57,070 pereiti prie kamino rėmo, kuris suteikia daugiau prasmės. 452 00:37:57,070 --> 00:38:00,180 Šiuo atveju, pagrindinis kamino rėmas būtų šiek tiek daugiau prasmės, 453 00:38:00,180 --> 00:38:02,680 nes tai buvo iš tikrųjų kodas, mes parašėme. 454 00:38:02,680 --> 00:38:05,330 Ne strcmp kodas. 455 00:38:05,330 --> 00:38:08,650 Taip, kaip galite judėti tarp rėmų, šiuo atveju, nes mes turime du, 456 00:38:08,650 --> 00:38:10,430 mes turime 0 ir 1, 457 00:38:10,430 --> 00:38:13,650 jums padaryti, kad aukštyn ir žemyn komandų. 458 00:38:13,650 --> 00:38:18,480 Jei aš perkelti vieną kadrą, 459 00:38:18,480 --> 00:38:21,770 dabar aš pagrindinio kamino tarpą. 460 00:38:21,770 --> 00:38:24,330 Galiu žemyn, grįžti į kur aš buvau, 461 00:38:24,330 --> 00:38:32,830 vėl eiti, eiti vėl ir vėl eiti. 462 00:38:32,830 --> 00:38:39,750 Jeigu jūs kada nors padaryti savo programą GDB, gausite avarijos, gausite pėdsako, 463 00:38:39,750 --> 00:38:42,380 ir pamatysite, kad jis yra kai kuriuos failus, kad jūs nežinote, kas vyksta. 464 00:38:42,380 --> 00:38:45,460 Jūs bandote sąrašą, kodas nėra pažįstama su jumis, 465 00:38:45,460 --> 00:38:48,150 į jūsų kadrų išvaizdą ir išsiaiškinti, kur esate. 466 00:38:48,150 --> 00:38:51,010 Jūs tikriausiai klaidingą kamino tarpą. 467 00:38:51,010 --> 00:38:58,760 Arba bent jau esate kamino rėmo, kad yra ne vienas, kad jūs tikrai gali derinti. 468 00:38:58,760 --> 00:39:03,110 Dabar, kad mes į atitinkamą kamino tarpą, mes pagrindinis 469 00:39:03,110 --> 00:39:08,100 dabar mes galime naudoti sąrašo komandą išsiaiškinti, kas, linija buvo. 470 00:39:08,100 --> 00:39:13,590 Ir jūs galite matyti jį, jis atspausdintas jį mums čia. 471 00:39:13,590 --> 00:39:19,470 Tačiau mes galime nukentėjo sąrašą visi tą patį, ir sąrašas suteikia mums šią gražią spaudinį 472 00:39:19,470 --> 00:39:23,920 faktinio šaltinio kodą, kas vyksta čia. 473 00:39:23,920 --> 00:39:26,420 >> Visų pirma, mes galime pažvelgti 6 eilutėje. 474 00:39:26,420 --> 00:39:29,330 Mes galime pamatyti, kas čia vyksta. 475 00:39:29,330 --> 00:39:31,250 Ir atrodo, kad mes darome eilutę palyginimas 476 00:39:31,250 --> 00:39:41,050 tarp eilutę "CS50 uolų" ir argv [1]. 477 00:39:41,050 --> 00:39:45,700 Kažkas apie tai buvo kritimo. 478 00:39:45,700 --> 00:39:54,120 Taigi, Missy, ar turite kokių nors mintis apie tai, kas gali būti čia vyksta? 479 00:39:54,120 --> 00:39:59,400 [Missy] Aš nežinau, kodėl ji genda. >> Jūs nežinote, kodėl ji genda? 480 00:39:59,400 --> 00:40:02,700 Jimmy, kokių nors minčių? 481 00:40:02,700 --> 00:40:06,240 [Jimmy] Nesu visiškai tikras, bet paskutinį kartą, mes naudojome eilutę palyginti 482 00:40:06,240 --> 00:40:10,260 arba strcmp, mes turėjome kaip trimis skirtingais atvejais pagal ją. 483 00:40:10,260 --> 00:40:12,800 Mes neturėjo ==, aš ne manau, toje pirmoje eilutėje. 484 00:40:12,800 --> 00:40:16,700 Todėl buvo suskirstyti į tris, ir vienas == 0, 485 00:40:16,700 --> 00:40:19,910 vienas buvo <0, manau, ir vienas buvo> 0. 486 00:40:19,910 --> 00:40:22,590 Taigi, gal kažkas panašaus? >> Taip. Taigi šis klausimas 487 00:40:22,590 --> 00:40:27,200 iš mes darome palyginimą teisingai? 488 00:40:27,200 --> 00:40:31,660 Stella? Bet mintis? 489 00:40:31,660 --> 00:40:38,110 [Stella] Nesu tikras. >> Nesate tikri. Daniel? Mintys? Gerai. 490 00:40:38,110 --> 00:40:44,770 Pasirodo, tai, kas vyksta čia, kai mes bėgo programą 491 00:40:44,770 --> 00:40:48,370 ir mes turime seg kaltės, kai jūs paleidote programą pirmą kartą, Daniel, 492 00:40:48,370 --> 00:40:50,800 Ar jūs suteikiate jai jokių komandinės eilutės argumentai? 493 00:40:50,800 --> 00:40:58,420 [Daniel] L. >> No Tokiu atveju, kas yra argv vertė [1]? 494 00:40:58,420 --> 00:41:00,920 >> Nėra vertė. >> Teisė. 495 00:41:00,920 --> 00:41:06,120 Na, nėra tinkamos eilutės reikšmė. 496 00:41:06,120 --> 00:41:10,780 Tačiau yra vertė. Kas yra vertė, kad gauna saugomi ten? 497 00:41:10,780 --> 00:41:15,130 >> Šiukšlių vertė? >> Tai tiek šiukšlių vertė arba, šiuo atveju, 498 00:41:15,130 --> 00:41:19,930 argv masyvo pabaiga visada nutrauktas null. 499 00:41:19,930 --> 00:41:26,050 Taigi, kas iš tikrųjų gavo saugomi yra tuščias. 500 00:41:26,050 --> 00:41:30,810 Kitas būdas išspręsti šią problemą, o ne galvoti per 501 00:41:30,810 --> 00:41:33,420 bandykite spausdinti jį. 502 00:41:33,420 --> 00:41:35,880 Tai vieta, kur aš sakiau, kad naudojant GDB yra puikus, 503 00:41:35,880 --> 00:41:40,640 , nes Jūs galite išspausdinti visus kintamuosius, visos nustatytos vertės, kad jūs norite 504 00:41:40,640 --> 00:41:43,230 naudojant šį Handy-frantas p komandą. 505 00:41:43,230 --> 00:41:48,520 Taigi, jei aš tipo P ir tada aš tipo kintamojo vertę arba kintamojo vardas, 506 00:41:48,520 --> 00:41:55,320 pasakyti, argc, matau, kad argc yra 1. 507 00:41:55,320 --> 00:42:01,830 Jei aš noriu atsispausdinti argv [0], galiu padaryti kaip, kad. 508 00:42:01,830 --> 00:42:04,840 Ir, kaip matėme, argv [0] visada jūsų programos pavadinimas, 509 00:42:04,840 --> 00:42:06,910 visada vykdomąjį pavadinimas. 510 00:42:06,910 --> 00:42:09,740 Čia jūs matote jis gavo visą kelią pavadinimą. 511 00:42:09,740 --> 00:42:15,920 Galiu atsispausdinti argv [1], ir pamatyti, kas atsitiks. 512 00:42:15,920 --> 00:42:20,890 >> Čia mes turime tokį tikrą mistinį vertės. 513 00:42:20,890 --> 00:42:23,890 Mes turime 0x0. 514 00:42:23,890 --> 00:42:27,850 Prisimenu termino pradžioje, kai mes kalbėjome apie šešioliktainius skaitmenis? 515 00:42:27,850 --> 00:42:34,680 Tuo pset 0 pabaigos arba kad mažai abejonių apie tai, kaip sudaro 50 hex? 516 00:42:34,680 --> 00:42:39,410 Būdas rašome hex CS skaičius, tiesiog painioja save 517 00:42:39,410 --> 00:42:46,080 dešimtainiai skaičiai, mes visada priešdėlis su 0x. 518 00:42:46,080 --> 00:42:51,420 Taigi tai 0x priešdėlis visada tiesiog reiškia interpretuoti šį numerį kaip šešioliktainis skaičius, 519 00:42:51,420 --> 00:42:57,400 ne kaip eilutės, o ne kaip dešimtainis skaičius, o ne dvejetainis skaičius. 520 00:42:57,400 --> 00:43:02,820 Kadangi skaičius 5-0 yra svarbių šešioliktainis skaičius. 521 00:43:02,820 --> 00:43:06,240 Ir tai dešimtainės trupmenos, 50. 522 00:43:06,240 --> 00:43:10,050 Taigi tai yra tiesiog kaip mes dviprasmiškumą. 523 00:43:10,050 --> 00:43:14,860 Taigi 0x0 reiškia šešioliktainis 0, kuris taip pat yra dešimtainis 0, dvejetainį 0. 524 00:43:14,860 --> 00:43:17,030 Tai tiesiog vertė 0. 525 00:43:17,030 --> 00:43:22,630 Pasirodo, kad tai, ką null, iš tikrųjų, yra atminties. 526 00:43:22,630 --> 00:43:25,940 Null yra tik 0. 527 00:43:25,940 --> 00:43:37,010 Čia saugomas elementas argv [1] yra niekinis. 528 00:43:37,010 --> 00:43:45,220 Taigi mes bandome palyginti mūsų "CS50 uolų" seka neapibrėžta eilutę. 529 00:43:45,220 --> 00:43:48,130 Taigi dereferencing, bando prieiti prie dalykų null, null 530 00:43:48,130 --> 00:43:55,050 paprastai sukelti kažkokią segmentavimo kaltės ar kitų blogų dalykų atsitikti. 531 00:43:55,050 --> 00:43:59,350 Ir paaiškėja, kad strcmp nėra patikrinti, 532 00:43:59,350 --> 00:44:04,340 nepriklausomai nuo to, ar jūs jau praėjo null vertės, kad. 533 00:44:04,340 --> 00:44:06,370 Atvirkščiai, jis tiesiog eina į priekį, bando padaryti tai, 534 00:44:06,370 --> 00:44:14,640 ir jei jis seg gedimus, seg gedimus, ir tai jūsų problema. Jūs turite eiti ją išspręsti. 535 00:44:14,640 --> 00:44:19,730 Tikrai greitai, kaip galėtume išspręsti šią problemą? Charlotte? 536 00:44:19,730 --> 00:44:23,540 [Charlotte] Galite patikrinti, naudoti, jei. 537 00:44:23,540 --> 00:44:32,240 Taigi, jei argv [1] yra niekinis, == 0, tada grįžkite 1, ar kažkas [nesuprantamas]. 538 00:44:32,240 --> 00:44:34,590 >> Taip. Taigi, kad vienas puikus būdas tai padaryti, kaip mes galime patikrinti, 539 00:44:34,590 --> 00:44:39,230 vertė, mes apie tai pereina į strcmp, argv [1], tai nulis? 540 00:44:39,230 --> 00:44:45,830 Jei tai null, tada mes galime pasakyti, gerai, nutraukti. 541 00:44:45,830 --> 00:44:49,450 >> Labiau paplitęs būdas tai padaryti yra naudoti argc vertę. 542 00:44:49,450 --> 00:44:52,040 Jūs galite pamatyti čia prie Maino pradžioje, 543 00:44:52,040 --> 00:44:58,040 mes praleisti, nes pirmasis bandymas, kad mes paprastai daryti, kai mes naudojame komandinės eilutės argumentai, 544 00:44:58,040 --> 00:45:05,240 kuris yra patikrinti, ar ne mūsų argc vertė yra tai, ką mes tikimės. 545 00:45:05,240 --> 00:45:10,290 Šiuo atveju, mes tikimės bent du argumentus, 546 00:45:10,290 --> 00:45:13,660 Programos pavadinimas plius vienas kitas. 547 00:45:13,660 --> 00:45:17,140 Nes mes ruošiamės naudoti antrą argumentą čia. 548 00:45:17,140 --> 00:45:21,350 Bandymo rūšiuoti Taigi tam tikra iš anksto, prieš mūsų strcmp skambučio 549 00:45:21,350 --> 00:45:37,390 kad testai, ar argv yra ne mažiau kaip 2, taip pat padaryti tos pačios rūšies dalykas. 550 00:45:37,390 --> 00:45:40,620 Mes galime pamatyti, jei tai veikia paleisti programą iš naujo. 551 00:45:40,620 --> 00:45:45,610 Jūs visada galite iš naujo paleisti programą per GDB, kuris yra tikrai gražus. 552 00:45:45,610 --> 00:45:49,310 Galite paleisti, kai pereisite į argumentus, kad jūsų programa, 553 00:45:49,310 --> 00:45:53,060 pravažiavimo pro jas, kai skambinate paleisti, o ne kiekvieną kartą paleidus GDB. 554 00:45:53,060 --> 00:45:57,120 Tokiu būdu jūs galite toliau remtis savo programą su kitokiais argumentais kiekvieną kartą. 555 00:45:57,120 --> 00:46:08,080 Taip paleisti, arba dar kartą, aš galiu Type R, ir pažiūrėkime, kas atsitiks, jei mes tipo "labas". 556 00:46:08,080 --> 00:46:11,140 Ji visada bus paprašyti jus, jei norite vėl pradėti nuo pradžių. 557 00:46:11,140 --> 00:46:17,490 Paprastai, jūs norite vėl pradėti nuo pradžių. 558 00:46:17,490 --> 00:46:25,010 Ir šiuo metu, jis bus paleistas iš naujo jį dar kartą, jis išspausdina 559 00:46:25,010 --> 00:46:28,920 programa, kad mes, buggy1 su argumentu HELLO, 560 00:46:28,920 --> 00:46:32,720 ir jis spausdina šią standartinę iš; jis sako: "Jūs gaunate D, liūdna veido. 561 00:46:32,720 --> 00:46:37,610 Bet mes ne seg kaltės. Jis sakė, kad procesas paprastai išėjo. 562 00:46:37,610 --> 00:46:39,900 Taip, kad atrodo gana gerai. 563 00:46:39,900 --> 00:46:43,050 Ne daugiau seg kaltės, mes padarėme praeityje 564 00:46:43,050 --> 00:46:48,190 , todėl atrodo, kad iš tikrųjų buvo seg kaltės klaida, kad mes buvo gauti. 565 00:46:48,190 --> 00:46:51,540 Deja, jis mums sako, kad mes vis D. 566 00:46:51,540 --> 00:46:54,090 >> Mes galime grįžti ir pažvelgti kodą ir pamatyti, kas ten vyksta 567 00:46:54,090 --> 00:46:57,980 išsiaiškinti, kas buvo - kodėl ji mums sako, kad mes turime D. 568 00:46:57,980 --> 00:47:03,690 Pažiūrėkime, tai čia buvo printf sakydamas, kad jūs turite D. 569 00:47:03,690 --> 00:47:08,540 Jei mes įveskite sąrašą, kaip jūs nuolat rašomą sąrašą, ji išlaiko iteravimu per jūsų programa, 570 00:47:08,540 --> 00:47:10,940 todėl jums parodysiu savo programos pirmųjų eilučių. 571 00:47:10,940 --> 00:47:15,450 Tada jis jums parodysiu, kitą kelias eilutes, o kitą riekė ir kitą riekė. 572 00:47:15,450 --> 00:47:18,240 Ir jis bus nuolat bando eiti. 573 00:47:18,240 --> 00:47:21,180 Ir dabar mes patekti į "linija, numeris 16 yra už diapazono ribų." 574 00:47:21,180 --> 00:47:23,940 , Nes jis turi tik 15 krypčių. 575 00:47:23,940 --> 00:47:30,310 Jei jums šiuo klausimu ir įdomu, "Ką daryti?" galite naudoti komandą help. 576 00:47:30,310 --> 00:47:34,340 Naudokite padėti ir tada suteikti jai komandos pavadinimą. 577 00:47:34,340 --> 00:47:36,460 Ir jūs matote, GDB suteikia mums visa tai stuff rūšiuoti. 578 00:47:36,460 --> 00:47:43,870 Ji sako: "jokio argumento, išvardyti 10 daugiau eilučių, po arba apie ankstesnį sąrašą. 579 00:47:43,870 --> 00:47:47,920 Sąrašas - išvardyti dešimt eilučių anksčiau - " 580 00:47:47,920 --> 00:47:52,960 Taigi pabandykime sąrašas minusas. 581 00:47:52,960 --> 00:47:57,000 Ir kad išvardyti 10 eilučių, galite pažaisti su sąrašo šiek tiek. 582 00:47:57,000 --> 00:48:02,330 Jūs galite padaryti, sąrašą, sąrašas, galite net sąrašą numerį, kaip ir sąrašo 8, 583 00:48:02,330 --> 00:48:07,500 ir jis bus išvardinti 10 eilučių aplink liniją 8. 584 00:48:07,500 --> 00:48:10,290 Ir jūs galite pamatyti, kas vyksta čia jūs turite paprasta, jei kita. 585 00:48:10,290 --> 00:48:13,980 Jei įvesite CS50 uolų, jis spausdina "Gauni A." 586 00:48:13,980 --> 00:48:16,530 Priešingu atveju jis spausdina "Jūs gaunate D. 587 00:48:16,530 --> 00:48:23,770 Nusivylimas miestas. Gerai. Taip? 588 00:48:23,770 --> 00:48:26,730 >> [Daniel] Taigi, kai aš bandė padaryti CS50 uolų be kabučių, 589 00:48:26,730 --> 00:48:29,290 jis sako: "Jūs gaunate D." 590 00:48:29,290 --> 00:48:32,560 Man reikia kabučių gauti jį dirbti, kodėl taip yra? 591 00:48:32,560 --> 00:48:38,490 >> Taip. Pasirodo, kad kai - tai yra dar vienas įdomus mažai Smakołyk - 592 00:48:38,490 --> 00:48:47,900 , kai paleidžiate programą, jei mes ją paleisti ir mes įvesti CS50 uolų, 593 00:48:47,900 --> 00:48:50,800 kaip ir Danielis buvo sakydamas, jis padarė, ir paspaudžiant "Enter", 594 00:48:50,800 --> 00:48:52,870 jis vis dar sako, kad mes gauname D. 595 00:48:52,870 --> 00:48:55,580 Ir kyla klausimas, kodėl taip yra? 596 00:48:55,580 --> 00:49:02,120 Ir paaiškėja, kad tiek mūsų terminalas ir GDB apdoroti juos kaip du atskirus argumentais. 597 00:49:02,120 --> 00:49:04,800 Nes, kai yra erdvė, kad numanomas kaip 598 00:49:04,800 --> 00:49:08,730 pirmasis argumentas pasibaigęs; Kitas argumentas yra apie pradėti. 599 00:49:08,730 --> 00:49:13,260 Būdas sujungti tuos, į dvi arba atsiprašome, į vieną argumentą, 600 00:49:13,260 --> 00:49:18,510 yra naudoti kabučių. 601 00:49:18,510 --> 00:49:29,560 Taigi dabar, jei mes įdėti ją į kabutes ir paleisti jį dar kartą, mes gauname A. 602 00:49:29,560 --> 00:49:38,780 Taigi tiesiog Priminti, be kabučių, CS50 ir uolienos yra apdorojami kaip du atskiri argumentai. 603 00:49:38,780 --> 00:49:45,320 Su kabutėmis, tai išanalizuoti, nes vieną argumentą apskritai. 604 00:49:45,320 --> 00:49:53,070 >> Mes galime pamatyti tai atskaitos tašką. 605 00:49:53,070 --> 00:49:54,920 Iki šiol mes jau veikia mūsų programą, ir jis jau veikia 606 00:49:54,920 --> 00:49:58,230 iki arba jis seg gedimus arba Hitai klaidą 607 00:49:58,230 --> 00:50:05,930 arba tol, kol jis išėjo ir viskas buvo visiškai gerai. 608 00:50:05,930 --> 00:50:08,360 Tai nebūtinai yra labiausiai naudingas dalykas, nes kartais 609 00:50:08,360 --> 00:50:11,840 turite klaidą savo programą, tačiau tai nėra sukelia segmentavimo kaltės. 610 00:50:11,840 --> 00:50:16,950 Ji manimi ne todėl, kad jūsų programa sustabdyti ar ko nors panašaus. 611 00:50:16,950 --> 00:50:20,730 Būdas gauti GDB pristabdyti jūsų programa tam tikru 612 00:50:20,730 --> 00:50:23,260 yra nustatyti atskaitos tašką. 613 00:50:23,260 --> 00:50:26,520 Jūs galite padaryti tai nustatant atskaitos tašką funkcijos pavadinimo 614 00:50:26,520 --> 00:50:30,770 arba galite nustatyti atskaitos tašką tam tikrą eilutę kodo. 615 00:50:30,770 --> 00:50:34,450 Man patinka nustatyti ribines vertes, dėl funkcijų pavadinimus, nes lengva prisiminti, 616 00:50:34,450 --> 00:50:37,700 ir jei jūs iš tikrųjų eiti ir pakeisti savo kodą į viršų šiek tiek, 617 00:50:37,700 --> 00:50:42,020 tada jūsų atskaitos tašką iš tikrųjų likti toje pačioje vietoje per savo kodą. 618 00:50:42,020 --> 00:50:44,760 Kadangi, jei jūs naudojate eilučių numerius, ir eilučių numeriai pakeisti 619 00:50:44,760 --> 00:50:51,740 nes norite pridėti ar pašalinti tam tikrą kodą, tada jūsų ribinės reikšmės yra visi visiškai įsukus. 620 00:50:51,740 --> 00:50:58,590 Vienas iš labiausiai paplitusių dalykų aš nustatyti atskaitos tašką, pagrindinės funkcijos. 621 00:50:58,590 --> 00:51:05,300 Dažnai aš paleisti gdb, aš b tipo Main, paspauskite Enter, ir kad bus nustatyti atskaitos tašką 622 00:51:05,300 --> 00:51:10,630 pagrindinė funkcija, kuri tiesiog sako, pristabdyti programą kuo greičiau pradėti rodyti " 623 00:51:10,630 --> 00:51:17,960 ir tokiu būdu, kai aš paleisti savo programą su, tarkim, CS50 uolų du argumentai 624 00:51:17,960 --> 00:51:24,830 ir paspauskite "Enter", jis gauna pagrindinės funkcijos ir sustoja tiesiai pačioje pirmoje eilutėje, 625 00:51:24,830 --> 00:51:30,620 į dešinę, kol ji vertina strcmp funkciją. 626 00:51:30,620 --> 00:51:34,940 >> Kadangi aš sustabdytas, dabar galiu pradėti Mucking aplink ir pamatyti, kas vyksta 627 00:51:34,940 --> 00:51:40,250 su visų skirtingų kintamųjų, kurie yra perduodami į savo programą. 628 00:51:40,250 --> 00:51:43,670 Čia aš galiu atsispausdinti argc ir pamatyti, kas vyksta. 629 00:51:43,670 --> 00:51:50,030 Matyti, kad argc yra 3, nes ji turi 3 skirtingas vertybes. 630 00:51:50,030 --> 00:51:54,060 Jis gavo programos pavadinimą, jis gavo pirmąjį argumentą, o antrasis argumentas. 631 00:51:54,060 --> 00:52:09,330 Mes galime atspausdinti tiems žiūri argv [0], argv [1], ir argv [2]. 632 00:52:09,330 --> 00:52:12,030 Taigi, dabar jūs galite pamatyti, kodėl šis strcmp skambutis vyksta, kad žlugtų, 633 00:52:12,030 --> 00:52:21,650 , nes matote, kad jis suskaidytas CS50 ir uolos į du atskirus argumentais. 634 00:52:21,650 --> 00:52:27,250 Šiuo metu, kai jūs nukentėjo atskaitos tašką, galite toliau stiprinti per jūsų programa 635 00:52:27,250 --> 00:52:32,920 eilutė po eilutės, o ne vėl pradeda savo programą. 636 00:52:32,920 --> 00:52:35,520 Taigi, jei nenorite, kad paleisti programą iš naujo ir tik toliau nuo čia, 637 00:52:35,520 --> 00:52:41,970 galite naudoti komandą Tęsti ir toliau bus paleisti programą iki galo. 638 00:52:41,970 --> 00:52:45,010 Tik kaip ji tai padarė čia. 639 00:52:45,010 --> 00:52:54,880 Tačiau, jei aš iš naujo paleiskite programą, CS50 uolų, ji hitai savo atskaitos tašką, 640 00:52:54,880 --> 00:52:59,670 ir šį kartą, jei aš nenoriu tiesiog eiti visą kelią per likusį programos, 641 00:52:59,670 --> 00:53:08,040 Aš galiu naudoti kitą komandą, kurio aš irgi Sutrumpinti su n. 642 00:53:08,040 --> 00:53:12,960 Ir tai bus žingsnis programos eilutę po eilutės. 643 00:53:12,960 --> 00:53:17,530 Todėl jūs galite žiūrėti kaip ką atlikti, kaip kintamųjų pokyčius, kaip viskas atnaujinami. 644 00:53:17,530 --> 00:53:21,550 Kuri yra gana gražus. 645 00:53:21,550 --> 00:53:26,570 Kitas kietas dalykas yra, o ne kartoti tą pačią komandą virš ir vėl ir vėl, 646 00:53:26,570 --> 00:53:30,670 jei jūs tiesiog paspauskite "Enter" - taip čia matote, aš ne įvedėte nieko - 647 00:53:30,670 --> 00:53:33,780 jei aš tiesiog paspauskite "Enter", jis bus pakartoti ankstesnę komandą, 648 00:53:33,780 --> 00:53:36,900 ar ankstesnę GDB komanda, kad aš tiesiog įdėti in 649 00:53:36,900 --> 00:53:56,000 Galiu laikyti klavišą Enter, ir jis bus nuolat žengia per savo kodo eilutė po eilutės. 650 00:53:56,000 --> 00:53:59,310 Norėčiau paskatinti jus vaikinai eiti patikrinti kitų Buggy programas, taip pat. 651 00:53:59,310 --> 00:54:01,330 Mes neturime laiko gauti per visus juos šiandien skyriuje. 652 00:54:01,330 --> 00:54:05,890 Išeitinis kodas, yra ten, todėl jūs galite rūšies pamatyti, kas vyksta 653 00:54:05,890 --> 00:54:07,730 užkulisiuose, jei jums tikrai įstrigo, 654 00:54:07,730 --> 00:54:11,940 bet bent jau, tiesiog praktika iki paleidimo GDB 655 00:54:11,940 --> 00:54:13,940 paleisti programą, kol ji sugenda jums, 656 00:54:13,940 --> 00:54:18,260 gauti pėdsako, suprasti, ką veikti avarijos buvo, 657 00:54:18,260 --> 00:54:24,450 ką linija, atspausdinti keletą kintamųjų reikšmės, 658 00:54:24,450 --> 00:54:30,140 tik tokiu būdu jūs gaunate už jį jaustis, nes tai tikrai padės jums ateityje. 659 00:54:30,140 --> 00:54:36,340 Šiuo metu, mes ketiname mesti iš GDB, kurį naudojant mesti ar tiesiog q. 660 00:54:36,340 --> 00:54:40,460 Jeigu jūsų programa yra viduryje vis dar veikia, ir ji išėjo, 661 00:54:40,460 --> 00:54:43,510 ji visada bus jūsų paklausti, "Ar tikrai jūs tikrai norite išeiti?" 662 00:54:43,510 --> 00:54:48,770 Jūs galite tiesiog paspausti "taip". 663 00:54:48,770 --> 00:54:55,250 >> Dabar mes ketiname pažvelgti mes turime kitą problemą, kuri yra katė programa. 664 00:54:55,250 --> 00:54:59,880 Jei žiūrėti ir detalaus vamzdžių trumpas, pamatysite, kad Tommy naudoja šią programą 665 00:54:59,880 --> 00:55:07,540 kad iš esmės spausdina visą failą, išvedimą į ekraną. 666 00:55:07,540 --> 00:55:12,660 Taigi, jei aš paleisti katė, tai iš tiesų yra built-in programa į prietaisą, 667 00:55:12,660 --> 00:55:16,860 ir, jei turite "Mac", galite tai padaryti savo Mac, jei jūs atverti terminalą. 668 00:55:16,860 --> 00:55:25,630 O mes - katė, tarkim, cp.c ir paspauskite Enter. 669 00:55:25,630 --> 00:55:29,640 Ką tai padarė, jei mes slinkite aukštyn šiek tiek ir pamatyti, kur mes bėgo linija, 670 00:55:29,640 --> 00:55:40,440 ar kur vyko kačių komandą, jis tiesiog tik išspausdintas turinį cp.c mūsų ekrane. 671 00:55:40,440 --> 00:55:44,140 Mes galime paleisti jį dar kartą ir galite įdėti kelis failus kartu. 672 00:55:44,140 --> 00:55:49,880 Todėl jūs galite daryti Kačių cp.c, ir tada mes galime taip pat Jungiant cat.c failą, 673 00:55:49,880 --> 00:55:53,250 kuris yra programa, mes apie tai rašyti, 674 00:55:53,250 --> 00:55:58,140 ir jis bus spausdinti abu failus atgal atgal į mūsų ekrane. 675 00:55:58,140 --> 00:56:05,490 Taigi, jei mes slinkite aukštyn šiek tiek, mes matome, kad kai nubėgome Ši katė cp.c, cat.c 676 00:56:05,490 --> 00:56:17,110 pradžių ji atspausdinti CP failą, ir tada po juo atspausdintas cat.c failą, nustatančio teisę čia. 677 00:56:17,110 --> 00:56:19,650 Mes ketiname naudoti, tai tiesiog gauti savo kojų šlapias. 678 00:56:19,650 --> 00:56:25,930 Pažaisti su paprasta spausdinti į terminalą, pamatyti, kaip tai veikia. 679 00:56:25,930 --> 00:56:39,170 Jei jus vaikinai atverti su gedit cat.c, paspauskite "Enter", 680 00:56:39,170 --> 00:56:43,760 jūs galite pamatyti programą, kad mes apie tai rašyti. 681 00:56:43,760 --> 00:56:48,980 Mes įtraukėme šį gražus katilo plokštelę, todėl nereikia gaišti laiko rašyti visą, kad iš. 682 00:56:48,980 --> 00:56:52,310 Mes taip pat patikrinti argumentų priėmė. 683 00:56:52,310 --> 00:56:56,910 Mes spausdinti gražią naudojimo pranešimą. 684 00:56:56,910 --> 00:57:00,950 >> Tai dalykas rūšiuoti, kad vėl, kaip mes jau kalbame apie, 685 00:57:00,950 --> 00:57:04,490 tai beveik kaip raumenų atminties. 686 00:57:04,490 --> 00:57:07,190 Tiesiog neužmirškite, kad nuolat daro tos pačios rūšies daiktų 687 00:57:07,190 --> 00:57:11,310 ir visada spausdinti kažkokią naudingos pranešimą 688 00:57:11,310 --> 00:57:17,670 taip, kad žmonės žino, kaip paleisti savo programą. 689 00:57:17,670 --> 00:57:21,630 Su katė, tai gana paprasta, mes tiesiog ketinate eiti per visus skirtingus argumentus 690 00:57:21,630 --> 00:57:24,300 , kad buvo priimtas į mūsų programą, ir mes ketiname spausdinti 691 00:57:24,300 --> 00:57:29,950 jų turinys dėmesį į ekrane vienu metu. 692 00:57:29,950 --> 00:57:35,670 Norėdami spausdinti failus į ekraną, mes ketiname padaryti kažką labai panašaus 693 00:57:35,670 --> 00:57:38,120 ką mes padarėme Viktorinos pabaigoje. 694 00:57:38,120 --> 00:57:45,350 Tuo Viktorinos pabaigoje, kad samdyti programą, mes turėjome atverti failą, 695 00:57:45,350 --> 00:57:48,490 ir tada mes turėjo spausdinti. 696 00:57:48,490 --> 00:57:54,660 Šiuo atveju, mes ketiname atverti failą, ir mes ketiname jos perskaityti, o ne. 697 00:57:54,660 --> 00:58:00,630 Tada mes ketiname spausdinti, o ne į failą, mes ketiname spausdinti į ekraną. 698 00:58:00,630 --> 00:58:05,830 Taigi spausdinti į ekraną, jūs visa tai buvo daroma anksčiau su printf. 699 00:58:05,830 --> 00:58:08,290 Taigi, tai nėra pernelyg beprotiška. 700 00:58:08,290 --> 00:58:12,190 Bet skaitant failą rūšies keista. 701 00:58:12,190 --> 00:58:17,300 Mes eiti per, kad šiek tiek vienu metu. 702 00:58:17,300 --> 00:58:20,560 Jei jus vaikinai grįžti į tą paskutinę problemą savo viktoriną, problemų 33, 703 00:58:20,560 --> 00:58:27,280 pirmoji eilutė, kad mes ketiname padaryti čia, atidarant failą, yra labai panašus į ką mes padarėme, yra. 704 00:58:27,280 --> 00:58:36,370 Taigi Stella, ką, kad eilutės atrodys, kai mes atidaryti failą? 705 00:58:36,370 --> 00:58:47,510 [Stella] Sostinė FILE *, failo - >> Gerai. >> - Lygus fopen. >> Yup. 706 00:58:47,510 --> 00:58:55,980 , Kuris šiuo atveju yra? Į komentarą. 707 00:58:55,980 --> 00:59:06,930 >> Tai į komentarą? argv [i] ir r? 708 00:59:06,930 --> 00:59:11,300 >> Būtent. Į dešinę. Taigi Stela yra visiškai teisus. 709 00:59:11,300 --> 00:59:13,720 Tai yra tai, ką linija atrodo. 710 00:59:13,720 --> 00:59:19,670 Mes ketiname gauti failą srauto kintamasis, laikyti jį į failą *, todėl visos kepurės, 711 00:59:19,670 --> 00:59:25,720 FILE *, ir šio kintamojo vardas bus failas. 712 00:59:25,720 --> 00:59:32,250 Galėtume vadinti tai, ką mes norėtume. Būtų galima vadinti first_file arba file_i, ką mes norėtume. 713 00:59:32,250 --> 00:59:37,590 Ir tada failo vardas buvo priimtas į komandų eilutę su šia programa. 714 00:59:37,590 --> 00:59:44,450 Taigi jis saugomas argv [i,], tada mes ketiname atidaryti šį failą skaitymui. 715 00:59:44,450 --> 00:59:48,100 Dabar, kad mes atidarytas failas, kas yra dalykas, kad mes visada turime atsiminti, kad 716 00:59:48,100 --> 00:59:52,230 kai mes atidaryti failą? Uždarykite jį. 717 00:59:52,230 --> 00:59:57,220 Taigi, Missy, kaip mes uždaryti bylą? 718 00:59:57,220 --> 01:00:01,020 [Missy] fclose (failas) >> fclose (failas). Tiksliai. 719 01:00:01,020 --> 01:00:05,340 Didysis. Gerai. Jei pažvelgsime į tai komentarą čia, 720 01:00:05,340 --> 01:00:11,940 jis sako: "Atidaryti argv [i] ir spausdinti jo turinį stdout." 721 01:00:11,940 --> 01:00:15,460 >> Standartinis išvada yra keista pavadinimas. Stdout yra tik mūsų būdas pasakyti 722 01:00:15,460 --> 01:00:22,880 mes norime spausdinti jį į terminalą, mes norime spausdinti jį į standartinį išvedimo srautą. 723 01:00:22,880 --> 01:00:26,450 Mes iš tikrųjų galite atsikratyti šio komentaro čia. 724 01:00:26,450 --> 01:00:36,480 Aš einu, nukopijuokite jį ir įklijuokite jį, nes tai, ką mes padarėme. 725 01:00:36,480 --> 01:00:41,290 Šiuo metu, dabar mes turime skaityti failo truputį. 726 01:00:41,290 --> 01:00:46,300 Mes aptarėme keletą būdų, kaip skaitymo failus. 727 01:00:46,300 --> 01:00:51,830 Kurios iš jų yra jūsų mėgstamiausių iki šiol? 728 01:00:51,830 --> 01:00:57,960 Kokiais būdais ar jūs esate matę, ar jūs žinote, skaityti failus? 729 01:00:57,960 --> 01:01:04,870 [Daniel] fread? >> Fread? Taigi fread yra vienas. Jimmy, ar žinote kitus? 730 01:01:04,870 --> 01:01:12,150 [Jimmy] L. >> Gerai. Nope. Charlotte? Aleksandras? Kiti? Gerai. 731 01:01:12,150 --> 01:01:20,740 Taigi kitų fgetc yra vienas, kad mes naudojame daug. 732 01:01:20,740 --> 01:01:26,410 Yra taip pat fscanf, jus vaikinai modelis čia? 733 01:01:26,410 --> 01:01:29,170 Visi jie prasideda su F. Nieko bendro su byla. 734 01:01:29,170 --> 01:01:35,260 Yra fread fgetc, fscanf. Visa tai yra skaitymui funkcijų. 735 01:01:35,260 --> 01:01:49,120 Raštu turime fwrite, mes turime, fputc vietoj fgetc. 736 01:01:49,120 --> 01:01:58,250 Mes taip pat turime fprintf patinka matėme viktorinoje. 737 01:01:58,250 --> 01:02:01,680 Kadangi tai yra problema, kuri apima skaitant iš failo, 738 01:02:01,680 --> 01:02:04,940 mes ketiname naudoti vieną iš šių trijų funkcijų. 739 01:02:04,940 --> 01:02:10,890 Mes neketiname naudoti šias funkcijas žemyn čia. 740 01:02:10,890 --> 01:02:14,880 Šios funkcijos yra visi į standartinį I / O lib. 741 01:02:14,880 --> 01:02:17,510 Taigi, jei jums pažvelgti į šios programos viršuje, 742 01:02:17,510 --> 01:02:24,110 galite matyti, kad mes jau įtraukti antraštės failo standartinį I / O bibliotekos. 743 01:02:24,110 --> 01:02:27,120 , Jei norime išsiaiškinti, kuris iš jų mes norite naudoti, 744 01:02:27,120 --> 01:02:29,690 mes visada galime atverti Man puslapiai. 745 01:02:29,690 --> 01:02:34,350 Taigi, mes galime įveskite vyro stdio 746 01:02:34,350 --> 01:02:43,180 ir skaityti visus apie stdio įvesties ir išvesties funkcijas pagal C. 747 01:02:43,180 --> 01:02:49,870 Ir jau galime pamatyti Oh, atrodo. Jis paminėti fgetc, tai paminėti fputc. 748 01:02:49,870 --> 01:02:57,220 Todėl jūs galite išskleiskite šiek tiek ir pažvelgti, tarkim, fgetc 749 01:02:57,220 --> 01:03:00,060 ir pažvelgti į savo žinyno puslapyje. 750 01:03:00,060 --> 01:03:03,430 Jūs galite pamatyti, kad ji eina kartu su visa krūva kitų funkcijų: 751 01:03:03,430 --> 01:03:12,640 fgetc, fgets, getc, getchar, gauna, ungetc ir jo indėlis simbolių ir styginiams. 752 01:03:12,640 --> 01:03:19,180 Taigi tai yra, kaip mes skaitome simbolių ir styginiams failus iš standartinio įvesties, 753 01:03:19,180 --> 01:03:21,990 kuris iš esmės yra iš vartotojo. 754 01:03:21,990 --> 01:03:24,780 Ir tai, kaip mes tai darome faktiškai C 755 01:03:24,780 --> 01:03:30,850 Taigi, tai nėra naudojant GetString ir GetChar funkcijas 756 01:03:30,850 --> 01:03:36,840 , kad mes panaudojome iš CS50 bibliotekoje. 757 01:03:36,840 --> 01:03:39,710 Mes ketiname padaryti porą būdais šią problemą 758 01:03:39,710 --> 01:03:43,430 taip, kad jūs galite pamatyti du būdai, kaip tai daryti. 759 01:03:43,430 --> 01:03:48,490 Tiek fread funkcija, kad Danielis paminėjo ir fgetc yra geras būdas tai padaryti. 760 01:03:48,490 --> 01:03:53,790 Manau, kad fgetc yra šiek tiek lengviau, nes ji tik turi, kaip matote, 761 01:03:53,790 --> 01:03:59,660 vienas argumentas, FILE *, kad mes bandome skaityti simbolį, 762 01:03:59,660 --> 01:04:02,740 ir grąžinimas vertė yra int. 763 01:04:02,740 --> 01:04:05,610 Ir tai yra šiek tiek klaidina, tiesa? 764 01:04:05,610 --> 01:04:11,450 >> Nes mes vis simbolį, tai kodėl gi ne šis sugrįžimas char? 765 01:04:11,450 --> 01:04:18,700 Jus vaikinai turi kokių nors idėjų apie tai, kodėl tai gali grąžinti char? 766 01:04:18,700 --> 01:04:25,510 [Missy atsakymai, nesuprantamas] >> Yeah. Taigi Onos visiškai teisus. 767 01:04:25,510 --> 01:04:31,570 Jei tai ASCII, tada tai sveikasis skaičius gali būti susietas su faktinė char. 768 01:04:31,570 --> 01:04:33,520 Gali būti ASCII simbolių, ir tai tiesa. 769 01:04:33,520 --> 01:04:36,220 Tai yra būtent tai, kas vyksta. 770 01:04:36,220 --> 01:04:39,190 Mes naudojame int paprasčiausiai todėl, kad turi daugiau bitų. 771 01:04:39,190 --> 01:04:44,750 Tai didesnis nei char; mūsų char turi tik 8 bitai,, 1 baitas mūsų 32-bit. 772 01:04:44,750 --> 01:04:48,520 Ir int visus 4 baitai verta vietos. 773 01:04:48,520 --> 01:04:50,940 Ir paaiškėja, kad tai, kaip fgetc veikia, 774 01:04:50,940 --> 01:04:53,940 jei mes Pereikite mūsų santrauką šio žinyno puslapyje šiek tiek, 775 01:04:53,940 --> 01:05:05,000 pereikite visą kelią žemyn. Pasirodo, kad jie naudoja šią ypatingą vertę, vadinamą EOF. 776 01:05:05,000 --> 01:05:09,640 Tai speciali konstanta, grąžinimo vertės fgetc funkcija 777 01:05:09,640 --> 01:05:14,570 kai paspausite failo pabaigoje, arba, jei jūs gaunate klaidos pranešimą. 778 01:05:14,570 --> 01:05:18,170 Ir paaiškėja, kad tai padaryti šie palyginimai su EOF tinkamai, 779 01:05:18,170 --> 01:05:24,060 norite turėti, kad papildomos informacijos kiekį, kad turite int 780 01:05:24,060 --> 01:05:28,420 , o ne naudojant char kintamuosius. 781 01:05:28,420 --> 01:05:32,130 Net jei fgetc gauti simbolį iš failo, 782 01:05:32,130 --> 01:05:38,450 norite prisiminti, kad jis grįžta kažką, kad tipo int jums. 783 01:05:38,450 --> 01:05:41,360 Tai sakė, tai gana paprasta naudoti. 784 01:05:41,360 --> 01:05:44,960 Jis ketina duoti mums simbolį, todėl visi mes turime padaryti, tai nuolat klausia failą 785 01:05:44,960 --> 01:05:48,440 "Duok man kitą simbolį, duok man kitą simbolį, duok man kitą simbolį" 786 01:05:48,440 --> 01:05:51,400 kol mes gauti į failo pabaigą. 787 01:05:51,400 --> 01:05:54,730 Ir kad bus traukti į vieną simbolį ne iš mūsų bylą, 788 01:05:54,730 --> 01:05:56,250 ir tada mes galime daryti tai, ką mes norėtume su juo. 789 01:05:56,250 --> 01:06:00,160 Mes galime laikyti jį, mes galime pridėti jį į eilutę, mes galime atspausdinti jį. 790 01:06:00,160 --> 01:06:04,630 Ar bet kad. 791 01:06:04,630 --> 01:06:09,600 >> Priartinimo atgal ir grįžta mūsų cat.c programos, 792 01:06:09,600 --> 01:06:16,170 jei mes ketiname naudoti fgetc, 793 01:06:16,170 --> 01:06:21,710 kaip galėtume spręsti šį kitą eilutę kodo? 794 01:06:21,710 --> 01:06:26,020 Mes ketiname naudoti - fread padaryti kažką šiek tiek kitokį. 795 01:06:26,020 --> 01:06:32,600 Ir šį kartą, mes tik ketina naudoti fgetc gauti vieną simbolį vienu metu. 796 01:06:32,600 --> 01:06:40,910 Apdoroti visą failą, ką galėtume daryti? 797 01:06:40,910 --> 01:06:44,030 Kiek simbolių yra faile? 798 01:06:44,030 --> 01:06:47,390 Yra daug. Taigi, jūs tikriausiai norite gauti vieną 799 01:06:47,390 --> 01:06:49,860 ir tada kitą, ir gauti kitą ir gauti kitą. 800 01:06:49,860 --> 01:06:53,330 Kokios algoritmas jūs manote, kad mes galime naudoti? 801 01:06:53,330 --> 01:06:55,470 Kokio tipo? [Aleksandras] kilpa? >> Būtent. 802 01:06:55,470 --> 01:06:57,500 Kai kurie iš kilpos. 803 01:06:57,500 --> 01:07:03,380 Už linijos iš tikrųjų yra didelis, ir šiuo atveju. 804 01:07:03,380 --> 01:07:08,620 Ir kaip jums buvo pasakyti, tai skamba kaip norite kilpą per visą failą, 805 01:07:08,620 --> 01:07:11,820 gauti simbolį vienu metu. 806 01:07:11,820 --> 01:07:13,850 Apie tai, kokiu pasiūlymus, kad gali atrodyti? 807 01:07:13,850 --> 01:07:22,090 [Aleksandras nesuprantamas] 808 01:07:22,090 --> 01:07:30,050 >> Gerai, tik pasakyk man, anglų kalba, ką jūs bandote daryti? [Aleksandras nesuprantamas] 809 01:07:30,050 --> 01:07:36,270 Taigi šiuo atveju, tai skamba kaip mes tiesiog bando kilpa per visą failą. 810 01:07:36,270 --> 01:07:45,330 [Aleksandras] Taigi i > Dydis? 811 01:07:45,330 --> 01:07:49,290 Manau, failo dydį, tiesa? Dydis - we'll tiesiog parašyti tai, kaip šis. 812 01:07:49,290 --> 01:07:57,470 Bylos dydis šiuo metu yra, i + +. 813 01:07:57,470 --> 01:08:04,610 Taigi paaiškėja, kad tai, kaip tai padaryti, naudojant fgetc ir tai yra nauja, 814 01:08:04,610 --> 01:08:10,460 yra tai, kad tai nėra lengva, tiesiog gauti failo dydį 815 01:08:10,460 --> 01:08:16,979 su šiuo "sizeof" tipo statyti, kurį mačiau prieš. 816 01:08:16,979 --> 01:08:20,910 Kai mes naudojame šią fgetc funkciją, mes įvesti kokią nors 817 01:08:20,910 --> 01:08:29,069 naujas, funky sintaksė už kilpos, kur vietoj naudojant tik pagrindinę skaitiklis 818 01:08:29,069 --> 01:08:33,920 eiti charakterį pobūdžio, mes ketiname traukti vieną simbolį vienu metu, 819 01:08:33,920 --> 01:08:37,120 vieną simbolį vienu metu, ir tai, kaip mes žinome, mes pabaigoje 820 01:08:37,120 --> 01:08:41,290 yra ne tada, kai mes skaičiuojami tam tikrą skaičių simbolių, 821 01:08:41,290 --> 01:08:49,939 bet kai personažas, mes ištraukti, kad ypatingas failo pabaigos simbolio. 822 01:08:49,939 --> 01:08:58,689 Taigi, mes galime tai padaryti - Aš vadinu tai sk, ir mes ketiname inicijuoti 823 01:08:58,689 --> 01:09:08,050 mūsų pirmąjį kvietimą gauti pirmąjį simbolį iš failo. 824 01:09:08,050 --> 01:09:14,979 Taigi šios dalies čia, tai vyksta gauti simbolį iš failo 825 01:09:14,979 --> 01:09:20,840 ir laikyti jį į kintamąjį Ch. 826 01:09:20,840 --> 01:09:25,420 Mes ketiname toliau tai daryti, kol mes gauti į failo pabaigą, 827 01:09:25,420 --> 01:09:41,170 mes bandymai yra lygi į šį specialų EOF pobūdžio charakterio. 828 01:09:41,170 --> 01:09:48,750 Ir tada vietoj daro sk + +, kuri tiesiog prieaugio vertę, 829 01:09:48,750 --> 01:09:52,710 todėl, jei mes skaityti iš failo, kapitalo, tarkim, 830 01:09:52,710 --> 01:09:56,810 ch + + duos mums b, ir tada gausime c ir tada d. 831 01:09:56,810 --> 01:09:59,310 Tai akivaizdžiai nėra, ko norime. Ką mes norime čia 832 01:09:59,310 --> 01:10:05,830 pastaruoju tiek norime gauti kitą simbolį iš failo. 833 01:10:05,830 --> 01:10:09,500 >> Taigi, kaip galėtume gauti kitą simbolį iš failo? 834 01:10:09,500 --> 01:10:13,470 Kaip mes gauname pirmąją raidę iš failo? 835 01:10:13,470 --> 01:10:17,200 [Studentų] fgetfile? >> Fgetc, ar, atsiprašau, jums buvo visiškai teisus. 836 01:10:17,200 --> 01:10:20,470 Aš su klaidomis ji teisę ten. Taigi, taip. 837 01:10:20,470 --> 01:10:26,240 Čia, o ne daryti sk + +, 838 01:10:26,240 --> 01:10:29,560 mes tiesiog ketinate skambinti fgetc (failą), vėl 839 01:10:29,560 --> 01:10:39,180 ir saugoti mūsų pačiu CH kintamojo rezultatą. 840 01:10:39,180 --> 01:10:43,730 [Studento klausimas, nesuprantamas] 841 01:10:43,730 --> 01:10:52,390 >> Tai kur šie failą * vaikinai yra ypatingas. 842 01:10:52,390 --> 01:10:59,070 Kaip jie dirba, jie - Kai pirmą kartą atidarote - kai pirmą kartą padaryti, kad fopen skambutį, 843 01:10:59,070 --> 01:11:04,260 FILE * veiksmingai naudojamas kaip rodyklė į bylos pradžios. 844 01:11:04,260 --> 01:11:12,830 Ir tada kiekvieną kartą, kai paskambinti fgetc, jis juda per vieną simbolį per failą. 845 01:11:12,830 --> 01:11:23,280 Taigi, jei jūs tai vadiname, jūs incrementing failo žymiklį vieno ženklo. 846 01:11:23,280 --> 01:11:26,210 Ir, kai jums fgetc vėl, jūs juda kitą simbolį, 847 01:11:26,210 --> 01:11:28,910 kito charakterį ir kitokio pobūdžio ir kitokio pobūdžio. 848 01:11:28,910 --> 01:11:32,030 [Studento klausimas, nesuprantamas] >> that - Taip. 849 01:11:32,030 --> 01:11:34,810 Tai koks šio magija po gaubtu. 850 01:11:34,810 --> 01:11:37,930 Jūs tiesiog laikyti pokyčio per. 851 01:11:37,930 --> 01:11:46,510 Šiuo metu, Jūs galėsite dirbtų raide. 852 01:11:46,510 --> 01:11:52,150 Taigi, kaip galėtume atsispausdinti šį į ekraną, dabar? 853 01:11:52,150 --> 01:11:58,340 Mes galime naudoti tą patį printf dalykas, kad mes naudojamas iki. 854 01:11:58,340 --> 01:12:00,330 Kad mes buvo naudoti visą semestrą. 855 01:12:00,330 --> 01:12:05,450 Mes galime vadinti printf, 856 01:12:05,450 --> 01:12:21,300 ir mes galime perduoti pobūdžio kaip, kad. 857 01:12:21,300 --> 01:12:27,430 Kitas būdas tai padaryti, o ne naudojant printf ir tai padaryti format string, 858 01:12:27,430 --> 01:12:29,490 mes taip pat gali naudoti vieną iš kitų funkcijų. 859 01:12:29,490 --> 01:12:40,090 Mes galime naudoti fputc,, kuri atspausdina simbolį ekrane, 860 01:12:40,090 --> 01:12:52,580 išskyrus atvejus, kai mes žiūrime at fputc - leiskite man šiek tiek nutolinti. 861 01:12:52,580 --> 01:12:56,430 Mes matome, kas malonu, ji imasi pobūdžio, kad mes skaitome, naudojant fgetc, 862 01:12:56,430 --> 01:13:05,100 bet tada mes turime suteikti jai srautą, spausdinti. 863 01:13:05,100 --> 01:13:11,850 Mes taip pat galime naudoti putchar funkcija, kuri bus įdėti tiesiogiai iš standartinės. 864 01:13:11,850 --> 01:13:16,070 Taigi yra visa krūva įvairių galimybių, kad mes galime naudoti spausdinti. 865 01:13:16,070 --> 01:13:19,580 Jie visi į standartinę įvesties / išvesties bibliotekoje. 866 01:13:19,580 --> 01:13:25,150 Kai norite spausdinti - taip printf, pagal nutylėjimą, bus atspausdinti specialiu standartu iš upelio, 867 01:13:25,150 --> 01:13:27,910 yra tai, kad stdout. 868 01:13:27,910 --> 01:13:41,300 Taigi, mes galime tik nuorodą į jį šio stebuklingo vertės natūra, čia STDOUT. 869 01:13:41,300 --> 01:13:48,410 Oi. Įdėkite kabliataškį ribų. 870 01:13:48,410 --> 01:13:52,790 >> Tai naują, funky informacijos čia daug. 871 01:13:52,790 --> 01:13:58,600 Tai daug yra labai idiomatinis, ta prasme, kad tai yra kodas 872 01:13:58,600 --> 01:14:05,700 tokiu būdu, kad yra parašyta tik todėl, kad švarus, skaityti, lengva skaityti. 873 01:14:05,700 --> 01:14:11,520 Yra daug skirtingų būdų, kaip tai padaryti, daug įvairių funkcijų, galite naudoti, 874 01:14:11,520 --> 01:14:14,680 bet mes linkę atlikite tuos pačius modelius daugiau ir daugiau. 875 01:14:14,680 --> 01:14:20,180 Taigi nesistebėkite, jei matote kodą, pavyzdžiui, tai vėl ir vėl ateina. 876 01:14:20,180 --> 01:14:25,690 Gerai. Šiuo metu, mes turime nutraukti tą dieną. 877 01:14:25,690 --> 01:14:31,300 Ačiū, kad atvykote. Ačiū už žiūrėti, jei esate prisijungę prie interneto. Ir mes Pasimatysime kitą savaitę. 878 01:14:31,300 --> 01:14:33,890 [CS50.TV]