1 00:00:00,000 --> 00:00:02,730 [Powered by Google Translate] [5. JAGU: vähem mugavad] 2 00:00:02,730 --> 00:00:05,180 [Nate Hardison, Harvard University] 3 00:00:05,180 --> 00:00:08,260 [See on CS50.] [CS50.TV] 4 00:00:08,260 --> 00:00:11,690 Nii et tere tulemast tagasi, poisid. 5 00:00:11,690 --> 00:00:16,320 Tere tulemast 5. jagu. 6 00:00:16,320 --> 00:00:20,220 Sel hetkel, kui on lõpule viidud viktoriin 0 ja olles näinud, kuidas sa oled teinud, 7 00:00:20,220 --> 00:00:25,770 loodetavasti tunned tõesti hea, sest ma olin väga muljet hinded käesolevas paragrahvis. 8 00:00:25,770 --> 00:00:28,050 Meie online vaatajaid, meil oli paar küsimust 9 00:00:28,050 --> 00:00:33,680 umbes kaks viimast probleemid lahendamist - või viktoriin, pigem. 10 00:00:33,680 --> 00:00:39,690 Nii et me läheme üle need tõesti kiiresti, nii et igaüks näeb, mis juhtus 11 00:00:39,690 --> 00:00:45,060 ja kuidas minna läbi tegelik lahendus, mitte lihtsalt vaadates lahendus ise. 12 00:00:45,060 --> 00:00:50,330 Me läheme viimase paari probleeme tõesti kiiresti, 32 ja 33. 13 00:00:50,330 --> 00:00:53,240 Lihtsalt jällegi nii, et online vaatajad saavad näha seda. 14 00:00:53,240 --> 00:00:59,080 >> Kui lülitate oma probleemile 32, mis on leheküljel 13, 15 00:00:59,080 --> 00:01:02,730 13 liikmesriiki 16, probleem 32 on kõik umbes vahetustehingud. 16 00:01:02,730 --> 00:01:05,010 See kõik oli umbes Vahetatakse kaks täisarvu. 17 00:01:05,010 --> 00:01:08,740 See on probleem, et me olime üle paar korda loengus. 18 00:01:08,740 --> 00:01:13,590 Ja siin, mida me palume teil teha, on kiire mälu jälgi. 19 00:01:13,590 --> 00:01:17,000 Täita muutujate väärtused nagu nad on virnas 20 00:01:17,000 --> 00:01:20,250 kui kood läbib see swap funktsiooni. 21 00:01:20,250 --> 00:01:24,500 Eelkõige, milliseid me vaatame - Ma panen selle iPadi alla - 22 00:01:24,500 --> 00:01:29,650 eriti, mida me vaatame on seda joont järjekorranumbritega 6 siinsamas. 23 00:01:29,650 --> 00:01:36,740 Ja see on nummerdatud 6 lihtsalt piirnevuse eelmise probleem. 24 00:01:36,740 --> 00:01:41,720 Mida me tahame teha, on näidata või märgistada riik mälu 25 00:01:41,720 --> 00:01:46,090 kui see on ajal, mil me täita seda liini number 6, 26 00:01:46,090 --> 00:01:52,540 mis on tegelikult tagasi meie swap funktsiooni siin. 27 00:01:52,540 --> 00:01:59,450 Kui me keri siin nägime, et aadressid kõik mälu oli meile andnud. 28 00:01:59,450 --> 00:02:02,540 See on väga võti; me tuleme tagasi selle üks hetk. 29 00:02:02,540 --> 00:02:09,240 Ja siis siia alla allosas oli meil vähe mälu diagramm et me ei kavatse viidata. 30 00:02:09,240 --> 00:02:12,490 Ma olen tegelikult teinud läbi minu iPad. 31 00:02:12,490 --> 00:02:20,720 Nii et ma lähen vaheldumisi edasi-tagasi vahel iPad ja see kood ainult viitega. 32 00:02:20,720 --> 00:02:26,540 >> Alustame. Esiteks, ärgem keskenduda paari esimest rida peamiste siin. 33 00:02:26,540 --> 00:02:30,220 Et alustada, me ei kavatse initsialiseerida x 1 ja y 2. 34 00:02:30,220 --> 00:02:33,040 Nii et meil on kaks täisarvu muutujad, nad mõlemad kavatse panna virna. 35 00:02:33,040 --> 00:02:36,050 Me läheme pane 1 ja 2 neist. 36 00:02:36,050 --> 00:02:43,150 Nii et kui ma flip üle minu iPad, loodetavasti, vaatame - 37 00:02:43,150 --> 00:02:48,660 Apple TV peegeldamine, ja seal me läheme. Okei. 38 00:02:48,660 --> 00:02:51,670 Nii et kui ma flip üle minu iPad 39 00:02:51,670 --> 00:02:56,220 Ma tahan initsialiseerida x 1 ja y 2. 40 00:02:56,220 --> 00:03:00,580 Me teeme seda lihtsalt kirjutades 1 lahter x 41 00:03:00,580 --> 00:03:07,730 ja 2 lahter y. Üsna lihtne. 42 00:03:07,730 --> 00:03:11,620 Nii et nüüd lähme tagasi laptop, vaata, mis juhtub järgmisena. 43 00:03:11,620 --> 00:03:15,810 Nii et see järgmisel real on koht, kus asjad keeruliseks. 44 00:03:15,810 --> 00:03:28,110 Me liigu aadress x ja aadress y parameetrid a ja b konverteerimist funktsioon. 45 00:03:28,110 --> 00:03:32,380 Aadress x ja aadress y on asju, mida me ei saa arvutada 46 00:03:32,380 --> 00:03:36,360 viitamata nende bullet punkte siinsamas. 47 00:03:36,360 --> 00:03:39,750 Ja õnneks kahe esimese bullet punkte ütle meile täpselt, mis vastused on. 48 00:03:39,750 --> 00:03:44,740 Aadress x mälu on 10, ja aadress y mälu on 14. 49 00:03:44,740 --> 00:03:51,870 Nii et need on väärtused, et saada edasi nii a ja b up üles meie swap funktsiooni. 50 00:03:51,870 --> 00:04:00,760 Nii et taas, sisse tagasi meie skeem, võin kirjutada 10 51 00:04:00,760 --> 00:04:07,400 ja 14 b. 52 00:04:07,400 --> 00:04:11,610 Nüüd on see punkt, mille me jätkata swap. 53 00:04:11,610 --> 00:04:14,520 Nii flipping tagasi laptop jälle, 54 00:04:14,520 --> 00:04:21,079 näeme, et kuidas swap toimib on ma esimest dereference ja salvesta tulemus tmp. 55 00:04:21,079 --> 00:04:27,650 Nii dereference operaator ütleb: "Hei. Treat sisu muutuja nagu aadress. 56 00:04:27,650 --> 00:04:33,830 Mine iganes hoitakse sellel aadressil ning aseta. " 57 00:04:33,830 --> 00:04:41,720 Mis saab laadida läbi muutuja läheb hoida meie tmp muutuja. 58 00:04:41,720 --> 00:04:45,150 Flipping tagasi iPad. 59 00:04:45,150 --> 00:04:51,690 Kui läheme Aadress 10, me teame, et aadress 10 on varible x 60 00:04:51,690 --> 00:04:55,480 sest meile öeldi Meie täppjaotis et aadress x mälu on 10. 61 00:04:55,480 --> 00:05:00,180 Nii saame sinna minna, saada väärtus see, mis on 1, nagu näeme meie iPad 62 00:05:00,180 --> 00:05:06,300 ja koormus seda arvesse tmp. 63 00:05:06,300 --> 00:05:08,250 Jällegi, see ei ole lõplik sisu. 64 00:05:08,250 --> 00:05:14,350 Me läheme läbi kõndida ja me jõuame meie lõplikku seisu programmi lõpus. 65 00:05:14,350 --> 00:05:17,210 Aga praegu on meil väärtus 1 salvestatud tmp. 66 00:05:17,210 --> 00:05:19,210 >> Ja seal on kiire küsimus siia. 67 00:05:19,210 --> 00:05:23,980 [Aleksandr] Kas dereference operaator - see on lihtsalt täht õiguse ees muutuja? 68 00:05:23,980 --> 00:05:27,600 >> Jah. Nii dereference operaator, nagu me flip tagasi meie sülearvuti taas 69 00:05:27,600 --> 00:05:33,780 on see täht õiguse ees. 70 00:05:33,780 --> 00:05:37,460 Selles mõttes on see - sa vastandada seda korrutus 71 00:05:37,460 --> 00:05:42,400 mis eeldab kahte asja; dereference operaator on unaarsed operaator. 72 00:05:42,400 --> 00:05:46,130 Lihtsalt kohaldada üks väärtus, mitte binaarne operaator, 73 00:05:46,130 --> 00:05:48,810 kus te kohaldatakse kaks erinevat väärtust. 74 00:05:48,810 --> 00:05:52,080 Nii see on, mida juhtub seda joont. 75 00:05:52,080 --> 00:05:58,390 Panime väärtus 1 ja hoida see meie ajutine täisarv muutuja. 76 00:05:58,390 --> 00:06:05,800 Järgmine rida, me salvestada sisu ja B - 77 00:06:05,800 --> 00:06:12,630 või õigemini, me salvestada sisu, et b on suunaga sinna paika, kus osutab. 78 00:06:12,630 --> 00:06:17,690 Kui me analüüsime seda paremalt vasakule, me dereference b, 79 00:06:17,690 --> 00:06:23,580 me tegelema 14, me haarata täisarv, mis on seal, 80 00:06:23,580 --> 00:06:26,900 ja siis me minna aadress 10 81 00:06:26,900 --> 00:06:34,240 ja me visata tulemus meie dereference B sellesse ruumi. 82 00:06:34,240 --> 00:06:40,080 Flipping tagasi meie iPad, kus saame teha seda veidi konkreetsem, 83 00:06:40,080 --> 00:06:44,070 See aitaks, kui ma kirjutan numbrid kõik aadressid siia. 84 00:06:44,070 --> 00:06:53,820 Nii et me teame, et y, oleme aadressiga 14, x on aadressil 10. 85 00:06:53,820 --> 00:07:00,180 Kui me hakkame kell b, me dereference b, me haarata väärtus 2. 86 00:07:00,180 --> 00:07:08,320 Me rüütama see väärtus, kuna see on väärtus, kes elab aadressil 14. 87 00:07:08,320 --> 00:07:15,700 Ja me ei kavatse seda ellu muutuja, mis elab aadressil 10, 88 00:07:15,700 --> 00:07:19,160 mis on seal, mis vastab meie muutuja x. 89 00:07:19,160 --> 00:07:21,810 Nii et me saame teha natuke kirjutada siia 90 00:07:21,810 --> 00:07:35,380 kus me vabaneda meie 1 ja selle asemel me kirjutame 2. 91 00:07:35,380 --> 00:07:39,560 Nii et kõik on hästi ja hea maailma, kuigi me oleme kirjutatakse x nüüd. 92 00:07:39,560 --> 00:07:44,890 Meil on salvestatud x vana väärtus meie tmp muutuja. 93 00:07:44,890 --> 00:07:50,210 Nii et me suudaks swap järgmisele reale. 94 00:07:50,210 --> 00:07:53,030 Flipping tagasi meie sülearvuti. 95 00:07:53,030 --> 00:07:58,150 Nüüd jääb üle võtta sisu välja meie ajutine täisarv muutuja 96 00:07:58,150 --> 00:08:05,630 ja salvestada need muutuja, mis elab aadressil, et b hoiab. 97 00:08:05,630 --> 00:08:10,230 Nii et me ei kavatse tõhusalt dereference b, et saada ligipääsu muutuja 98 00:08:10,230 --> 00:08:14,340 mis aadressil, et B omab see, 99 00:08:14,340 --> 00:08:19,190 ja me ei kavatse kraami väärtus, mis tmp hoiab ta. 100 00:08:19,190 --> 00:08:23,280 Flipping tagasi iPad veel kord. 101 00:08:23,280 --> 00:08:31,290 Ma ei kustuta seda väärtust siin, 2, 102 00:08:31,290 --> 00:08:41,010 ja selle asemel me kopeerida 1 õige asja. 103 00:08:41,010 --> 00:08:43,059 Siis järgmisel real, mis täidab muidugi - 104 00:08:43,059 --> 00:08:47,150 kui me flip tagasi sülearvuti - on see punkt 6, 105 00:08:47,150 --> 00:08:52,500 mis on koht, kus me tahtsime, et meie diagramm täielikult täidetud. 106 00:08:52,500 --> 00:08:58,940 Nii flipping tagasi iPad veel kord, lihtsalt et näeksite lõpetatud skeem, 107 00:08:58,940 --> 00:09:06,610 näete, et meil on 10, 14 b, 1 tmp, 2 x, ja 1 a. 108 00:09:06,610 --> 00:09:11,000 Kas on mingeid küsimusi selle kohta? 109 00:09:11,000 --> 00:09:14,640 Kas see mõttekam, kes kõndis läbi selle? 110 00:09:14,640 --> 00:09:24,850 Tee vähem mõtet? Loodetavasti mitte. Okei. 111 00:09:24,850 --> 00:09:28,230 >> Näiturid on väga keeruline teema. 112 00:09:28,230 --> 00:09:33,420 Üks noormees töötame koos on väga levinud ütlus: 113 00:09:33,420 --> 00:09:36,590 "Selleks, et mõista suunanäitajaks, peate kõigepealt mõistma lähtekohtadeks." 114 00:09:36,590 --> 00:09:40,530 Mis minu arvates on väga õige. See ei võta aega, et harjuda sellega. 115 00:09:40,530 --> 00:09:45,360 Joonistus palju pilte, loosi mälu diagrammid nagu see on väga kasulik, 116 00:09:45,360 --> 00:09:49,480 ja pärast sa suudad näiteks pärast näiteks pärast näiteks 117 00:09:49,480 --> 00:09:54,450 see saab hakata tegema veidi rohkem mõistust ja veidi rohkem mõistust ja natuke rohkem mõistust. 118 00:09:54,450 --> 00:10:01,560 Lõpuks ühel päeval, siis on see kõik täiesti selgeks. 119 00:10:01,560 --> 00:10:13,800 Kõik küsimused enne kui me liigume edasi järgmise probleemi? Hea küll. 120 00:10:13,800 --> 00:10:18,840 Nii flip tagasi sülearvuti. 121 00:10:18,840 --> 00:10:23,300 Järgmine probleem on meil on probleem number 33 faili I / O. 122 00:10:23,300 --> 00:10:26,350 Suumimiseks seda natuke. 123 00:10:26,350 --> 00:10:28,710 Probleem 33 - Jah? 124 00:10:28,710 --> 00:10:32,110 >> [Daniel] Ma lihtsalt pidin kiire küsimus. See täht või tärn, 125 00:10:32,110 --> 00:10:35,590 seda nimetatakse viite mahavõtmine, kui kasutate tärniga enne. 126 00:10:35,590 --> 00:10:38,820 Mis selle nimi on, kui te kasutate ampersand enne? 127 00:10:38,820 --> 00:10:43,140 >> Ampersand enne on aadress-kasutaja. 128 00:10:43,140 --> 00:10:45,880 Nii et olgem liikuda varundada. 129 00:10:45,880 --> 00:10:49,310 Oih. Ma olen suum režiimis nii et ma ei saa tõesti liikuge. 130 00:10:49,310 --> 00:10:52,780 Kui me vaatame seda koodi tõesti kiiresti siinsamas, 131 00:10:52,780 --> 00:10:54,980 uuesti, sama asi juhtub. 132 00:10:54,980 --> 00:10:59,180 Kui me vaatame seda koodi siin, sellel joonel, kus me helistada vahetada, 133 00:10:59,180 --> 00:11:10,460 ampersandi lihtsalt ütlen "saada aadress, kus muutuja x elu." 134 00:11:10,460 --> 00:11:14,460 Kui teie kompilaator kompileerib koodi, 135 00:11:14,460 --> 00:11:20,590 see on tegelikult füüsiliselt tähistama koht mälus kõiki oma muutujate elada. 136 00:11:20,590 --> 00:11:24,910 Ja mis siis kompilaator saab siis teha, kui see on koostatud kõike, 137 00:11:24,910 --> 00:11:31,110 ta teab, "Oh, ma panen x aadressiga 10. panin y aadressil 14." 138 00:11:31,110 --> 00:11:34,640 Seda saab siis täitke need väärtused teile. 139 00:11:34,640 --> 00:11:44,740 Nii saab siis - see saab siis andke sellest ja liigu & y samuti. 140 00:11:44,740 --> 00:11:50,730 Need kutid saada aadressi, kuid ka nemad, kui te kaotate need swap funktsiooni, 141 00:11:50,730 --> 00:11:55,690 Seda tüüpi teavet, seda int * siinsamas, ütleb kompilaator, 142 00:11:55,690 --> 00:12:01,350 "Okei, me lähme tuleb tõlgendada seda aadressi aadress täisarv muutuja." 143 00:12:01,350 --> 00:12:05,900 Nagu aadress int, mis erineb aadress märk muutuja 144 00:12:05,900 --> 00:12:09,930 sest int kulub, 32-bit masin, kulub 4 baiti ruumi, 145 00:12:09,930 --> 00:12:13,310 arvestades iseloomu ainult kulub 1 bait ruumi. 146 00:12:13,310 --> 00:12:17,310 Seega on oluline teada ka seda, mis on - mis elab, millist väärtust 147 00:12:17,310 --> 00:12:20,340 elab aadressil, mis sai möödunud sisse 148 00:12:20,340 --> 00:12:22,020 Või aadress, et olete tegelevad. 149 00:12:22,020 --> 00:12:29,020 Nii, sa tead, kui palju baiti informatsiooni tegelikult koormus läbi oma RAM. 150 00:12:29,020 --> 00:12:31,780 Ja siis, jah, see on käivitatav operaator, nagu sa küsisid, 151 00:12:31,780 --> 00:12:37,200 läheb ja pääseb teavet konkreetse aadressi. 152 00:12:37,200 --> 00:12:42,820 Nii ta ütleb, selle muutuja siit, ravida sisu nagu aadress, 153 00:12:42,820 --> 00:12:47,880 minna sellele aadressile ja tõmmake, laaditakse protsessor, koorma ümber registreerima 154 00:12:47,880 --> 00:12:56,340 tegelikke väärtusi või sisu, mis elada sellel aadressil. 155 00:12:56,340 --> 00:12:59,620 Kas veel küsimusi? Need on head küsimused. 156 00:12:59,620 --> 00:13:01,650 See on palju uut terminoloogiat liiga. 157 00:13:01,650 --> 00:13:09,800 See on ka kuidagi kahtlane, nähes & ja * erinevates kohtades. 158 00:13:09,800 --> 00:13:13,180 >> Hea küll. 159 00:13:13,180 --> 00:13:18,530 Nii tagasi probleem 33 faili I / O. 160 00:13:18,530 --> 00:13:22,540 See oli üks neid probleeme, mis minu arvates paar asja juhtunud. 161 00:13:22,540 --> 00:13:25,400 Üks, see on suhteliselt uus teema. 162 00:13:25,400 --> 00:13:30,590 See esitati üsna varsti enne viktoriin, 163 00:13:30,590 --> 00:13:33,400 ja siis ma arvan, et see oli selline nagu üks neist sõna probleeme matemaatika 164 00:13:33,400 --> 00:13:39,720 kus nad teile palju infot, aga sa tegelikult ei lõpuks võttes kasutada ton ta. 165 00:13:39,720 --> 00:13:44,060 Esimene osa sellest probleemist on kirjeldada, mida CSV fail on. 166 00:13:44,060 --> 00:13:50,620 Nüüd CSV-faili, vastavalt kirjeldusele, on komadega eraldatud väärtuste fail. 167 00:13:50,620 --> 00:13:55,300 Põhjus need on üldse huvitav, ning põhjus, miks sa kunagi neid kasutada, 168 00:13:55,300 --> 00:14:00,800 on, sest kui paljud teist on kunagi kasutatud asju Excel? 169 00:14:00,800 --> 00:14:03,240 Joonis enamik teist on ilmselt või kasutab mingil hetkel oma elus. 170 00:14:03,240 --> 00:14:06,430 Sa kasutad midagi Excel. 171 00:14:06,430 --> 00:14:10,940 Selleks, et saada andmeid välja Exceli tabeli või teha mingit töötlemist sellega, 172 00:14:10,940 --> 00:14:17,240 kui sa tahad kirjutada C programmi või Pythoni programm, Java programm, 173 00:14:17,240 --> 00:14:20,070 tegelema andmed olete salvestanud sinna, 174 00:14:20,070 --> 00:14:23,170 üks levinumaid viise, et saan seda välja on CSV-faili. 175 00:14:23,170 --> 00:14:26,850 Ja saate avada Exceli ja kui lähete "Save As" dialoog, 176 00:14:26,850 --> 00:14:32,840 saad välja tegelik CSV-faili. 177 00:14:32,840 --> 00:14:35,890 >> Handy teada, kuidas lahendada need asjad. 178 00:14:35,890 --> 00:14:42,010 Kuidas see toimib on see, et see on sarnane - ma mõtlen, see on sisuliselt imiteerib arvutustabeli, 179 00:14:42,010 --> 00:14:47,590 kus, nagu me näeme siin, väga vasemmanpuolimmaista tükk, 180 00:14:47,590 --> 00:14:49,910 meil on kõik perekonnanimed. 181 00:14:49,910 --> 00:14:54,670 Nii et meil on Malan, siis Hardison ja seejärel Bowden, MacWilliam ja seejärel Chan. 182 00:14:54,670 --> 00:14:59,470 Kõik perekonnanimi. Ja siis koma eraldab viimane nimed eesnime. 183 00:14:59,470 --> 00:15:02,970 David, Nate, Rob, Tommy, ja Zamyla. 184 00:15:02,970 --> 00:15:06,850 Olen alati segatakse Robby ja Tom. 185 00:15:06,850 --> 00:15:10,940 Ja siis viimaks, kolmas tulp e-posti aadresse. 186 00:15:10,940 --> 00:15:18,500 Kui sa mõistad, et ülejäänud programmi on üsna lihtne rakendada. 187 00:15:18,500 --> 00:15:23,850 Mida oleme teinud selleks, et jäljendada seda sama struktuuri meie C programmi 188 00:15:23,850 --> 00:15:27,510 on meil kasutada struktuuri. 189 00:15:27,510 --> 00:15:30,520 Hakkame mängides need natuke rohkem ka. 190 00:15:30,520 --> 00:15:35,790 Me nägime neid esimest natuke ka Ülesanded nr 3, kui olime tegelevad sõnastikke. 191 00:15:35,790 --> 00:15:40,290 Aga see personal struct salvestab perekonnanimi, eesnimi ja e-posti. 192 00:15:40,290 --> 00:15:44,500 Just nagu meie CSV faili salvestamiseks. 193 00:15:44,500 --> 00:15:47,950 Nii et see on lihtsalt teisendamine ühest formaadist teise. 194 00:15:47,950 --> 00:15:54,630 Me peame muutma, sel juhul töötaja struct arvesse liin, 195 00:15:54,630 --> 00:15:59,060 komadega eraldatud liin, lihtsalt niisama. 196 00:15:59,060 --> 00:16:01,500 Kas see on loogiline? Te kõik oleme võtnud viktoriin, 197 00:16:01,500 --> 00:16:07,680 nii et ma kujutan ette, et teil on vähemalt oli mõnda aega mõtlema. 198 00:16:07,680 --> 00:16:16,410 >> Kui rendi funktsioon, probleem palub meil võtta - we'll suurendada selle natuke - 199 00:16:16,410 --> 00:16:22,480 võtta personali struktuur, personal struct, mille nimi on, 200 00:16:22,480 --> 00:16:30,900 ja lisab selle sisu meie staff.csv faili. 201 00:16:30,900 --> 00:16:34,230 Selgub, et see on üsna lihtne kasutada. 202 00:16:34,230 --> 00:16:37,430 Me omamoodi mängida neid funktsioone veel natuke täna. 203 00:16:37,430 --> 00:16:44,510 Aga sel juhul, fprintf funktsioon on tõesti võti. 204 00:16:44,510 --> 00:16:51,960 Nii fprintf, saame trükkida, nagu kutid on kasutanud printf kogu see termin. 205 00:16:51,960 --> 00:16:55,050 Võite printf rida faili. 206 00:16:55,050 --> 00:16:59,030 Nii et selle asemel lihtsalt tegemise tavaline printf kõne, kus sa andsid selle stringi 207 00:16:59,030 --> 00:17:05,380 ja siis asendada kõik muutuja järgmised argumendid, 208 00:17:05,380 --> 00:17:11,290 koos fprintf, oma väga esimene argument on selle asemel fail, mida soovite kirjutada. 209 00:17:11,290 --> 00:17:21,170 Kui me vaatame seda seadet, näiteks mees fprintf, 210 00:17:21,170 --> 00:17:25,980 näeme vahe printf ja fprintf. 211 00:17:25,980 --> 00:17:28,960 Ma suumida siin natuke. 212 00:17:28,960 --> 00:17:33,140 Nii printf, anname selle stringi ja seejärel hilisemaid vaidlusi 213 00:17:33,140 --> 00:17:37,580 kõik muutujad väljavahetamist või asendamist meie stringi. 214 00:17:37,580 --> 00:17:47,310 Ning arvestades, fprintf esimene argument on tõepoolest seda faili * nimega oja. 215 00:17:47,310 --> 00:17:51,800 >> Liikumine tagasi siia, et meie rent, 216 00:17:51,800 --> 00:17:54,550 Meil on juba meie fail * oja avas meie jaoks. 217 00:17:54,550 --> 00:17:57,810 Vot see esimene rida teeb, see avab staff.csv faili 218 00:17:57,810 --> 00:18:01,690 see avab selle append mode ja kõik mis on jäänud meie jaoks teha, on 219 00:18:01,690 --> 00:18:08,640 kirjuta personali struktuuri failile. 220 00:18:08,640 --> 00:18:10,870 Ja vaatame, kas ma tahan kasutada iPad? 221 00:18:10,870 --> 00:18:17,900 Ma kasutan iPadi. Meil on tühine - paneme selle lauale, et ma saaks kirjutada veidi paremini - 222 00:18:17,900 --> 00:18:33,680 kehtetuks rendi ja see võtab ühe argumendina, personali struktuuri nimetatakse s. 223 00:18:33,680 --> 00:18:44,120 Sai meie traksid, meil meie fail * nn faili 224 00:18:44,120 --> 00:18:48,380 meil fopen rida meile antud, 225 00:18:48,380 --> 00:18:51,890 ja ma lihtsalt kirjutan selle punktidena sest see on juba Vikipeedia. 226 00:18:51,890 --> 00:19:00,530 Ja siis meie järgmisele reale, me ei kavatse helistada fprintf 227 00:19:00,530 --> 00:19:03,700 ja me läheme edasi toimikust, et me tahame, et printida, 228 00:19:03,700 --> 00:19:10,290 ja siis meie stringi, mis - 229 00:19:10,290 --> 00:19:14,300 Ma annan teile kutid mulle kuidas see välja näeb. 230 00:19:14,300 --> 00:19:20,500 Kuidas sinuga on, Stella? Kas tead, mida esimene osa stringi välja näeb? 231 00:19:20,500 --> 00:19:24,270 [Stella] Ma pole kindel. >> Julgelt küsida Jimmy. 232 00:19:24,270 --> 00:19:27,690 Kas sa tead, Jimmy? 233 00:19:27,690 --> 00:19:31,000 [Jimmy] Kas see just viimane? Ma ei tea. Ma pole päris kindel. 234 00:19:31,000 --> 00:19:39,020 >> Okei. Kuidas, ei keegi saada see õige kohta eksam? 235 00:19:39,020 --> 00:19:41,770 No küll. 236 00:19:41,770 --> 00:19:47,920 Tuleb välja, et siin kõik me peame tegema, et me tahame iga osa meie personali struktuur 237 00:19:47,920 --> 00:19:53,290 tuleb välja printida kui string meie fail. 238 00:19:53,290 --> 00:19:59,900 Me lihtsalt kasutada stringi asendamist iseloom kolmel erineval korda, sest meil on perekonnanimi 239 00:19:59,900 --> 00:20:07,160 järgneb koma, siis eesnimi järgneb koma, 240 00:20:07,160 --> 00:20:12,430 ja siis lõpuks e-posti aadress, millele järgneb - mis ei ole 241 00:20:12,430 --> 00:20:15,140 paigaldamise minu ekraanil - kuid see järgneb reavahetus sümbol. 242 00:20:15,140 --> 00:20:20,060 Nii et ma lähen kirjutan selle lihtsalt sinna. 243 00:20:20,060 --> 00:20:23,560 Ja siis pärast meie stringi, 244 00:20:23,560 --> 00:20:27,880 me lihtsalt peame vahetused, mis me pääsete ligi dot märke 245 00:20:27,880 --> 00:20:31,370 et me nägime probleem set 3. 246 00:20:31,370 --> 00:20:48,820 Saame kasutada s.last, s.first ja s.email 247 00:20:48,820 --> 00:20:58,990 asendada neis kolmes väärtused meie stringi. 248 00:20:58,990 --> 00:21:06,190 Nii et kuidas see läks? Mõtet? 249 00:21:06,190 --> 00:21:09,700 Jah? Ei? Võimalik? Okei. 250 00:21:09,700 --> 00:21:14,180 >> Viimane asi, mida me teeme, kui me oleme trükitud ja pärast oleme avanud meie faili: 251 00:21:14,180 --> 00:21:17,370 kui oleme avanud faili, me peame alati meeles pidama sulgeda. 252 00:21:17,370 --> 00:21:19,430 Sest muidu me lõpetame lekib mälu, 253 00:21:19,430 --> 00:21:22,500 kasutades üles fail kirjeldustega. 254 00:21:22,500 --> 00:21:25,950 Nii et sulgege see, mis funktsiooni meil kasutada? Daniel? 255 00:21:25,950 --> 00:21:30,120 [Daniel] kirjutamisel? >> Kirjutamisel, täpselt. 256 00:21:30,120 --> 00:21:37,520 Nii et viimane osa sellest probleemist oli korralikult sulgeda fail, kasutades kirjutamisel funktsioon, 257 00:21:37,520 --> 00:21:40,370 mis lihtsalt tundub nii. 258 00:21:40,370 --> 00:21:43,880 Mitte liiga hull. 259 00:21:43,880 --> 00:21:46,990 Lahe. 260 00:21:46,990 --> 00:21:49,520 Nii et see probleem 33 viktoriini. 261 00:21:49,520 --> 00:21:52,480 Me peame kindlasti rohkem faili I / O tulemas. 262 00:21:52,480 --> 00:21:55,130 Teeme natuke rohkem loeng täna, või punktis täna, 263 00:21:55,130 --> 00:22:01,710 sest seda läheb moodustavad suurema osa sellest tulemas pset. 264 00:22:01,710 --> 00:22:05,020 Liigume edasi tegema selles punktis. Jah? 265 00:22:05,020 --> 00:22:10,880 >> [Charlotte]] Miks kirjutamisel (fail) asemel kirjutamisel (staff.csv)? 266 00:22:10,880 --> 00:22:19,100 >> Ah. Sest tuleb välja, et - nii küsimus, mis on suur üks, 267 00:22:19,100 --> 00:22:27,800 Seetõttu, kui me kirjutame kirjutamisel, me kirjalikult kirjutamisel (fail) täht muutuja 268 00:22:27,800 --> 00:22:33,680 mitte faili nimi, staff.csv? Kas see on õige? Jah. 269 00:22:33,680 --> 00:22:39,570 Võtame pilk. Kui ma saan tagasi oma sülearvuti, 270 00:22:39,570 --> 00:22:45,040 ja vaatame kirjutamisel funktsioon. 271 00:22:45,040 --> 00:22:51,460 Nii kirjutamisel funktsioon sulgeb oja ja ta võtab kursor oja, et me tahame sulgeda, 272 00:22:51,460 --> 00:22:57,010 mitte tegeliku faili nimi, mida tahame sulgeda. 273 00:22:57,010 --> 00:23:01,620 Ja seda sellepärast, kulisside taga, kui sa helistada fopen, 274 00:23:01,620 --> 00:23:12,020 Kui avada faili, sa oled tegelikult eraldada mälu, et salvestada teavet faili. 275 00:23:12,020 --> 00:23:16,380 Nii et teil on faili viitaja et on teavet faili, 276 00:23:16,380 --> 00:23:23,080 nagu see on avatud, selle suurus, kus kasutaja parajasti asub fail, 277 00:23:23,080 --> 00:23:29,100 nii et saad teha lugemine ja kirjutamine nõuab, et erilist aset faili. 278 00:23:29,100 --> 00:23:38,060 Sa lõpuks sulgeda kursor sulgemise asemel faili nimi. 279 00:23:38,060 --> 00:23:48,990 >> Jah? [Daniel] Nii et kasutada rendi, te ütlete - kuidas see saada kasutaja sisend? 280 00:23:48,990 --> 00:23:53,830 Kas fprintf käitunud getString selles mõttes, et see lihtsalt ootama kasutaja sisend 281 00:23:53,830 --> 00:23:57,180 ja palun kirjuta see - või ootama teil sisestada need kolm asja? 282 00:23:57,180 --> 00:24:00,480 Või sa pead kasutama midagi rakendada rendi? 283 00:24:00,480 --> 00:24:04,100 >> Jah. Nii et me ei ole - küsimus on, kuidas me saame kasutaja sisend 284 00:24:04,100 --> 00:24:09,220 et rakendada rendi? Ja mis meil siin on helistaja rendileping 285 00:24:09,220 --> 00:24:17,690 sooritanud käesoleva personal struct koos kõigi salvestatud andmete struct juba. 286 00:24:17,690 --> 00:24:22,990 Nii fprintf on võimalik lihtsalt kirjutada, et andmed otse faili. 287 00:24:22,990 --> 00:24:25,690 Pole oodanud kasutaja sisend. 288 00:24:25,690 --> 00:24:32,110 Kasutaja juba antud panust korralikult panna see selline tööjõud struct. 289 00:24:32,110 --> 00:24:36,510 Ja asjad, muidugi, murdub, kui mõni neist vihjeid oli null, 290 00:24:36,510 --> 00:24:40,370 nii me kerige tagasi siia ja me vaatame meie struct. 291 00:24:40,370 --> 00:24:43,640 Meil on stringi viimane, string esimene, string email. 292 00:24:43,640 --> 00:24:48,530 Nüüd teame, et kõik need tõesti, kapoti alla, on char * muutujad. 293 00:24:48,530 --> 00:24:53,470 See võib olla või mitte olla suunatud tühjaks. 294 00:24:53,470 --> 00:24:55,800 Neid võib osutades mälu hunnik, 295 00:24:55,800 --> 00:24:59,650 võibolla mälu pinu. 296 00:24:59,650 --> 00:25:04,580 Me tõesti ei tea, kuid kui mõni neist suunistest ei null, või kehtetu, 297 00:25:04,580 --> 00:25:08,120 et mis sa kindlasti krahhi meie rendi funktsioon. 298 00:25:08,120 --> 00:25:11,050 See oli midagi, mis oli omamoodi väljuvad eksam. 299 00:25:11,050 --> 00:25:16,440 Me ei muretse, et. 300 00:25:16,440 --> 00:25:22,170 Suur. Okei. Nii liigub edasi viktoriini. 301 00:25:22,170 --> 00:25:25,760 >> Olgem sulgeda see kutt, ja me ei kavatse vaadata pset 4. 302 00:25:25,760 --> 00:25:34,700 Nii et kui te vaatate pset spec, kui pääsete siis, cs50.net/quizzes, 303 00:25:34,700 --> 00:25:42,730 me ei lähe läbi mõned jagu probleemid täna. 304 00:25:42,730 --> 00:25:52,240 Ma kerides - osa küsimusi algab kolmanda lehekülje pset spec. 305 00:25:52,240 --> 00:25:57,800 Ja esimene osa küsib minna ja vaadata lühike suunates ja torud. 306 00:25:57,800 --> 00:26:02,820 Milline oli selline jahe lühike, näitab teile mõned uued, jahe käsurea nippe, mida saab kasutada. 307 00:26:02,820 --> 00:26:06,050 Ja siis on meil mõned küsimused teile samuti. 308 00:26:06,050 --> 00:26:10,860 See esimene küsimus ojad, mille printf kirjutab vaikimisi 309 00:26:10,860 --> 00:26:15,920 me liiki käsitlenud natuke hetk tagasi. 310 00:26:15,920 --> 00:26:22,380 See fprintf et me just arutasime võtab toimikus * oja selle väitega. 311 00:26:22,380 --> 00:26:26,580 kirjutamisel võtab toimikus * oja samuti, 312 00:26:26,580 --> 00:26:32,660 ja tagastatav väärtus fopen annab sulle faili * oja samuti. 313 00:26:32,660 --> 00:26:36,060 Põhjus, miks me ei ole näinud neid enne, kui oleme käsitlenud printf 314 00:26:36,060 --> 00:26:39,450 seetõttu printf on vaikimisi oja. 315 00:26:39,450 --> 00:26:41,810 Ja vaikimisi oja, mida ta kirjutab 316 00:26:41,810 --> 00:26:45,190 saate teada lühikese. 317 00:26:45,190 --> 00:26:50,080 Nii et kindlasti võtta pilk see. 318 00:26:50,080 --> 00:26:53,010 >> Tänapäeva jagu, me ei kavatse rääkida natuke GDB, 319 00:26:53,010 --> 00:26:57,720 sest mida rohkem kursis olete koos, seda rohkem praktikat saate koos, 320 00:26:57,720 --> 00:27:01,390 paremini peate olema tegelikult jälile vigu oma koodi. 321 00:27:01,390 --> 00:27:05,540 See kiirendab protsessi silumine üles tohutult. 322 00:27:05,540 --> 00:27:09,230 Nii et kasutades printf, iga kord sa, et sa pead kompileeri kood, 323 00:27:09,230 --> 00:27:13,000 teil on käivitada uuesti, mõnikord sa pead liikuma printf kõne ümber, 324 00:27:13,000 --> 00:27:17,100 kommenteeri välja koodi, see lihtsalt võtab aega. 325 00:27:17,100 --> 00:27:20,850 Meie eesmärgiks on proovida ja veenda teid, et koos gdb, saate sisuliselt 326 00:27:20,850 --> 00:27:26,810 printf midagi kordagi oma koodi ja sa ei pea kunagi kompileeri see. 327 00:27:26,810 --> 00:27:35,120 Sa ei pea kunagi alustada ja hoida aim kuhu printf kõrval. 328 00:27:35,120 --> 00:27:40,910 Esimene asi, mida teha on kopeerida seda joont ja saada osa koodi off veebis. 329 00:27:40,910 --> 00:27:47,530 Ma kopeerimine rida koodi, mis ütleb: "wget ​​http://cdn.cs50.net". 330 00:27:47,530 --> 00:27:49,510 Ma lähen kopeeri see. 331 00:27:49,510 --> 00:27:55,950 Ma lähen üle mu aparaat, suumida, nii et saate näha, mida ma teen, 332 00:27:55,950 --> 00:28:01,890 kleepides see seal, ja kui ma Enter, see wget käsu sõna otseses mõttes on veebi saada. 333 00:28:01,890 --> 00:28:06,210 See saab lammutama seda faili välja Interneti, 334 00:28:06,210 --> 00:28:11,790 ja see läheb salvestage see jooksev kataloog. 335 00:28:11,790 --> 00:28:21,630 Nüüd, kui ma oma praeguses kataloogis näete, et mul on see section5.zip fail otse seal. 336 00:28:21,630 --> 00:28:25,260 Viis lahendada see kutt on unzip see, 337 00:28:25,260 --> 00:28:27,650 mida saab teha käsurealt, just niimoodi. 338 00:28:27,650 --> 00:28:31,880 Section5.zip. 339 00:28:31,880 --> 00:28:36,980 See teeb unzip see, luua kausta minu jaoks, 340 00:28:36,980 --> 00:28:40,410 paisutavad kogu sisu, panna neid seal. 341 00:28:40,410 --> 00:28:47,410 Nii et nüüd ma ei saa minna oma 5. jagu kataloogi kasutades cd käsu. 342 00:28:47,410 --> 00:28:58,310 Ekraani tühjendamiseks kasutades selge. Nii selge ekraan. 343 00:28:58,310 --> 00:29:02,280 Nüüd ma sain kena puhas terminali tegeleda. 344 00:29:02,280 --> 00:29:06,200 >> Nüüd, kui ma loetleda kõik failid, et ma näen selle kataloogi, 345 00:29:06,200 --> 00:29:12,270 näed, et mul on neli faili: buggy1, buggy2, buggy3 ja buggy4. 346 00:29:12,270 --> 00:29:16,180 Ma sain ka oma vastava. C faile. 347 00:29:16,180 --> 00:29:20,400 Me ei kavatse vaadata. C failid nüüd. 348 00:29:20,400 --> 00:29:24,140 Selle asemel, me ei kavatse kasutada neid siis, kui me avada GDB. 349 00:29:24,140 --> 00:29:28,220 Me oleme hoidnud neid umbes nii, et meil on juurdepääs lähtekoodi kui me kasutame GDB, 350 00:29:28,220 --> 00:29:32,740 kuid Eesmärk on see osa osa on käpard ringi GDB 351 00:29:32,740 --> 00:29:40,370 ja kuidas me seda kasutada aru saada, mis on valesti koos nende nelja lollakas programmid. 352 00:29:40,370 --> 00:29:43,380 Nii et me lihtsalt läheb mööda tuba ringi tõesti kiiresti, 353 00:29:43,380 --> 00:29:47,000 ja ma küsin keegi joosta üks lollakas programme, 354 00:29:47,000 --> 00:29:54,730 ja siis läheme rühmana läbi GDB, ja me näeme, mida me saame teha, et määrata nende programmide 355 00:29:54,730 --> 00:29:58,460 või vähemalt selgitada, mis toimub vale igaühes neist. 356 00:29:58,460 --> 00:30:04,760 Alustame siin koos Daniel. Kas sa jooksed buggy1? Vaatame, mis juhtub. 357 00:30:04,760 --> 00:30:09,470 [Daniel] See ütleb, et taotluse süü. >> Jah. Täpselt. 358 00:30:09,470 --> 00:30:12,460 Nii et kui ma saan buggy1, saan SEG süü. 359 00:30:12,460 --> 00:30:16,210 Sel hetkel, ma võiks minna ja avada buggy1.c, 360 00:30:16,210 --> 00:30:19,450 proovida aru saada, mis toimub vale, 361 00:30:19,450 --> 00:30:22,000 aga üks ebameeldiv asju selle seg süü viga 362 00:30:22,000 --> 00:30:27,610 on see, et see ei ütle teile, mida rida programmi asjad tegelikult läks valesti ja murdis. 363 00:30:27,610 --> 00:30:29,880 Sa mingi pead vaatama kood 364 00:30:29,880 --> 00:30:33,990 ja nuputada kasutades oletus ja kontrollida või printf et näha, mis toimub vale. 365 00:30:33,990 --> 00:30:37,840 Üks lahedam asju GDB on, et see on tõesti väga lihtne 366 00:30:37,840 --> 00:30:42,170 välja mõtlema joon, mis teie programm jookseb kokku. 367 00:30:42,170 --> 00:30:46,160 See on täiesti väärt, et seda kasutada, isegi kui lihtsalt selle eest. 368 00:30:46,160 --> 00:30:56,190 Nii käivitamisel GDB, writing GDB, ja siis ma annan talle teed käivitatava et ma jooksen. 369 00:30:56,190 --> 00:31:01,960 Siin ma olen masinakirja gdb ./buggy1. 370 00:31:01,960 --> 00:31:06,600 Enter. Annab mulle kõik see autoriõiguse info, 371 00:31:06,600 --> 00:31:13,000 ja siin all näete seda rida, mis ütleb: "Lugemine sümbolid / home / 372 00:31:13,000 --> 00:31:17,680 jharvard/section5/buggy1. " 373 00:31:17,680 --> 00:31:22,060 Ja kui kõik hästi läheb, näete see välja printida sõnum mis näeb välja selline. 374 00:31:22,060 --> 00:31:25,500 Seda saad lugeda sümbolid, siis saad öelda "Ma loen sümboleid oma käivitatava faili" 375 00:31:25,500 --> 00:31:29,900 ja siis see on see "tehtud" sõnum siia. 376 00:31:29,900 --> 00:31:35,410 Kui näed mõne muu variant see, kui sa näed seda ei leidnud sümboleid 377 00:31:35,410 --> 00:31:41,460 või midagi sellist, mida see tähendab, et sa lihtsalt ei ole koostanud oma käivitatava korralikult. 378 00:31:41,460 --> 00:31:49,980 Kui oleme kompileerida programme kasutamiseks GDB, peame kasutama, et erilist-g lipp, 379 00:31:49,980 --> 00:31:54,540 ja see on tehtud vaikimisi, kui sa kompileerida programme, vaid käsuga make 380 00:31:54,540 --> 00:31:59,320 või teha lollakas või muuta tagasi, mõni neist. 381 00:31:59,320 --> 00:32:07,800 Aga kui sa oled koostamise käsitsi rõkkama, siis pead minema ja lisada, et-g lipp. 382 00:32:07,800 --> 00:32:10,310 >> Sel hetkel, nüüd, et meil on meie GDB kiire, 383 00:32:10,310 --> 00:32:12,310 see on üsna lihtne käivitada programmi. 384 00:32:12,310 --> 00:32:19,740 Me tippida kas run, või saame lihtsalt kirjutada r. 385 00:32:19,740 --> 00:32:22,820 Enamik GDB käske saab lühendada. 386 00:32:22,820 --> 00:32:25,940 Tavaliselt ainult ühe või paar kirja, mis on päris kena. 387 00:32:25,940 --> 00:32:30,980 Nii Saad, kui tipite r ja vajuta Enter, mis juhtub? 388 00:32:30,980 --> 00:32:39,390 [Saad] Ma sain SIGSEGV, killustatust süü, ja siis kõik see mitmesugused märgid. 389 00:32:39,390 --> 00:32:43,650 >> Jah. 390 00:32:43,650 --> 00:32:47,990 Nagu me näeme ekraanil kohe ja nagu Saad ütles, 391 00:32:47,990 --> 00:32:53,430 kui me tüüpi katse või r ja vajuta Enter, me ikka sama SEG süü. 392 00:32:53,430 --> 00:32:55,830 Nii et kasutades GDB ei lahenda meie probleemi. 393 00:32:55,830 --> 00:32:59,120 Aga see annab meile mõned mitmesugused märgid, ja selgub, et see mitmesugused märgid 394 00:32:59,120 --> 00:33:03,080 tegelikult ütleb meile kus see toimub. 395 00:33:03,080 --> 00:33:10,680 Sõeluda see natuke, see esimene natuke on funktsioon, kus kõik läheb valesti. 396 00:33:10,680 --> 00:33:20,270 Seal on see __ strcmp_sse4_2, ja see ütleb meile, et see juhtub ka seda pilti 397 00:33:20,270 --> 00:33:29,450 nimetatakse sysdeps/i386, kõik see omakorda paras segadus - kuid rida 254. 398 00:33:29,450 --> 00:33:31,670 See on selline raske sõeluda. Tavaliselt, kui näed selliseid asju, 399 00:33:31,670 --> 00:33:38,770 see tähendab, et see on seg faulting ühes süsteem raamatukogudes. 400 00:33:38,770 --> 00:33:43,220 Nii et midagi pistmist strcmp. Te näinud strcmp enne. 401 00:33:43,220 --> 00:33:52,730 Mitte liiga hull, kuid kas see tähendab, et strcmp on katki või et seal on probleem strcmp? 402 00:33:52,730 --> 00:33:57,110 Mis sa arvad, Alexander? 403 00:33:57,110 --> 00:34:04,890 [Aleksandr] Kas see on - on 254 rida? Ja - mitte binaarne, kuid see ei ole nende laed, 404 00:34:04,890 --> 00:34:10,590 ja siis seal on muus keeles iga funktsiooni. Kas see 254, et funktsioon, või -? 405 00:34:10,590 --> 00:34:21,460 >> See on liin 254. Tundub selles. Toimikule, nii et see on koost kood ilmselt. 406 00:34:21,460 --> 00:34:25,949 >> Aga ma arvan, pakilisemaks asi on, sest me oleme saanud SEG süü, 407 00:34:25,949 --> 00:34:29,960 ja tundub, et see on pärit strcmp funktsioon, 408 00:34:29,960 --> 00:34:38,030 tähendab see siis, et strcmp on katki? 409 00:34:38,030 --> 00:34:42,290 See ei tohiks loodetavasti. Nii lihtsalt, sest sa oled killustatust süü 410 00:34:42,290 --> 00:34:49,480 ühes süsteem toimib, tavaliselt see tähendab, et sa lihtsalt ei kutsunud seda õigesti. 411 00:34:49,480 --> 00:34:52,440 Kiireim asi, mida teha, et aru saada, mis tegelikult toimub 412 00:34:52,440 --> 00:34:55,500 kui sa näed midagi hullu nagu see, kui sa näed SEG süü, 413 00:34:55,500 --> 00:34:59,800 eriti kui teil on programm, mis on kasutades midagi enamat kui lihtsalt põhiline, 414 00:34:59,800 --> 00:35:03,570 on kasutada tagasijälitust. 415 00:35:03,570 --> 00:35:13,080 Ma lühendada tagasijälitust kirjutades BT, mitte täis tagasijälitust sõna. 416 00:35:13,080 --> 00:35:16,510 Aga Charlotte, mis juhtub, kui tipite bt ja vajuta Enter? 417 00:35:16,510 --> 00:35:23,200 [Charlotte] See näitab mulle kaks rida, rida 0 ja rida 1. 418 00:35:23,200 --> 00:35:26,150 >> Jah. Nii rida 0 ja rida 1. 419 00:35:26,150 --> 00:35:34,560 Need on tegelikud korstnat raamid, mis olid praegu mängu, kui teie programm jooksis kokku. 420 00:35:34,560 --> 00:35:42,230 Alates tähtsaim raam, raam 0, ja läheb kõige alumisel, mis on frame 1. 421 00:35:42,230 --> 00:35:45,140 Meie tähtsaim raam on strcmp raam. 422 00:35:45,140 --> 00:35:50,080 Sa ei mõtle seda kui sarnane probleem me lihtsalt teeme viktoriin suunanäitajaks, 423 00:35:50,080 --> 00:35:54,890 kus meil oli vahetada freimi peal peamised freimi, 424 00:35:54,890 --> 00:35:59,700 ja meil oli muutujate et vahetuslepingu kasutades peal muutujate et peamine oli kasutades. 425 00:35:59,700 --> 00:36:08,440 Siin meie crash juhtus meie strcmp funktsioon, millele kutsuti Meie peamine funktsioon, 426 00:36:08,440 --> 00:36:14,370 ja tagasijälitust annab meile mitte ainult funktsioone, kus asjad ei õnnestunud, 427 00:36:14,370 --> 00:36:16,440 aga see on ka ütleb meile kus kõik oli välja kutsutud. 428 00:36:16,440 --> 00:36:18,830 Nii et kui ma leidke üle veidi rohkem paremale, 429 00:36:18,830 --> 00:36:26,110 näeme, et jah, me olime line 254 see strcmp-sse4.s faili. 430 00:36:26,110 --> 00:36:32,540 Aga kõne oli tehtud buggy1.c, rida 6. 431 00:36:32,540 --> 00:36:35,960 See tähendab, me saame teha - on meil võimalik lihtsalt minge vaadake ja vaadake, mis toimub 432 00:36:35,960 --> 00:36:39,930 kell buggy1.c, rida 6. 433 00:36:39,930 --> 00:36:43,780 Jällegi on paar võimalust seda teha. Üks on väljuda GDB 434 00:36:43,780 --> 00:36:49,460 või on teie kood avaneb teises aknas ja ristviidetega. 435 00:36:49,460 --> 00:36:54,740 See, ja iseenesest on päris mugav, sest nüüd, kui sa oled tööaega 436 00:36:54,740 --> 00:36:57,220 ja sul SEG süü ja oma TF inimest ei tea, kus kõik oli purustamine, 437 00:36:57,220 --> 00:36:59,710 võid lihtsalt öelda: "Oh, rida 6. Ma ei tea, mis toimub, 438 00:36:59,710 --> 00:37:03,670 kuid midagi rida 6 põhjustab minu programm murda. " 439 00:37:03,670 --> 00:37:10,430 Teine viis seda teha on saate selle käsu nimeks nimekiri GDB. 440 00:37:10,430 --> 00:37:13,650 Võite lühendada seda l. 441 00:37:13,650 --> 00:37:18,910 Nii et kui me tabanud l, mis me saame siin? 442 00:37:18,910 --> 00:37:21,160 Me saame terve hulk veidraid asju. 443 00:37:21,160 --> 00:37:26,030 See on tegelik montaaž kood 444 00:37:26,030 --> 00:37:29,860 mis on strcmp_sse4_2. 445 00:37:29,860 --> 00:37:32,440 See näeb välja selline funky, 446 00:37:32,440 --> 00:37:36,520 ja miks me hakkame seda sellepärast kohe, 447 00:37:36,520 --> 00:37:40,160 GDB on meid raam 0. 448 00:37:40,160 --> 00:37:43,070 >> Nii et millal me vaatame muutujad, igal ajal vaatame lähtekoodi, 449 00:37:43,070 --> 00:37:50,530 me vaatame lähtekoodi, mis puudutab freimi me oleme praegu sisse 450 00:37:50,530 --> 00:37:53,200 Nii et saada midagi sisukat, peame 451 00:37:53,200 --> 00:37:57,070 liikuda freimi et mõttekam. 452 00:37:57,070 --> 00:38:00,180 Sel juhul peamine freimi oleks veidi rohkem mõistust, 453 00:38:00,180 --> 00:38:02,680 sest see oli tegelikult kood, mis on kirja pandud. 454 00:38:02,680 --> 00:38:05,330 Ei strcmp kood. 455 00:38:05,330 --> 00:38:08,650 Nii saate liikuda raamide vahel, antud juhul, sest meil on kaks, 456 00:38:08,650 --> 00:38:10,430 meil on 0 ja 1, 457 00:38:10,430 --> 00:38:13,650 Sa teed seda üles ja alla käske. 458 00:38:13,650 --> 00:38:18,480 Kui ma liikuda ühe raami, 459 00:38:18,480 --> 00:38:21,770 nüüd ma olen peamine freimi. 460 00:38:21,770 --> 00:38:24,330 Ma ei liiguta alla minna tagasi sinna, kus ma olin, 461 00:38:24,330 --> 00:38:32,830 tõusevad jälle, minna uuesti ja minge uuesti. 462 00:38:32,830 --> 00:38:39,750 Kui te kunagi teha oma programmi GDB, saad crash, saad tagasijälituse 463 00:38:39,750 --> 00:38:42,380 ja te näete, et see on mõne faili, et sa ei tea, mis toimub. 464 00:38:42,380 --> 00:38:45,460 Sa püüad nimekirja, kood ei tundu sulle tuttav, 465 00:38:45,460 --> 00:38:48,150 kui heita pilk oma raamid ja aru saada, kus sa oled. 466 00:38:48,150 --> 00:38:51,010 Sa oled ilmselt vales freimi. 467 00:38:51,010 --> 00:38:58,760 Või vähemalt sa oled freimi, mis ei ole üks, et saate tegelikult siluda. 468 00:38:58,760 --> 00:39:03,110 Nüüd, kui me oleme asjakohane freimi, me oleme pea-, 469 00:39:03,110 --> 00:39:08,100 nüüd saame kasutada nimekirja käsk välja mõelda, mida liin oli. 470 00:39:08,100 --> 00:39:13,590 Ja te näete seda, see trükitud on meie jaoks siin. 471 00:39:13,590 --> 00:39:19,470 Kuid me ei tabanud loetleda kõik sama, ja loetelu annab meile selle kena väljatrükk 472 00:39:19,470 --> 00:39:23,920 tegeliku lähtekoodi, mis toimub siin. 473 00:39:23,920 --> 00:39:26,420 >> Eelkõige saame vaadata rida 6. 474 00:39:26,420 --> 00:39:29,330 Saame näha, mis siin toimub. 475 00:39:29,330 --> 00:39:31,250 Ja tundub, et me teeme sõnede 476 00:39:31,250 --> 00:39:41,050 vahel string "CS50 kivid" ja argv [1]. 477 00:39:41,050 --> 00:39:45,700 Midagi see oli krahh. 478 00:39:45,700 --> 00:39:54,120 Nii Missy, kas teil on mõtteid, mida võiks siin toimub? 479 00:39:54,120 --> 00:39:59,400 [Missy] Ma ei tea, miks see on krahh. >> Sa ei tea, miks see on krahh? 480 00:39:59,400 --> 00:40:02,700 Jimmy, kõik mõtted? 481 00:40:02,700 --> 00:40:06,240 [Jimmy] Ma pole päris kindel, aga viimane kord, kui me kasutada string võrrelda 482 00:40:06,240 --> 00:40:10,260 või strcmp, meil oli nagu kolm erinevat juhtumit kohaselt. 483 00:40:10,260 --> 00:40:12,800 Meil ei olnud ==, ma ei usu, õigus, et esimene rida. 484 00:40:12,800 --> 00:40:16,700 Selle asemel oli jagatud kolme, ja üks oli == 0, 485 00:40:16,700 --> 00:40:19,910 üks oli <0, ma arvan, ja üks oli> 0. 486 00:40:19,910 --> 00:40:22,590 Nii et äkki midagi sellist? >> Jah. Nii et see küsimus 487 00:40:22,590 --> 00:40:27,200 ja me teeme võrdluse õigesti? 488 00:40:27,200 --> 00:40:31,660 Stella? Kõik mõtted? 489 00:40:31,660 --> 00:40:38,110 [Stella] Ma pole kindel. >> Ei tea. Daniel? Mõtted? Okei. 490 00:40:38,110 --> 00:40:44,770 Tuleb välja, mis toimub just siin on, kui me jooksime programmi 491 00:40:44,770 --> 00:40:48,370 ja me saime SEG süü, kui sa jooksid programmi esmakordselt, Daniel, 492 00:40:48,370 --> 00:40:50,800 sa anna see mingeid käsurea argumente? 493 00:40:50,800 --> 00:40:58,420 [Daniel] No >> Ei Sel juhul, milline on väärtus argv [1]? 494 00:40:58,420 --> 00:41:00,920 >> Ei ole väärtus. >> Õigus. 495 00:41:00,920 --> 00:41:06,120 Noh, ei ole asjakohane stringi väärtus. 496 00:41:06,120 --> 00:41:10,780 Aga seal on mingi väärtus. Mis on väärtus, mida saab ladustada seal? 497 00:41:10,780 --> 00:41:15,130 >> Prügi väärtus? >> See on kas prügi väärtus või, sel juhul 498 00:41:15,130 --> 00:41:19,930 aasta lõpuks argv array alati lõpetada null. 499 00:41:19,930 --> 00:41:26,050 Mis siis tegelikult sai salvestatud on null. 500 00:41:26,050 --> 00:41:30,810 Teine viis seda lahendada, mitte mõelda läbi, 501 00:41:30,810 --> 00:41:33,420 on printige see välja. 502 00:41:33,420 --> 00:41:35,880 See on koht, kus ma ütlesin, et kasutades GDB on suur, 503 00:41:35,880 --> 00:41:40,640 sest saad välja printida kõik muutujad, kõik väärtused, mida soovite 504 00:41:40,640 --> 00:41:43,230 kasutades seda mugav-dändi lk käsk. 505 00:41:43,230 --> 00:41:48,520 Nii et kui ma tüüpi p ja siis ma tippige väärtus muutuja või nimi muutuja, 506 00:41:48,520 --> 00:41:55,320 öelda, argc, ma näen, et argc 1. 507 00:41:55,320 --> 00:42:01,830 Kui ma tahan välja printida argv [0], võin seda teha just niimoodi. 508 00:42:01,830 --> 00:42:04,840 Ja nagu me nägime, argv [0] on alati oma programmi nime, 509 00:42:04,840 --> 00:42:06,910 alati täitmisfaili nimi. 510 00:42:06,910 --> 00:42:09,740 Siin näed see sai täis tee nime. 511 00:42:09,740 --> 00:42:15,920 Võin ka välja printida argv [1] ja vaata, mis juhtub. 512 00:42:15,920 --> 00:42:20,890 >> Siin saime selline müstiline väärtus. 513 00:42:20,890 --> 00:42:23,890 Meil on see 0x0. 514 00:42:23,890 --> 00:42:27,850 Mäleta alguses perspektiivis, kui me rääkisime kuuteistkümnendnumbriga? 515 00:42:27,850 --> 00:42:34,680 Või et vähe küsimuse lõpus pset 0 kuidas esindavad 50 kuueteistkümnendsüsteemis? 516 00:42:34,680 --> 00:42:39,410 Kuidas me kirjutame hex numbrid CS, lihtsalt ajage end 517 00:42:39,410 --> 00:42:46,080 koos kümnendkraadides, on meil alati eesliide neid 0x. 518 00:42:46,080 --> 00:42:51,420 Nii et see 0X alati tähendab lihtsalt tõlgendama järgmist numbrit kuueteistkümnendarvuna, 519 00:42:51,420 --> 00:42:57,400 ei ole nii string, mitte kümnendmurruna, mitte binaarne number. 520 00:42:57,400 --> 00:43:02,820 Kuna kohtade arv 5-0 on kehtiv number kuueteistkümnendsüsteemis. 521 00:43:02,820 --> 00:43:06,240 Ja see number kümnendsüsteemis, 50. 522 00:43:06,240 --> 00:43:10,050 Nii et see on lihtsalt kuidas me disambiguate. 523 00:43:10,050 --> 00:43:14,860 Nii 0x0 tähendab kuueteistkümnendsüsteemi 0, mis on ka koma 0, binaarne 0. 524 00:43:14,860 --> 00:43:17,030 See on lihtsalt väärtus 0. 525 00:43:17,030 --> 00:43:22,630 Selgub, et see on see, mis null on, tegelikult mällu. 526 00:43:22,630 --> 00:43:25,940 Null on lihtsalt 0. 527 00:43:25,940 --> 00:43:37,010 Siin element hoida argv [1] on null. 528 00:43:37,010 --> 00:43:45,220 Nii me üritame võrrelda meie "CS50 kivid" string null string. 529 00:43:45,220 --> 00:43:48,130 Nii viite mahavõtmine null, üritavad pääseda asju null, 530 00:43:48,130 --> 00:43:55,050 need on tavaliselt läheb põhjustada mingi killustatust süü või muude halbu asju juhtuda. 531 00:43:55,050 --> 00:43:59,350 Ja selgub, et strcmp ei vaadata 532 00:43:59,350 --> 00:44:04,340 kas olete sooritanud väärtus, mis on null. 533 00:44:04,340 --> 00:44:06,370 Pigem on see lihtsalt läheb edasi, püüab teha oma asja, 534 00:44:06,370 --> 00:44:14,640 ja kui see seg vigu, see seg vead, ja see on sinu probleem. Sa pead minema seda parandada. 535 00:44:14,640 --> 00:44:19,730 Tõesti kiiresti, kuidas võiks meil probleemi lahendada? Charlotte? 536 00:44:19,730 --> 00:44:23,540 [Charlotte] Saate vaadata kasutades kui. 537 00:44:23,540 --> 00:44:32,240 Nii et kui argv [1] on null, == 0, siis return 1, või midagi [arusaamatu]. 538 00:44:32,240 --> 00:44:34,590 >> Jah. Nii et see on üks suurepärane võimalus seda teha, kui me saame vaadata, 539 00:44:34,590 --> 00:44:39,230 väärtus me parasjagu lähevad strcmp, argv [1], on see tühjaks? 540 00:44:39,230 --> 00:44:45,830 Kui see on null, siis võib öelda, okei, katkestan. 541 00:44:45,830 --> 00:44:49,450 >> Rohkem levinum viis seda teha on kasutada argc väärtus. 542 00:44:49,450 --> 00:44:52,040 Näete siin alguses peamine, 543 00:44:52,040 --> 00:44:58,040 me jätta, et esimese katse, et me tavaliselt teeme, kui meil kasutada käsurea argumente, 544 00:44:58,040 --> 00:45:05,240 mis on katsetada, kas meie argc väärtus on see, mida me ootame. 545 00:45:05,240 --> 00:45:10,290 Sel juhul me ootame vähemalt kaks argumenti, 546 00:45:10,290 --> 00:45:13,660 programmi nimi pluss mõni teine. 547 00:45:13,660 --> 00:45:17,140 Sest me oleme umbes kasutada teist argumenti siin. 548 00:45:17,140 --> 00:45:21,350 Nii et kellel mingi test eelnevalt, enne meie strcmp kõne 549 00:45:21,350 --> 00:45:37,390 et testid kas argv on vähemalt 2, oleks ka teha sama asi. 550 00:45:37,390 --> 00:45:40,620 Saame näha, kas see toimib töötab programm uuesti. 551 00:45:40,620 --> 00:45:45,610 Võite alati taaskäivitada programmi raames GDB, mis on tõesti kena. 552 00:45:45,610 --> 00:45:49,310 Võite käivitada, ja kui te kaotate argumenteerides oma programmi, 553 00:45:49,310 --> 00:45:53,060 te kaotate neid kui helistate joosta, mitte siis, kui sa boot up GDB. 554 00:45:53,060 --> 00:45:57,120 Nii saate hoida tuginedes oma programmi erinevate argumentide iga kord. 555 00:45:57,120 --> 00:46:08,080 Nii joosta, või jälle, ma ei kirjuta r, ja vaatame, mis juhtub, kui me kirjutame "tere". 556 00:46:08,080 --> 00:46:11,140 Ta on alati küsida, kas te soovite alustada seda algusest peale uuesti. 557 00:46:11,140 --> 00:46:17,490 Tavaliselt sa ei taha alustada seda algusest peale uuesti. 558 00:46:17,490 --> 00:46:25,010 Ja sel hetkel, see taaskäivitub uuesti, siis prindib välja 559 00:46:25,010 --> 00:46:28,920 programm, mis meil töötab, buggy1, väitega, tere, 560 00:46:28,920 --> 00:46:32,720 ja ta prindib selle standardi välja, see ütleb: "Sa saad D," kurb nägu. 561 00:46:32,720 --> 00:46:37,610 Aga me ei seg süü. Ta ütles, et protsessi lahkus tavaliselt. 562 00:46:37,610 --> 00:46:39,900 Nii et tundub päris hea. 563 00:46:39,900 --> 00:46:43,050 Enam SEG süü, me tegime seda minevikus, 564 00:46:43,050 --> 00:46:48,190 nii tundub see oligi SEG süü bug, et me ei saada. 565 00:46:48,190 --> 00:46:51,540 Kahjuks see ütleb meile, et me saada D. 566 00:46:51,540 --> 00:46:54,090 >> Me ei saa minna tagasi ja vaadata koodi ja vaata, mis siin toimub 567 00:46:54,090 --> 00:46:57,980 aru saada, mis oli - miks ta rääkis meile, et me saime D. 568 00:46:57,980 --> 00:47:03,690 Vaatame, siin oli see printf öeldes, et sul D. 569 00:47:03,690 --> 00:47:08,540 Kui me kirjutame nimekirja, nagu te hoida kirjutades nimekiri, see hoiab itereerimise allapoole läbi oma programmi, 570 00:47:08,540 --> 00:47:10,940 seega näitan sulle paar esimest rida oma programmi. 571 00:47:10,940 --> 00:47:15,450 Siis näitan sulle paari rida ja järgmine patakas ja järgmise tüki. 572 00:47:15,450 --> 00:47:18,240 Ja see üritame edasi minna. 573 00:47:18,240 --> 00:47:21,180 Ja nüüd me jõuame "liin number 16 on väljaspool lubatud piire." 574 00:47:21,180 --> 00:47:23,940 Sest see on ainult 15 rida. 575 00:47:23,940 --> 00:47:30,310 Kui sa saad selle punkti ja teie ei tea, "Mida teha?" saate aidata käsk. 576 00:47:30,310 --> 00:47:34,340 Kasutage aidata ja anda sellele nime käsk. 577 00:47:34,340 --> 00:47:36,460 Ja näed GDB annab meile kõigile sedasorti kraam. 578 00:47:36,460 --> 00:47:43,870 See ütleb: "Kellel ei ole argument, loetletakse kümme rida pärast või umbes eelmise noteerimist. 579 00:47:43,870 --> 00:47:47,920 Nimekiri - loetleb kümme rida enne - " 580 00:47:47,920 --> 00:47:52,960 Nii et proovime kasutades nimekiri miinus. 581 00:47:52,960 --> 00:47:57,000 Ja mis loetleb 10 rida eelmine; saate mängida nimekiri natuke. 582 00:47:57,000 --> 00:48:02,330 Võite teha nimekirja, nimekiri -, siis võib isegi anda loetleda, nagu nimekiri 8, 583 00:48:02,330 --> 00:48:07,500 ja see saab nimekirja 10 rida umbes rida 8. 584 00:48:07,500 --> 00:48:10,290 Ja näed, mis siin toimub on sul lihtne kui teine. 585 00:48:10,290 --> 00:48:13,980 Kui kirjutad CS50 kaljud, see prindib välja "Sa saad A." 586 00:48:13,980 --> 00:48:16,530 Muidu prindib välja "Sa saad D." 587 00:48:16,530 --> 00:48:23,770 Jama linn. Hea küll. Jah? 588 00:48:23,770 --> 00:48:26,730 >> [Daniel] Nii et kui ma proovinud teha CS50 kivid ilma jutumärkideta, 589 00:48:26,730 --> 00:48:29,290 ta ütleb: "Sa saad D." 590 00:48:29,290 --> 00:48:32,560 Mul oli vaja hinnapakkumisi saan seda teha, siis miks see nii on? 591 00:48:32,560 --> 00:48:38,490 >> Jah. Selgub, et kui - see on üks lõbus vähe tidbit - 592 00:48:38,490 --> 00:48:47,900 kui käivitate programmi, kui võtame seda ja me kirjuta CS50 kivid, 593 00:48:47,900 --> 00:48:50,800 nagu Daniel ütles ta tegi, ja vajutad Enter, 594 00:48:50,800 --> 00:48:52,870 see ikka ütleb, saame D. 595 00:48:52,870 --> 00:48:55,580 Ja küsimus on, miks see nii on? 596 00:48:55,580 --> 00:49:02,120 Ja selgub, et nii meie terminali ja GDB sõeluda need kahe eraldi argumendid. 597 00:49:02,120 --> 00:49:04,800 Sest kui seal on ruumi, et vaikiv kui 598 00:49:04,800 --> 00:49:08,730 Esimene argument lõppenud, järgmine väide on algamas. 599 00:49:08,730 --> 00:49:13,260 Kuidas ühendada need kaheks või kahju, ühte argumenti, 600 00:49:13,260 --> 00:49:18,510 on kasutada hinnapakkumisi. 601 00:49:18,510 --> 00:49:29,560 Nii et nüüd, kui me pane see hinnapakkumisi ja käivitage see uuesti, saame A. 602 00:49:29,560 --> 00:49:38,780 Nii lihtsalt sulgege, ilma jutumärkideta, CS50 ja kivimid sõeluda kahe eraldi argumendid. 603 00:49:38,780 --> 00:49:45,320 Mis hinnapakkumisi, see on sõeluda ühe argumendina kokku. 604 00:49:45,320 --> 00:49:53,070 >> Me näeme seda murdepunkti. 605 00:49:53,070 --> 00:49:54,920 Siiani oleme käinud meie programm ja see on kestnud 606 00:49:54,920 --> 00:49:58,230 kuni kas see seg vead või tabamust viga 607 00:49:58,230 --> 00:50:05,930 või kuni ta lahkus ja kõik on täiesti korras. 608 00:50:05,930 --> 00:50:08,360 See ei ole tingimata kõige kasulikum asi, sest mõnikord 609 00:50:08,360 --> 00:50:11,840 teil viga oma programmi, kuid see ei põhjusta killustatust süü. 610 00:50:11,840 --> 00:50:16,950 See ei põhjusta oma programmi lõpetada või midagi sellist. 611 00:50:16,950 --> 00:50:20,730 Võimalus saada GDB peatada oma programmi kindla punkti 612 00:50:20,730 --> 00:50:23,260 on määrata murdepunkti. 613 00:50:23,260 --> 00:50:26,520 Võite seda teha, luues katkestuspunkti funktsiooni nimi 614 00:50:26,520 --> 00:50:30,770 või saate määrata murdepunkti konkreetse rida koodi. 615 00:50:30,770 --> 00:50:34,450 Mulle meeldib seada katkestuspunkte funktsioonide nimed, sest - lihtne meeles pidada, 616 00:50:34,450 --> 00:50:37,700 ja kui te tegelikult minema ja muuta oma lähtekoodi kuni natuke, 617 00:50:37,700 --> 00:50:42,020 siis oma murdepunkti tegelikult peatuda sama koht oma koodi. 618 00:50:42,020 --> 00:50:44,760 Arvestades, kui te kasutate rida numbreid ja reanumbrite muuta 619 00:50:44,760 --> 00:50:51,740 sest sa lisada või kustutada mingi kood, siis oma murdepunktid on kõik täiesti silmamunad. 620 00:50:51,740 --> 00:50:58,590 Üks kõige tavalisemaid asju, mida ma tegema, on määrata murdepunkti kohta põhiülesanne. 621 00:50:58,590 --> 00:51:05,300 Tihti ma käivitamisel GDB, ma Tüüp B peamine, Enter, ja et paned murdepunkti 622 00:51:05,300 --> 00:51:10,630 aasta põhiülesandeks mis lihtsalt ütleb, "Paus programmi niipea kui hakatakse," 623 00:51:10,630 --> 00:51:17,960 ja nii, kui ma saan oma programmi, ütlevad, CS50 kivid nagu kaks argumenti 624 00:51:17,960 --> 00:51:24,830 ja vajuta Enter, see jõuab põhiülesanne ja see peatub on kõige esimene rida, 625 00:51:24,830 --> 00:51:30,620 Vahetult enne seda hindab strcmp funktsioon. 626 00:51:30,620 --> 00:51:34,940 >> Kuna ma peatatud, nüüd saan hakata mucking ringi ja näeme, mis toimub 627 00:51:34,940 --> 00:51:40,250 kõik eri muutujaid on läinud minu programm. 628 00:51:40,250 --> 00:51:43,670 Siin võin välja printida argc ja vaata mis toimub. 629 00:51:43,670 --> 00:51:50,030 Vaadake, et argc on 3, sest see on 3 erinevaid väärtusi ta. 630 00:51:50,030 --> 00:51:54,060 See ju programmi nime, see sai esimene argument ja teine ​​argument. 631 00:51:54,060 --> 00:52:09,330 Me ei saa printida need välja vaadates argv [0], argv [1] argv [2]. 632 00:52:09,330 --> 00:52:12,030 Nüüd saate ka aru, miks see strcmp kõne läheb pankrotti minna, 633 00:52:12,030 --> 00:52:21,650 sest te näete, et ta ei lahku CS50 ja kivid kaheks eraldi argumendid. 634 00:52:21,650 --> 00:52:27,250 Sel hetkel, kui olete tabanud murdepunkti, võite jätkata sammult läbi oma programmi 635 00:52:27,250 --> 00:52:32,920 rida-realt, mitte alustada oma programmi uuesti. 636 00:52:32,920 --> 00:52:35,520 Nii et kui te ei taha, et alustada oma programmi uuesti ja jätkake edasi siit, 637 00:52:35,520 --> 00:52:41,970 saate jätkamisnupu käsu ja jätkuvalt kestab programm kuni lõpuni. 638 00:52:41,970 --> 00:52:45,010 Just nagu ta tegi siin. 639 00:52:45,010 --> 00:52:54,880 Samas, kui ma taaskäivitage programm, CS50 kaljud, see tabab mu murdepunkti uuesti, 640 00:52:54,880 --> 00:52:59,670 ja seekord, kui ma ei taha lihtsalt minna kogu tee läbi ülejäänud programmi 641 00:52:59,670 --> 00:53:08,040 Oskan kasutada järgmise käsu, mida ma ka lühendada n. 642 00:53:08,040 --> 00:53:12,960 Ja see sammult läbi programmi rida-realt. 643 00:53:12,960 --> 00:53:17,530 Nii saab vaadata, kui asjad teostada, kui muutujate muutused, nagu asjad ajakohastada. 644 00:53:17,530 --> 00:53:21,550 Milline on päris kena. 645 00:53:21,550 --> 00:53:26,570 Teine lahe asi on mitte korrata sama käsu üle ja ikka ja jälle, 646 00:53:26,570 --> 00:53:30,670 kui sa just Enter - nii siin näete ma ei ole sisestatud midagi - 647 00:53:30,670 --> 00:53:33,780 kui ma lihtsalt Enter, siis korrake eelnevaid käsk, 648 00:53:33,780 --> 00:53:36,900 või eelmise GDB käsk, et ma lihtsalt panna sisse 649 00:53:36,900 --> 00:53:56,000 Ma saan hoida Enterin ja see hoiab astutakse läbi minu koodi rida realt. 650 00:53:56,000 --> 00:53:59,310 Ma kutsun teid poisid minna Tutvu teiste lollakas programmid samuti. 651 00:53:59,310 --> 00:54:01,330 Meil ei ole aega, et saada läbi kõik need täna jaos. 652 00:54:01,330 --> 00:54:05,890 Lähtekood on olemas, nii et saate sellist näha, mis toimub 653 00:54:05,890 --> 00:54:07,730 kulisside taga kui sa tõesti ummikus, 654 00:54:07,730 --> 00:54:11,940 kuid vähemalt, lihtsalt harjutada käivitamist kuni GDB, 655 00:54:11,940 --> 00:54:13,940 töötab programm kuni see puruneb teile, 656 00:54:13,940 --> 00:54:18,260 saada tagasijälituse figuring mida toimida crash oli, 657 00:54:18,260 --> 00:54:24,450 Mis liin see oli, trüki välja mõned muutuja väärtused, 658 00:54:24,450 --> 00:54:30,140 lihtsalt nii saad tunda seda, sest see tõesti aitab teil läheb edasi. 659 00:54:30,140 --> 00:54:36,340 Sel hetkel, me ei kavatse loobuda välja GDB, mis te kasutate loobuda või lihtsalt q. 660 00:54:36,340 --> 00:54:40,460 Kui teie programm on keset töötab ikka, ja see ei ole väljunud, 661 00:54:40,460 --> 00:54:43,510 see alati küsida: "Oled sa kindel, et sa tõesti soovid väljuda?" 662 00:54:43,510 --> 00:54:48,770 Sa võid tabanud jah. 663 00:54:48,770 --> 00:54:55,250 >> Nüüd läheme vaatame järgmine probleem meil, mis on kass programmi. 664 00:54:55,250 --> 00:54:59,880 Kui te vaatate lühike suunates ja torud, näete, et Tommy kasutab seda programmi 665 00:54:59,880 --> 00:55:07,540 et põhimõtteliselt prindib kõik väljund faili ekraanil. 666 00:55:07,540 --> 00:55:12,660 Nii et kui ma saan kassi, see on tegelikult sisseehitatud programmi aparaat, 667 00:55:12,660 --> 00:55:16,860 ja kui sul on Mac, mida saate teha seda Mac liiga, kui te avada terminal. 668 00:55:16,860 --> 00:55:25,630 Ja meil - Kass, oletame, cp.c ja vajuta Enter. 669 00:55:25,630 --> 00:55:29,640 Mis see oli, kui me liikuge üles natuke ja vaadake, kus me jooksime liin, 670 00:55:29,640 --> 00:55:40,440 või kui me jooksime kass käsu, siis sõna otseses mõttes lihtsalt välja printida sisu cp.c meie ekraanil. 671 00:55:40,440 --> 00:55:44,140 Me võime kasutada seda uuesti ja saab panna mitu faili korraga. 672 00:55:44,140 --> 00:55:49,880 Nii saate teha kass cp.c, ja siis saame ka concatenate cat.c faili 673 00:55:49,880 --> 00:55:53,250 mis on programmi me parasjagu kirjutan, 674 00:55:53,250 --> 00:55:58,140 ja see saab printida nii faile seljad meie ekraanil. 675 00:55:58,140 --> 00:56:05,490 Nii et kui me liikuge üles natuke, näeme, et kui me jooksime sellele kassile cp.c, cat.c, 676 00:56:05,490 --> 00:56:17,110 kõigepealt välja trükkida cp fail ja seejärel allapoole, see välja trükkida cat.c faili siinsamas. 677 00:56:17,110 --> 00:56:19,650 Me ei kavatse kasutada seda lihtsalt saada meie jalad märjaks. 678 00:56:19,650 --> 00:56:25,930 Mängida lihtne trükkimine terminali, kuidas see toimib. 679 00:56:25,930 --> 00:56:39,170 Kui te avada koos gedit cat.c, Enter, 680 00:56:39,170 --> 00:56:43,760 näete programm, mis me parasjagu kirjutad. 681 00:56:43,760 --> 00:56:48,980 Lisasime seda kena boiler plaat, nii et me ei pea kulutama aega kirjutades kõik läbi. 682 00:56:48,980 --> 00:56:52,310 Samuti kontrollida argumentide arv möödunud sisse 683 00:56:52,310 --> 00:56:56,910 Trükime välja kena kasutamise õpetust. 684 00:56:56,910 --> 00:57:00,950 >> See on selline asi, et jälle, nagu me oleme rääkinud, 685 00:57:00,950 --> 00:57:04,490 see on peaaegu nagu lihaste mälu. 686 00:57:04,490 --> 00:57:07,190 Pea meeles pidama teevad sama sorti kraami 687 00:57:07,190 --> 00:57:11,310 ja alati printida mingi kasulik sõnum 688 00:57:11,310 --> 00:57:17,670 et inimesed teaksid, kuidas käivitada oma programmi. 689 00:57:17,670 --> 00:57:21,630 Mis kass, see on üsna lihtne, me lihtsalt läheb minema läbi kõik erinevad argumendid 690 00:57:21,630 --> 00:57:24,300 et võeti vastu meie programmi, ja me lähme välja printida 691 00:57:24,300 --> 00:57:29,950 nende sisu läbi ekraani ühe korraga. 692 00:57:29,950 --> 00:57:35,670 Et printida faile välja ekraan, me teeme midagi väga sarnast 693 00:57:35,670 --> 00:57:38,120 mida me tegime lõpus viktoriin. 694 00:57:38,120 --> 00:57:45,350 Lõpus viktoriin, et palgata programmi, oli meil avada faili 695 00:57:45,350 --> 00:57:48,490 ja siis me pidime printida. 696 00:57:48,490 --> 00:57:54,660 Sel juhul me ei kavatse avada fail ja me ei kavatse lugeda tema asemel. 697 00:57:54,660 --> 00:58:00,630 Siis me lähme välja printida, selle asemel et faili, me ei kavatse printida ekraanil. 698 00:58:00,630 --> 00:58:05,830 Nii trükkimine ekraanile olete kõik teinud enne koos printf. 699 00:58:05,830 --> 00:58:08,290 Nii et ei ole liiga hull. 700 00:58:08,290 --> 00:58:12,190 Aga lugemine fail on kuidagi imelik. 701 00:58:12,190 --> 00:58:17,300 Me läheme läbi, et natuke korraga. 702 00:58:17,300 --> 00:58:20,560 Kui te minna tagasi, et viimane probleem oma viktoriin, probleem 33 703 00:58:20,560 --> 00:58:27,280 Esimene rida, et me teeme siin, failide avamisega, on väga sarnane sellega, mida me seal tegime. 704 00:58:27,280 --> 00:58:36,370 Nii Stella, mida see rida välja nägema, kui me avame faili? 705 00:58:36,370 --> 00:58:47,510 [Stella] Capital FILE *, faili - >> Okei. >> - On võrdne fopen. >> Yup. 706 00:58:47,510 --> 00:58:55,980 Milline on sel juhul? See on kommentaari. 707 00:58:55,980 --> 00:59:06,930 >> See on kommentaar? argv [i] ja r? 708 00:59:06,930 --> 00:59:11,300 >> Täpselt. Väga hea. Nii Stella on täiesti õigus. 709 00:59:11,300 --> 00:59:13,720 See on see, mida joon välja näeb. 710 00:59:13,720 --> 00:59:19,670 Me ei hakka faili oja muutuja, siis hoia teda FILE *, nii et kõik mütsid, 711 00:59:19,670 --> 00:59:25,720 FAIL, *, ja nime see muutuja on fail. 712 00:59:25,720 --> 00:59:32,250 Me võiksime seda nimetada mida iganes me tahame. Me võiksime seda nimetada first_file või file_i, mida me tahaksime. 713 00:59:32,250 --> 00:59:37,590 Ja siis faili nimi oli möödunud aastal, kui anda käsureal antud programmi. 714 00:59:37,590 --> 00:59:44,450 Nii et see on salvestatud argv [i,] ja siis me läheme, et avada see fail lugeda režiimis. 715 00:59:44,450 --> 00:59:48,100 Nüüd, kui oleme avanud faili, mis on asi, mida me peame alati meeles pidama, mida teha 716 00:59:48,100 --> 00:59:52,230 kui oleme avanud faili? Sule ta. 717 00:59:52,230 --> 00:59:57,220 Nii Missy, kuidas me sulgeda fail? 718 00:59:57,220 --> 01:00:01,020 [Missy] kirjutamisel (fail) >> kirjutamisel (fail). Täpselt. 719 01:00:01,020 --> 01:00:05,340 Suur. Okei. Kui me vaatame seda tegema kommentaar siin, 720 01:00:05,340 --> 01:00:11,940 ta ütleb, "Avatud argv [i] ja printida oma sisu standardväljundisse." 721 01:00:11,940 --> 01:00:15,460 >> Standard läbi on imelik nimi. Stdout on lihtsalt meie viis öelda 722 01:00:15,460 --> 01:00:22,880 tahame seda trükkida terminali; me tahame prindi see standard väljund vool. 723 01:00:22,880 --> 01:00:26,450 Me ei saa tegelikult lahti saada see kommentaar siin. 724 01:00:26,450 --> 01:00:36,480 Ma lähen kopeeri see ning kleebi see sest see on, mida me tegime. 725 01:00:36,480 --> 01:00:41,290 Sel hetkel, nüüd on meil lugeda faili vähehaaval. 726 01:00:41,290 --> 01:00:46,300 Me oleme arutanud paar võimalust lugeda faile. 727 01:00:46,300 --> 01:00:51,830 Millised on Sinu lemmikud siiani? 728 01:00:51,830 --> 01:00:57,960 Mis moel olete näinud või kas sa mäletad, lugeda faile? 729 01:00:57,960 --> 01:01:04,870 [Daniel] fread? >> Fread? Nii fread on üks. Jimmy, kas sa tead mis tahes teised? 730 01:01:04,870 --> 01:01:12,150 [Jimmy] No >> Okei. Nope. Charlotte? Alexander? Kõik teised? Okei. 731 01:01:12,150 --> 01:01:20,740 Nii et teised on fgetc, on üks, mis me kasutame palju. 732 01:01:20,740 --> 01:01:26,410 Seal on ka fscanf; te nägite skeemi? 733 01:01:26,410 --> 01:01:29,170 Nad kõik algavad f. Midagi pistmist faili. 734 01:01:29,170 --> 01:01:35,260 Seal on fread, fgetc, fscanf. Need on kõik lugemine ülesandeid. 735 01:01:35,260 --> 01:01:49,120 Kirjutamiseks meil ümbernimetamisel nimega, meil on fputc asemel fgetc. 736 01:01:49,120 --> 01:01:58,250 Meil on ka fprintf meeldib nägime viktoriini. 737 01:01:58,250 --> 01:02:01,680 Kuna see on probleem, mis hõlmab lugemise failist 738 01:02:01,680 --> 01:02:04,940 me ei kavatse kasutada ühte neist kolm funktsiooni. 739 01:02:04,940 --> 01:02:10,890 Me ei kavatse kasutada neid funktsioone siia alla. 740 01:02:10,890 --> 01:02:14,880 Need funktsioonid on kõik leitud standard I / O teek. 741 01:02:14,880 --> 01:02:17,510 Nii et kui te vaatate üles selle programmi, 742 01:02:17,510 --> 01:02:24,110 te näete, et me oleme juba päis faili standard I / O teek. 743 01:02:24,110 --> 01:02:27,120 Kui me tahame aru saada, milline neist tahame kasutada, 744 01:02:27,120 --> 01:02:29,690 saame alati avada mees lehekülge. 745 01:02:29,690 --> 01:02:34,350 Nii saame tüüpi inimene stdio 746 01:02:34,350 --> 01:02:43,180 ja lugeda kõike stdio sisend ja väljund funktsioonid C. 747 01:02:43,180 --> 01:02:49,870 Ja me võime juba näha, oh, vaata. See viitavad fgetc, see viitavad fputc. 748 01:02:49,870 --> 01:02:57,220 Nii saab puurida veidi allapoole ja vaadata, ütleme, fgetc 749 01:02:57,220 --> 01:03:00,060 ja pilk oma meest lehel. 750 01:03:00,060 --> 01:03:03,430 Te näete, et see läheb koos terve hunnik muid funktsioone: 751 01:03:03,430 --> 01:03:12,640 fgetc, fgets, getc, getchar, saab, ungetc ja selle sisend tähemärki ja stringid. 752 01:03:12,640 --> 01:03:19,180 Nii et see on see, kuidas me lugeda märke ja strings faile standardsete sisend, 753 01:03:19,180 --> 01:03:21,990 mis on sisuliselt kasutaja. 754 01:03:21,990 --> 01:03:24,780 Ja see, kuidas me teeme seda tegelikku C. 755 01:03:24,780 --> 01:03:30,850 Nii et see ei kasuta getString ja getchar funktsioonid 756 01:03:30,850 --> 01:03:36,840 et me kasutasime alates CS50 raamatukogu. 757 01:03:36,840 --> 01:03:39,710 Me teeme seda probleemi paar võimalust 758 01:03:39,710 --> 01:03:43,430 nii et näete kahte moodi seda teha. 759 01:03:43,430 --> 01:03:48,490 Nii fread funktsiooni, et Daniel mainitud ja fgetc on hea, kuidas seda teha. 760 01:03:48,490 --> 01:03:53,790 Ma arvan fgetc on veidi lihtsam, sest see on ainult, nagu näete, 761 01:03:53,790 --> 01:03:59,660 üks argument, FILE *, et me üritame lugeda tegelasele, 762 01:03:59,660 --> 01:04:02,740 ja selle tagastatav väärtus on int. 763 01:04:02,740 --> 01:04:05,610 Ja see on natuke segane, eks? 764 01:04:05,610 --> 01:04:11,450 >> Sest me saada iseloomuga, siis miks mitte seda edasi-tagasi char? 765 01:04:11,450 --> 01:04:18,700 Te on mingeid ideid, miks see ei pruugi naasta char? 766 01:04:18,700 --> 01:04:25,510 [Missy vastuseid, arusaamatult] >> Jah. Nii et Missy on täiesti õigus. 767 01:04:25,510 --> 01:04:31,570 Kui see on ASCII, siis see täisarv võiks kaardistada tegelik char. 768 01:04:31,570 --> 01:04:33,520 Võiks olla ASCII, ja see on õige. 769 01:04:33,520 --> 01:04:36,220 See on täpselt, mis toimub. 770 01:04:36,220 --> 01:04:39,190 Me kasutame int lihtsalt kuna see on rohkem bitte. 771 01:04:39,190 --> 01:04:44,750 See on suurem kui char; meie char on ainult 8 bitti, et 1 bait meie 32-bit masinad. 772 01:04:44,750 --> 01:04:48,520 Ja int on kõik 4 baiti väärtuses ruumi. 773 01:04:48,520 --> 01:04:50,940 Ja selgub, et viis fgetc töötab, 774 01:04:50,940 --> 01:04:53,940 kui me keri meie ülevaade sellest inimesest leht natuke, 775 01:04:53,940 --> 01:05:05,000 liikuge kogu tee alla. Selgub, et nad kasutavad seda erilist väärtust nimetatakse EOF. 776 01:05:05,000 --> 01:05:09,640 See on eriline püsiv tagastatav väärtus fgetc funktsioon 777 01:05:09,640 --> 01:05:14,570 kui vajutad faili lõppu või kui teil viga. 778 01:05:14,570 --> 01:05:18,170 Ja selgub, et teha neid võrdlusi EOF õigesti, 779 01:05:18,170 --> 01:05:24,060 sa tahad olla, et pildi hulgal teavet, et teil on int 780 01:05:24,060 --> 01:05:28,420 mitte kasutada char muutuja. 781 01:05:28,420 --> 01:05:32,130 Kuigi fgetc on tegelikult saada tegelasele faili 782 01:05:32,130 --> 01:05:38,450 sa tahad meeles pidada, et see on tagasi midagi, mis on tüüpi int teile. 783 01:05:38,450 --> 01:05:41,360 See ütles, see on üsna lihtne kasutada. 784 01:05:41,360 --> 01:05:44,960 See läheb meile iseloomu; nii et kõik me peame tegema, on hoida küsib faili 785 01:05:44,960 --> 01:05:48,440 "Anna mulle järgmine sümbol ja mulle järgmise sümboli, anna mulle järgmine sümbol" 786 01:05:48,440 --> 01:05:51,400 kuni jõuame faili lõppu. 787 01:05:51,400 --> 01:05:54,730 Ja see tõmbab ühe märgi korraga meie faili 788 01:05:54,730 --> 01:05:56,250 ja siis saame teha mida iganes me tahame seda. 789 01:05:56,250 --> 01:06:00,160 Me võime seda säilitada, saame lisada see nöör, saame printida. 790 01:06:00,160 --> 01:06:04,630 Kas midagi sellist. 791 01:06:04,630 --> 01:06:09,600 >> Suurendamine tagasi välja ja läheb tagasi meie cat.c programmi 792 01:06:09,600 --> 01:06:16,170 kui me ei kavatse kasutada fgetc, 793 01:06:16,170 --> 01:06:21,710 kuidas võiks me läheneme sellele järgmine rida koodi? 794 01:06:21,710 --> 01:06:26,020 Me ei kavatse kasutada - fread teeme midagi veidi teistsugune. 795 01:06:26,020 --> 01:06:32,600 Ja seekord me lihtsalt kavatse kasutada fgetc saada üks täht korraga. 796 01:06:32,600 --> 01:06:40,910 Töödelda kogu fail, mida võiks me peame tegema? 797 01:06:40,910 --> 01:06:44,030 Mitu tegelased on seal fail? 798 01:06:44,030 --> 01:06:47,390 Seal on palju. Nii et sa ilmselt tahad saada üks 799 01:06:47,390 --> 01:06:49,860 ja siis saad teise ja saad teise ja saad teise. 800 01:06:49,860 --> 01:06:53,330 Millist algoritmi sa arvad me võib-olla kasutama siin? 801 01:06:53,330 --> 01:06:55,470 Mis tüüpi -? [Aleksandr] loop? >> Täpselt. 802 01:06:55,470 --> 01:06:57,500 Mõned tüüpi silmus. 803 01:06:57,500 --> 01:07:03,380 Jaoks silmus on tegelikult suur, käesoleval juhul. 804 01:07:03,380 --> 01:07:08,620 Ja nagu sa ütlesid, et see kõlab nagu sa tahad silmus üle kogu faili 805 01:07:08,620 --> 01:07:11,820 saada täht korraga. 806 01:07:11,820 --> 01:07:13,850 Kõik ettepanekud, mida see tunduda? 807 01:07:13,850 --> 01:07:22,090 [Alexander, arusaamatult] 808 01:07:22,090 --> 01:07:30,050 >> Okei, ütle mulle inglise keeles, mida sa üritad teha? [Alexander, arusaamatult] 809 01:07:30,050 --> 01:07:36,270 Nii et antud juhul see kõlab nagu me püüame lihtsalt silmus üle kogu toimikule. 810 01:07:36,270 --> 01:07:45,330 [Aleksandr] Nii et ma > Suurus -? 811 01:07:45,330 --> 01:07:49,290 Ma arvan, et faili suurus, eks? Suurus - we'll lihtsalt kirjutan selle niimoodi. 812 01:07:49,290 --> 01:07:57,470 Suurus Faili praegu, i + +. 813 01:07:57,470 --> 01:08:04,610 Nii tuleb välja, et kuidas sa seda kasutades fgetc, ja see on uus, 814 01:08:04,610 --> 01:08:10,460 on see, et seal ei ole lihtne lihtsalt saada suuri faile 815 01:08:10,460 --> 01:08:16,979 Selle "sizeof" tüüpi ehitada, et olete näinud. 816 01:08:16,979 --> 01:08:20,910 Kui me kasutame, et fgetc funktsioon, me kehtestada mingi 817 01:08:20,910 --> 01:08:29,069 uus, funky süntaksit seda juurutamisega, kui selle asemel just põhilised counter 818 01:08:29,069 --> 01:08:33,920 minna tähemärgi haaval, me ei kavatse tõmmata üks märk korraga, 819 01:08:33,920 --> 01:08:37,120 üks märk korraga, ja seda, kuidas me teame, et me oleme lõpus 820 01:08:37,120 --> 01:08:41,290 ei ole, kui me oleme arvestatakse teatud arvu märke, 821 01:08:41,290 --> 01:08:49,939 aga kui iseloomu me tõmmake see, et erilist faili lõppu iseloomu. 822 01:08:49,939 --> 01:08:58,689 Nii saame seda teha - Ma nimetan seda ahels, ja me ei kavatse vorminda 823 01:08:58,689 --> 01:09:08,050 meie esimene kõne, et saada esimene märk välja faili. 824 01:09:08,050 --> 01:09:14,979 Nii et see osa siin, see ei hakka iseloomu välja fail 825 01:09:14,979 --> 01:09:20,840 ja salvestada see muutuja ch. 826 01:09:20,840 --> 01:09:25,420 Me läheme seda enam teha kuni jõuame faili lõppu, 827 01:09:25,420 --> 01:09:41,170 mis me teeme, tehes katse iseloomu ei ole võrdne, et erilist EOF iseloomu. 828 01:09:41,170 --> 01:09:48,750 Ja siis selle asemel teeme ahels + +, mis lihtsalt juurdekasvu väärtus, 829 01:09:48,750 --> 01:09:52,710 nii et kui me loeme välja fail, kapital, ütleme, 830 01:09:52,710 --> 01:09:56,810 ahels + + annaks meile b, ja siis me saame c ja siis d. 831 01:09:56,810 --> 01:09:59,310 See on selgelt mitte seda, mida me tahame. Mida me tahame siin 832 01:09:59,310 --> 01:10:05,830 Viimasel bit me tahame saada järgmise sümboli failist. 833 01:10:05,830 --> 01:10:09,500 >> Niisiis, kuidas võiks me saada järgmise sümboli failist? 834 01:10:09,500 --> 01:10:13,470 Kuidas me saame esimese märgi failist? 835 01:10:13,470 --> 01:10:17,200 [Student] fgetfile? >> Fgetc, või, vabandust, sa olid täiesti õigus. 836 01:10:17,200 --> 01:10:20,470 Ma kirjavigadega seda seal. Nii et jah. 837 01:10:20,470 --> 01:10:26,240 Siin asemel teeb ahels + +, 838 01:10:26,240 --> 01:10:29,560 me lihtsalt läheb helistada fgetc (faili) uuesti 839 01:10:29,560 --> 01:10:39,180 ja salvesta tulemus meie samasse ahels muutuja. 840 01:10:39,180 --> 01:10:43,730 [Student küsimus, arusaamatult] 841 01:10:43,730 --> 01:10:52,390 >> See on koht, kus need FILE * mehed on eriline. 842 01:10:52,390 --> 01:10:59,070 Kuidas nad töötavad, on nad - kui te esimest korda avada - kui te esimest korda teha, et fopen kõne 843 01:10:59,070 --> 01:11:04,260 FILE * tõhusalt toimib kursor faili algusest. 844 01:11:04,260 --> 01:11:12,830 Ja siis iga kord, kui helistada fgetc, ta liigub ühe märgi abil faili. 845 01:11:12,830 --> 01:11:23,280 Nii et kui te nimetate seda, sa incrementing faili viitaja ühe märgi. 846 01:11:23,280 --> 01:11:26,210 Ja kui sa fgetc jälle, et sa kolid see teine ​​märk 847 01:11:26,210 --> 01:11:28,910 ja veel üks tegelane ja teise iseloomu ja teine ​​iseloomu. 848 01:11:28,910 --> 01:11:32,030 [Student küsimus, arusaamatult] >> Ja see on - jah. 849 01:11:32,030 --> 01:11:34,810 See on selline see maagiline kapoti alla. 850 01:11:34,810 --> 01:11:37,930 Sa muudkui incrementing kaudu. 851 01:11:37,930 --> 01:11:46,510 Sel hetkel, sa oled võimeline tegelikult töötavad iseloomu. 852 01:11:46,510 --> 01:11:52,150 Niisiis, kuidas võiks meil prindi see välja ekraan, nüüd? 853 01:11:52,150 --> 01:11:58,340 Me võime kasutada sama printf asi, mida me varem kasutanud. 854 01:11:58,340 --> 01:12:00,330 Et oleme kasutanud kõiki poolaastal. 855 01:12:00,330 --> 01:12:05,450 Saame kõne printf, 856 01:12:05,450 --> 01:12:21,300 ja me edastame ka märk just niimoodi. 857 01:12:21,300 --> 01:12:27,430 Teine viis seda teha on mitte kasutades printf ja võttes seda teha stringi, 858 01:12:27,430 --> 01:12:29,490 me saame kasutada ka mõnda muud ülesannet. 859 01:12:29,490 --> 01:12:40,090 Saame kasutada fputc, mis prindib märgi ekraan, 860 01:12:40,090 --> 01:12:52,580 välja arvatud juhul, kui me vaatame fputc - las ma suumimiseks natuke. 861 01:12:52,580 --> 01:12:56,430 Näeme, mis on tore, see võtab ka märk, et me lugeda kasutades fgetc, 862 01:12:56,430 --> 01:13:05,100 kuid siis peame andma see oja printida. 863 01:13:05,100 --> 01:13:11,850 Saame kasutada ka putchar funktsioon, mis seab otseselt standard välja. 864 01:13:11,850 --> 01:13:16,070 Seega on terve hulk erinevaid võimalusi, mida saame kasutada printimiseks. 865 01:13:16,070 --> 01:13:19,580 Nad on kõik standard I / O teek. 866 01:13:19,580 --> 01:13:25,150 Kui te soovite printida - nii printf, vaikimisi trükib erilisele standard välja oja, 867 01:13:25,150 --> 01:13:27,910 mis on selle standardväljundisse. 868 01:13:27,910 --> 01:13:41,300 Nii saame lihtsalt nimetavad seda liiki see maagiline väärtus, stdout siin. 869 01:13:41,300 --> 01:13:48,410 Oih. Pane semikooloniga väljaspool. 870 01:13:48,410 --> 01:13:52,790 >> See on palju uusi, funky teabe siin. 871 01:13:52,790 --> 01:13:58,600 Palju see on väga idiomaatiline, selles mõttes, et see on kood 872 01:13:58,600 --> 01:14:05,700 , mis on kirjutatud nii lihtsalt sellepärast, et see on puhas lugeda, lihtne lugeda. 873 01:14:05,700 --> 01:14:11,520 Seal on palju erinevaid viise, kuidas seda teha, palju erinevaid funktsioone saab kasutada, 874 01:14:11,520 --> 01:14:14,680 kuid me kaldume järgige neid samu mustreid ikka ja jälle. 875 01:14:14,680 --> 01:14:20,180 Nii et ärge imestage, kui näete koodi niimoodi tulevad ikka ja jälle. 876 01:14:20,180 --> 01:14:25,690 Hea küll. Sel hetkel, me peame pausi päev. 877 01:14:25,690 --> 01:14:31,300 Tänan, et tulid. Täname vaadates kui sa oled online. Ja me näeme järgmisel nädalal. 878 01:14:31,300 --> 01:14:33,890 [CS50.TV]