1 00:00:00,000 --> 00:00:02,730 [Powered by Google Translate] [OSA 5: vähemmän mukavaksi] 2 00:00:02,730 --> 00:00:05,180 [Nate Hardison, Harvardin yliopisto] 3 00:00:05,180 --> 00:00:08,260 [Tämä on CS50.] [CS50.TV] 4 00:00:08,260 --> 00:00:11,690 Joten tervetuloa takaisin, pojat. 5 00:00:11,690 --> 00:00:16,320 Tervetuloa 5 §. 6 00:00:16,320 --> 00:00:20,220 Tässä vaiheessa, kun se valmistui tietokilpailu 0 ja nähtyäni miten olet tehnyt, 7 00:00:20,220 --> 00:00:25,770 toivottavasti tuntuu todella hyvältä, koska olen ollut hyvin vaikuttunut tulokset tässä osiossa. 8 00:00:25,770 --> 00:00:28,050 Meidän verkossa katsojille, meillä on ollut pari kysymystä 9 00:00:28,050 --> 00:00:33,680 noin kaksi viimeistä ongelmia Harjoitus - tai tietokilpailu, melko. 10 00:00:33,680 --> 00:00:39,690 Joten aiomme mennä yli nämä todella nopeasti, niin että kaikki näkevät mitä tapahtui 11 00:00:39,690 --> 00:00:45,060 ja miten mennä läpi todellisen liuoksen sijasta vain katsella ratkaisun itse. 12 00:00:45,060 --> 00:00:50,330 Aiomme mennä parin viime ongelmat todella nopeasti, 32 ja 33. 13 00:00:50,330 --> 00:00:53,240 Just, taas, joten verkossa katsojat näkevät tämän. 14 00:00:53,240 --> 00:00:59,080 >> Jos käännät ongelmaasi 32, joka on sivulla 13, 15 00:00:59,080 --> 00:01:02,730 13 out of 16, ongelmana 32 on kyse swapit. 16 00:01:02,730 --> 00:01:05,010 Se kaikki oli vaihtokauppa kahden kokonaisluvun. 17 00:01:05,010 --> 00:01:08,740 Se on ongelma, että olimme menneet yli pari kertaa luento. 18 00:01:08,740 --> 00:01:13,590 Ja täällä, mitä pyysivät sinua tekemään lyhyesti muistijälki. 19 00:01:13,590 --> 00:01:17,000 Täyttää muuttujien arvoja, koska ne ovat pinossa 20 00:01:17,000 --> 00:01:20,250 kun koodinumero kulkee tämän swap-toiminto. 21 00:01:20,250 --> 00:01:24,500 Erityisesti mitä me tarkastelemme - Menen laittaa tähän iPad alas - 22 00:01:24,500 --> 00:01:29,650 Erityisesti mitä me tarkastelemme on tämän linjan numeroitu 6 täällä. 23 00:01:29,650 --> 00:01:36,740 Ja se on numeroitu 6 vain lähekkäin edelliseen ongelmaan. 24 00:01:36,740 --> 00:01:41,720 Mitä me haluamme tehdä, on näyttää tai merkitä tilan muistin 25 00:01:41,720 --> 00:01:46,090 koska se on silloin, kun me toteuttaa tämän linjan numero 6, 26 00:01:46,090 --> 00:01:52,540 joka on käytännössä paluuta meidän swap toiminto täällä. 27 00:01:52,540 --> 00:01:59,450 Jos me selaa täällä, näimme, että osoitteet kaiken muistiin annettiin meille. 28 00:01:59,450 --> 00:02:02,540 Tämä on hyvin keskeinen, Palaamme siihen vain hetken. 29 00:02:02,540 --> 00:02:09,240 Ja sitten täällä alaosassa, meillä oli vähän muistia kaavio että aiomme puhua. 30 00:02:09,240 --> 00:02:12,490 Olen itse tehnyt tämän ulos minun iPad. 31 00:02:12,490 --> 00:02:20,720 Joten aion vuorotellen edestakaisin iPad ja tämän koodin vain viitteellisiä. 32 00:02:20,720 --> 00:02:26,540 >> Aloitetaan. Ensimmäinen, nyt keskittyä pari ensimmäistä riviä tärkeimpien täällä. 33 00:02:26,540 --> 00:02:30,220 Voit aloittaa, aiomme alustaa X 1 ja Y 2. 34 00:02:30,220 --> 00:02:33,040 Joten meillä on kaksi kokonaisluku muuttujan, he molemmat menossa sijoitetaan pinoon. 35 00:02:33,040 --> 00:02:36,050 Aiomme laittaa 1 ja 2 niihin. 36 00:02:36,050 --> 00:02:43,150 Joten jos heitän yli minun iPad, toivottavasti, katsotaanpa - 37 00:02:43,150 --> 00:02:48,660 Apple TV peilaus, ja siellä mennään. Okei. 38 00:02:48,660 --> 00:02:51,670 Joten jos heitän yli minun iPad, 39 00:02:51,670 --> 00:02:56,220 Haluan alustaa X 1 ja Y 2. 40 00:02:56,220 --> 00:03:00,580 Teemme sen yksinkertaisesti kirjoittamalla 1 laatikosta x 41 00:03:00,580 --> 00:03:07,730 ja 2 laatikosta y. Melko yksinkertaista. 42 00:03:07,730 --> 00:03:11,620 Joten nyt mennään takaisin laptop, mitä tapahtuu seuraavaksi. 43 00:03:11,620 --> 00:03:15,810 Joten tämä seuraava rivi on jotain vielä hankalaa. 44 00:03:15,810 --> 00:03:28,110 Ohitamme osoite x ja osoite y parametrit a ja b swap-toiminto. 45 00:03:28,110 --> 00:03:32,380 Osoite x ja osoite y ovat asioita, joita emme voi laskea 46 00:03:32,380 --> 00:03:36,360 ilman viittausta näihin bullet pistettä alas tänne. 47 00:03:36,360 --> 00:03:39,750 Ja onneksi kaksi ensimmäistä bullet pistettä kertomaan meille, mitä vastaukset ovat. 48 00:03:39,750 --> 00:03:44,740 Osoite x muistissa on 10, ja osoite y muistissa on 14. 49 00:03:44,740 --> 00:03:51,870 Joten ne ovat arvoja, jotka saavat kulunut niin ja b ylös meidän swap-toiminto. 50 00:03:51,870 --> 00:04:00,760 Joten jälleen, siirtyminen takaisin meidän kaavio, voin kirjoittaa 10 51 00:04:00,760 --> 00:04:07,400 ja 14 b. 52 00:04:07,400 --> 00:04:11,610 Nyt tämä kohta on, jos jatkamme swap. 53 00:04:11,610 --> 00:04:14,520 Joten flipping takaisin laptop uudelleen, 54 00:04:14,520 --> 00:04:21,079 näemme, että tie swap toimii on ensimmäisen kerran dereference ja myymälä tulos tmp. 55 00:04:21,079 --> 00:04:27,650 Joten dereference operaattori sanoo, "Hei. Kohtele sisällön muuttujan kuten osoitteen. 56 00:04:27,650 --> 00:04:33,830 Siirry mitä tallennetaan kyseiseen osoitteeseen, ja lataa se. " 57 00:04:33,830 --> 00:04:41,720 Mitä lataat ulos muuttujan aiotaan varastoida meidän tmp muuttuja. 58 00:04:41,720 --> 00:04:45,150 Flipping takaisin iPad. 59 00:04:45,150 --> 00:04:51,690 Jos menemme Osoite 10, me tiedämme, että osoite 10 on varible x 60 00:04:51,690 --> 00:04:55,480 koska me kerrottiin meidän luetelmakohtaa että osoite x muistissa on 10. 61 00:04:55,480 --> 00:05:00,180 Joten voimme mennä sinne, saat sen arvoa, joka on 1, koska näemme meidän iPad, 62 00:05:00,180 --> 00:05:06,300 ja ladata sen osaksi tmp. 63 00:05:06,300 --> 00:05:08,250 Jälleen kerran, tämä ei ole lopullinen sisältö. 64 00:05:08,250 --> 00:05:14,350 Aiomme käydä läpi ja saamme meidän lopulliseen tilaan ohjelman päätyttyä. 65 00:05:14,350 --> 00:05:17,210 Mutta nyt meillä on arvo 1 tallennettu tmp. 66 00:05:17,210 --> 00:05:19,210 >> Ja siellä nopea kysymys tänne. 67 00:05:19,210 --> 00:05:23,980 [Alexander] Onko dereference operaattori - se on vain tähti edessä muuttujan? 68 00:05:23,980 --> 00:05:27,600 >> Kyllä. Joten dereference toimija, kuten me käännä takaisin meidän laptop jälleen 69 00:05:27,600 --> 00:05:33,780 tämä tähti edessä. 70 00:05:33,780 --> 00:05:37,460 Siinä mielessä se on - te vastakkain sen kanssa kertolaskun 71 00:05:37,460 --> 00:05:42,400 joka edellyttää kahta asiaa, dereference operaattori on unaarinen operaattori. 72 00:05:42,400 --> 00:05:46,130 Vain soveltaa yhtä arvoa toisin kuin binääristä operaattoria, 73 00:05:46,130 --> 00:05:48,810 jossa sovelletaan kahta eri arvoja. 74 00:05:48,810 --> 00:05:52,080 Niin, että mitä tapahtuu tätä linjaa. 75 00:05:52,080 --> 00:05:58,390 Me ladattu arvon 1 ja tallentaa sen määräaikaista kokonaisluku muuttuja. 76 00:05:58,390 --> 00:06:05,800 Seuraavalle riville Tallennamme sisältö b osaksi - 77 00:06:05,800 --> 00:06:12,630 tai pikemminkin me tallentaa sisällön että b on osoittaa siihen paikkaan, jossa on osoittaa. 78 00:06:12,630 --> 00:06:17,690 Jos analysoimme tätä oikealta vasemmalle, aiomme dereference b, 79 00:06:17,690 --> 00:06:23,580 aiomme käsitellä 14, aiomme napata kokonaisluku, joka on olemassa, 80 00:06:23,580 --> 00:06:26,900 ja sitten aiomme mennä osoitteeseen 10, 81 00:06:26,900 --> 00:06:34,240 ja aiomme heittää seurausta meidän dereference B tuohon tilaan. 82 00:06:34,240 --> 00:06:40,080 Flipping takaisin meidän iPad, jossa voimme tehdä tästä hieman konkreettisempaa, 83 00:06:40,080 --> 00:06:44,070 Se voisi auttaa, jos kirjoitan numerot kaikki osoitteet täältä. 84 00:06:44,070 --> 00:06:53,820 Joten me tiedämme, että y, olemme osoitteesta 14, x on osoitteessa 10. 85 00:06:53,820 --> 00:07:00,180 Kun aloitamme B, me dereference b, aiomme napata arvo 2. 86 00:07:00,180 --> 00:07:08,320 Aiomme tarttua tähän arvoon, koska se on arvo, joka asuu osoitteessa 14. 87 00:07:08,320 --> 00:07:15,700 Ja me aiomme laittaa se muuttuja, joka asuu osoitteessa 10, 88 00:07:15,700 --> 00:07:19,160 joka on oikeassa, vastaten meidän muuttuja x. 89 00:07:19,160 --> 00:07:21,810 Joten voimme tehdä hieman korvaamatta täällä 90 00:07:21,810 --> 00:07:35,380 jossa pääsemme eroon meidän 1 ja sen sijaan me kirjoitamme 2. 91 00:07:35,380 --> 00:07:39,560 Joten kaikki on hyvin ja hyvää maailmassa, vaikka olemme korvataan x nyt. 92 00:07:39,560 --> 00:07:44,890 Olemme tallennetut x: n vanha arvo meidän TMP muuttuja. 93 00:07:44,890 --> 00:07:50,210 Joten voimme täydentää swap kanssa seuraavalle riville. 94 00:07:50,210 --> 00:07:53,030 Flipping takaisin meidän laptop. 95 00:07:53,030 --> 00:07:58,150 Nyt kaikki jää on ottaa sisällön pois meidän tilapäisen kokonaisluku muuttuja 96 00:07:58,150 --> 00:08:05,630 ja tallentaa ne muuttujaan, joka asuu osoitteessa, että b on tilalla. 97 00:08:05,630 --> 00:08:10,230 Joten aiomme tehokkaasti dereference b päästä käsiksi muuttujan 98 00:08:10,230 --> 00:08:14,340 , joka on osoite, joka b pitää siinä, 99 00:08:14,340 --> 00:08:19,190 ja aiomme tavaraa arvo tmp pitelee siihen. 100 00:08:19,190 --> 00:08:23,280 Flipping takaisin iPad kerran. 101 00:08:23,280 --> 00:08:31,290 Voin poistaa tämän arvon täällä, 2, 102 00:08:31,290 --> 00:08:41,010 vaan me kopioidaan 1 suoraan siihen. 103 00:08:41,010 --> 00:08:43,059 Sitten seuraava rivi, joka suorittaa, tietenkin - 104 00:08:43,059 --> 00:08:47,150 jos me käännä takaisin laptop - tämä 6 kohta, 105 00:08:47,150 --> 00:08:52,500 joka on piste, jossa halusimme olla meidän kaavion kokonaan täytetty. 106 00:08:52,500 --> 00:08:58,940 Joten flipping takaisin iPad kerran, niin voit nähdä valmis kaavio, 107 00:08:58,940 --> 00:09:06,610 voit nähdä, että meillä on 10, 14 b, 1 TMP, 2 x, ja 1 y. 108 00:09:06,610 --> 00:09:11,000 Onko kysyttävää? 109 00:09:11,000 --> 00:09:14,640 Onko tämä järkevämpää, kun se käveli sen kautta? 110 00:09:14,640 --> 00:09:24,850 Tee vähemmän järkeä? Toivottavasti ei. Okei. 111 00:09:24,850 --> 00:09:28,230 >> Osoittimet ovat hyvin hankala aihe. 112 00:09:28,230 --> 00:09:33,420 Yksi kaverit kanssa teemme on hyvin yleinen sanonta: 113 00:09:33,420 --> 00:09:36,590 "Ymmärtää viitteitä, sinun täytyy ensin ymmärtää viitteitä." 114 00:09:36,590 --> 00:09:40,530 Joka on mielestäni hyvin paikkansa. Se vie aikaa tottua siihen. 115 00:09:40,530 --> 00:09:45,360 Piirustus paljon kuvia, arvonnalla muistia kaavioita kuten tämä on erittäin hyödyllistä, 116 00:09:45,360 --> 00:09:49,480 ja kun kävelee esimerkin toisensa jälkeen jälkeen esimerkiksi 117 00:09:49,480 --> 00:09:54,450 se tulee alkaa tehdä hieman enemmän järkeä ja hieman järkeä ja hieman järkeä. 118 00:09:54,450 --> 00:10:01,560 Lopuksi yksi päivä, sinulla on kaikki täysin oppinut. 119 00:10:01,560 --> 00:10:13,800 Kaikki kysymykset ennen kuin siirrymme seuraavaan ongelmaan? Selvä. 120 00:10:13,800 --> 00:10:18,840 Joten käännä takaisin kannettavaan. 121 00:10:18,840 --> 00:10:23,300 Seuraava ongelma meillä on ongelma numero 33, tiedoston I / O. 122 00:10:23,300 --> 00:10:26,350 Lähennä tässä hieman. 123 00:10:26,350 --> 00:10:28,710 Ongelma 33 - Niin? 124 00:10:28,710 --> 00:10:32,110 >> [Daniel] Minulla oli nopea kysymys. Tämä tähti tai tähti, 125 00:10:32,110 --> 00:10:35,590 sitä kutsutaan dereferencing kun käytät tähdellä ennen. 126 00:10:35,590 --> 00:10:38,820 Mikä sen nimi on kun käytät et-merkki ennen? 127 00:10:38,820 --> 00:10:43,140 >> Et-ennen on osoite-toimijan. 128 00:10:43,140 --> 00:10:45,880 Joten vierittää takaisin ylös. 129 00:10:45,880 --> 00:10:49,310 Oho. Olen zoom-tilassa, joten en todellakaan siirry. 130 00:10:49,310 --> 00:10:52,780 Jos me tarkastelemme tätä koodia todella nopeasti täällä, 131 00:10:52,780 --> 00:10:54,980 uudelleen, sama asia tapahtuu. 132 00:10:54,980 --> 00:10:59,180 Jos me tarkastelemme tätä koodia täällä, tällä linjalla, jossa teemme puhelun vaihtaa, 133 00:10:59,180 --> 00:11:10,460 Et-on vain sanonta "saada osoitteensa muuttuja x elämäänsä." 134 00:11:10,460 --> 00:11:14,460 Kun kääntäjä kokoaa koodisi, 135 00:11:14,460 --> 00:11:20,590 se on todella fyysisesti merkitä paikka muistiin kaikki muuttujat elää. 136 00:11:20,590 --> 00:11:24,910 Ja niin mitä kääntäjä voi sitten tehdä kun se on koottu kaikki, 137 00:11:24,910 --> 00:11:31,110 se tietää, "Oh, laitoin x osoitteessa 10. Laitoin y osoitteessa 14." 138 00:11:31,110 --> 00:11:34,640 Se voi sitten täyttää nämä arvot sinulle. 139 00:11:34,640 --> 00:11:44,740 Joten voit - se voi sitten siirtää ja Pass & Y samoin. 140 00:11:44,740 --> 00:11:50,730 Nämä kaverit saavat osoitteen, mutta myös, kun ohitat ne swap-toiminto, 141 00:11:50,730 --> 00:11:55,690 Tämän tyyppinen tieto, tämä int * täällä, kertoo kääntäjä, 142 00:11:55,690 --> 00:12:01,350 "Okei, me tullaan tulkittaessa osoite osoitteen kokonaisluku muuttuja." 143 00:12:01,350 --> 00:12:05,900 Kuten osoitteen int, joka on erilainen osoite merkin muuttuvan 144 00:12:05,900 --> 00:12:09,930 koska int vie, on 32-bittinen kone, vie 4 tavua tilaa, 145 00:12:09,930 --> 00:12:13,310 taas merkki vain vie 1 tavun tilaa. 146 00:12:13,310 --> 00:12:17,310 Joten on tärkeää tietää myös, mitä on - mitä elää, minkälainen arvo 147 00:12:17,310 --> 00:12:20,340 asuu osoitteessa, joka sai läpäissyt sisään 148 00:12:20,340 --> 00:12:22,020 Tai osoite, että olet tekemisissä. 149 00:12:22,020 --> 00:12:29,020 Näin tiedät kuinka monta tavua todella ladata ulos RAM. 150 00:12:29,020 --> 00:12:31,780 Ja sitten, kyllä, tämä dereference operaattori, kuten te pyysitte, 151 00:12:31,780 --> 00:12:37,200 menee ja sisäänkäyntien tiedot tiettyyn osoitteeseen. 152 00:12:37,200 --> 00:12:42,820 Niin se sanoo, tämä muuttuja tässä hoitoon sisältö osoitteena, 153 00:12:42,820 --> 00:12:47,880 mennä kyseiseen osoitteeseen, ja vedä, ladataan prosessorin kuormitus tulee rekisteriin 154 00:12:47,880 --> 00:12:56,340 todelliset arvot tai sisältöä, jotka elävät kyseisessä osoitteessa. 155 00:12:56,340 --> 00:12:59,620 Vielä kysymyksiä? Nämä ovat hyviä kysymyksiä. 156 00:12:59,620 --> 00:13:01,650 Se on paljon uutta terminologiaa liikaa. 157 00:13:01,650 --> 00:13:09,800 Se on myös eräänlainen funky, nähdä ja ja * eri paikoissa. 158 00:13:09,800 --> 00:13:13,180 >> Selvä. 159 00:13:13,180 --> 00:13:18,530 Joten takaisin ongelmaan 33, tiedostoon I / O. 160 00:13:18,530 --> 00:13:22,540 Tämä oli yksi niistä ongelmista, jotka mielestäni pari asiaa tapahtui. 161 00:13:22,540 --> 00:13:25,400 Yksi, se on melko uusi aihe. 162 00:13:25,400 --> 00:13:30,590 Se esitettiin melko pian ennen tietokilpailu, 163 00:13:30,590 --> 00:13:33,400 ja sitten mielestäni se oli sellainen kuin yksi niistä sanan ongelmien matematiikka 164 00:13:33,400 --> 00:13:39,720 jos ne antavat sinulle paljon tietoa, mutta itse eivät päätyä käyttämään ton se. 165 00:13:39,720 --> 00:13:44,060 Ensimmäinen osa tätä ongelmaa kuvailee mitä CSV tiedosto on. 166 00:13:44,060 --> 00:13:50,620 Nyt, CSV, mukaan kuvauksen, on pilkulla erotetut arvot tiedosto. 167 00:13:50,620 --> 00:13:55,300 Syy Nämä ovat kaikki kiinnostavia, ja syy koskaan käyttää niitä, 168 00:13:55,300 --> 00:14:00,800 on, koska kuinka moni teistä on joskus käyttänyt tavaraa kuten Excel? 169 00:14:00,800 --> 00:14:03,240 Kuva useimmat teistä, luultavasti, tai käyttää jossain vaiheessa elämääsi. 170 00:14:03,240 --> 00:14:06,430 Käytät jotain Excelin. 171 00:14:06,430 --> 00:14:10,940 Saadaksesi tietoja ulos Excel-laskentataulukon tai tee minkäänlaista käsittelyä sen kanssa, 172 00:14:10,940 --> 00:14:17,240 jos halusi kirjoittaa C-ohjelma tai Python ohjelma, Java-ohjelma, 173 00:14:17,240 --> 00:14:20,070 käsitellä tallennetut tiedot siellä, 174 00:14:20,070 --> 00:14:23,170 yksi yleisimmistä tavoista saada se ulos on CSV-tiedosto. 175 00:14:23,170 --> 00:14:26,850 Ja voit avata Excelin ja kun menet "Save As" dialogi, 176 00:14:26,850 --> 00:14:32,840 voit saada pois varsinaisen CSV-tiedoston. 177 00:14:32,840 --> 00:14:35,890 >> Handy tietää, miten käsitellä näitä asioita. 178 00:14:35,890 --> 00:14:42,010 Miten se toimii on, että se on samanlainen - Tarkoitan, se on lähinnä matkii taulukkolaskenta, 179 00:14:42,010 --> 00:14:47,590 missä, kuten näemme täällä, aivan äärimmäisenä vasemmalla pala, 180 00:14:47,590 --> 00:14:49,910 olemme kaikki sukunimiä. 181 00:14:49,910 --> 00:14:54,670 Joten meillä on Malan, sitten Hardison, ja sitten Bowden, MacWilliam, ja sitten Chan. 182 00:14:54,670 --> 00:14:59,470 Kaikki sukunimiä. Ja sitten pilkku erottaa viimeinen nimet etunimet. 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 aina sekoittaa Robby ja Tom. 185 00:15:06,850 --> 00:15:10,940 Ja sitten lopuksi, kolmannessa sarakkeessa on sähköpostiosoitteet. 186 00:15:10,940 --> 00:15:18,500 Kun ymmärrät, että muu ohjelma on melko yksinkertainen toteuttaa. 187 00:15:18,500 --> 00:15:23,850 Mitä olemme tehneet, jotta jäljitellä tätä samaa rakennetta meidän C-ohjelma 188 00:15:23,850 --> 00:15:27,510 on olemme käyttäneet rakennetta. 189 00:15:27,510 --> 00:15:30,520 Aloitamme leikkii näillä hieman samoin. 190 00:15:30,520 --> 00:15:35,790 Näimme heidät ensimmäisen hieman vuonna Harjoitus 3, kun olimme tekemisissä sanakirjoja. 191 00:15:35,790 --> 00:15:40,290 Mutta tämä henkilökunta struct tallentaa sukunimi, etunimi, ja sähköposti. 192 00:15:40,290 --> 00:15:44,500 Aivan kuten CSV tiedoston tallentamiseen. 193 00:15:44,500 --> 00:15:47,950 Joten tämä on vain muuntaa muodosta toiseen. 194 00:15:47,950 --> 00:15:54,630 Meidän täytyy muuntaa, tässä tapauksessa henkilöstön struct osaksi linja, 195 00:15:54,630 --> 00:15:59,060 pilkulla erotettuna line, aivan kuten se. 196 00:15:59,060 --> 00:16:01,500 Onko siinä järkeä? Olette kaikki ottaneet tietokilpailu, 197 00:16:01,500 --> 00:16:07,680 joten oletan sinulla on ainakin ollut aikaa miettiä tätä. 198 00:16:07,680 --> 00:16:16,410 >> Vuonna vuokraus toiminnon ongelma pyytää meitä ottamaan sisään - we'll zoomata tässä hieman - 199 00:16:16,410 --> 00:16:22,480 toteuttaa henkilöstön rakenne, henkilöstö struct kanssa nimellä s, 200 00:16:22,480 --> 00:16:30,900 ja liittää sen sisältö meidän staff.csv tiedosto. 201 00:16:30,900 --> 00:16:34,230 On käynyt ilmi, että tämä on melko yksinkertainen käyttää. 202 00:16:34,230 --> 00:16:37,430 Me tavallaan leikkiä näiden toimintojen hieman tänään. 203 00:16:37,430 --> 00:16:44,510 Mutta tässä tapauksessa, fprintf toiminto on todella avain. 204 00:16:44,510 --> 00:16:51,960 Joten fprintf, voimme tulostaa, aivan kuten te käyttänyt printf tätä koko ajan. 205 00:16:51,960 --> 00:16:55,050 Voit printf rivin tiedostoon. 206 00:16:55,050 --> 00:16:59,030 Joten sen sijaan vain tehdä tavallista printf puhelun missä annat sen muotomerkkijonoa 207 00:16:59,030 --> 00:17:05,380 ja sitten korvata kaikki muuttujat seuraavat argumentit, 208 00:17:05,380 --> 00:17:11,290 kanssa fprintf, aivan ensimmäinen argumentti on sen sijaan tiedosto, jonka haluat kirjoittaa. 209 00:17:11,290 --> 00:17:21,170 Jos me tarkastelemme tätä laitetta, esim. mies fprintf, 210 00:17:21,170 --> 00:17:25,980 Voimme nähdä eroa printf ja fprintf. 211 00:17:25,980 --> 00:17:28,960 Minä zoomata tässä hieman. 212 00:17:28,960 --> 00:17:33,140 Joten printf, annamme sen muotomerkkijonoa, ja sitten myöhemmin väitteitä 213 00:17:33,140 --> 00:17:37,580 ovat kaikki muuttujat korvaaminen tai korvaamisesta meidän muotomerkkijonoa. 214 00:17:37,580 --> 00:17:47,310 Kun taas fprintf, ensimmäinen argumentti on todellakin tämä tiedosto * kutsutaan stream. 215 00:17:47,310 --> 00:17:51,800 >> Muutto takaisin tänne meidän vuokra, 216 00:17:51,800 --> 00:17:54,550 olemme jo saimme tiedosto * stream meille avataan. 217 00:17:54,550 --> 00:17:57,810 Juuri tämä ensimmäinen rivi ei, se avaa staff.csv tiedoston, 218 00:17:57,810 --> 00:18:01,690 se avaa sen append-tilassa, ja kaikki mitä on jäljellä voimme tehdä on 219 00:18:01,690 --> 00:18:08,640 kirjoita henkilöstön rakenteen tiedostoon. 220 00:18:08,640 --> 00:18:10,870 Ja katsotaanpa, en halua käyttää iPad? 221 00:18:10,870 --> 00:18:17,900 Minä käytän iPad. Meillä on void - Pannaan tämä pöydälle, jotta voin kirjoittaa hieman paremmin - 222 00:18:17,900 --> 00:18:33,680 mitätöidä vuokraus ja kestää yhden väitteen, henkilöstön rakennetta kutsutaan s. 223 00:18:33,680 --> 00:18:44,120 Saimme housunkannattimet, meillä meidän tiedosto * nimeltään tiedosto, 224 00:18:44,120 --> 00:18:48,380 meillä fopen linja antanut meille, 225 00:18:48,380 --> 00:18:51,890 ja minä vain kirjoitan sen pisteinä, koska se on jo pedia. 226 00:18:51,890 --> 00:19:00,530 Ja sitten meidän seuraavalle riville, aiomme soittaa fprintf 227 00:19:00,530 --> 00:19:03,700 ja aiomme kulkea tiedosto, jonka haluat tulostaa, 228 00:19:03,700 --> 00:19:10,290 ja sitten meidän muotomerkkijonon, joka - 229 00:19:10,290 --> 00:19:14,300 Annan te kertoa minulle, miltä se näyttää. 230 00:19:14,300 --> 00:19:20,500 Entä sinä, Stella? Tiedätkö, mitä ensimmäinen osa muotomerkkijonoa näyttää? 231 00:19:20,500 --> 00:19:24,270 [Stella] En ole varma. >> Vapaasti kysyä Jimmy. 232 00:19:24,270 --> 00:19:27,690 Tiedätkö, Jimmy? 233 00:19:27,690 --> 00:19:31,000 [Jimmy] Olisiko vain olla viimeinen? En tiedä. En ole täysin varma. 234 00:19:31,000 --> 00:19:39,020 >> Okei. Entä, ei kukaan saat tämän korrekti tentti? 235 00:19:39,020 --> 00:19:41,770 No Selvä. 236 00:19:41,770 --> 00:19:47,920 On käynyt ilmi, että täällä kaikki meidän tarvitsee vain haluamme jokainen osa henkilöstön rakenteen 237 00:19:47,920 --> 00:19:53,290 voidaan tulostaa ulos string meidän tiedostoon. 238 00:19:53,290 --> 00:19:59,900 Me vain käyttää merkkijonon korvaaminen merkin kolme eri kertaa, koska meillä on sukunimi 239 00:19:59,900 --> 00:20:07,160 seurasi pilkku, sitten etunimi seurasi pilkku, 240 00:20:07,160 --> 00:20:12,430 ja sitten lopulta sähköpostiosoite, jota seuraa - joka ei ole 241 00:20:12,430 --> 00:20:15,140 sovittamalla minun näytöllä - mutta se seuraa rivinvaihtomerkki. 242 00:20:15,140 --> 00:20:20,060 Joten aion kirjoittaa se vain sinne. 243 00:20:20,060 --> 00:20:23,560 Ja sitten seuraavat meidän muotomerkkijonoa, 244 00:20:23,560 --> 00:20:27,880 meillä on vain substituutiot, jota käyttää pilkku merkintää 245 00:20:27,880 --> 00:20:31,370 että näimme Harjoitus 3. 246 00:20:31,370 --> 00:20:48,820 Voimme käyttää s.last, s.first, ja s.email 247 00:20:48,820 --> 00:20:58,990 korvata näiden kolmen arvoja meidän muotomerkkijonoa. 248 00:20:58,990 --> 00:21:06,190 Joten miten se meni? Järkeä? 249 00:21:06,190 --> 00:21:09,700 Kyllä? Ei? Mahdollisesti? Okei. 250 00:21:09,700 --> 00:21:14,180 >> Viimeinen asia, mitä teemme kun olemme painettu ja sen jälkeen olemme avasimme file: 251 00:21:14,180 --> 00:21:17,370 aina kun olet avannut tiedoston, meidän on aina muistettava sulkea sitä. 252 00:21:17,370 --> 00:21:19,430 Koska muuten päädyt vuotaa muistia, 253 00:21:19,430 --> 00:21:22,500 käyttämällä ylös tiedosto kuvaajat. 254 00:21:22,500 --> 00:21:25,950 Joten sulkea sitä, mikä funktio käytämme? Daniel? 255 00:21:25,950 --> 00:21:30,120 [Daniel] fclose? >> Fclose, tarkalleen. 256 00:21:30,120 --> 00:21:37,520 Niin, että viimeinen osa tätä ongelmaa oli oikein lopettaa, käyttämällä fclose toimintoa, 257 00:21:37,520 --> 00:21:40,370 joka vain näyttää, että. 258 00:21:40,370 --> 00:21:43,880 Ei liian hullu. 259 00:21:43,880 --> 00:21:46,990 Cool. 260 00:21:46,990 --> 00:21:49,520 Niin, että ongelma 33 tietovisa. 261 00:21:49,520 --> 00:21:52,480 Saamme varmasti enemmän tiedoston I / O tulossa. 262 00:21:52,480 --> 00:21:55,130 Teemme hieman enemmän luento tänään tai osassa tänään, 263 00:21:55,130 --> 00:22:01,710 koska se mitä tulee muodostamaan suurimman osan tämän tulevan PSET. 264 00:22:01,710 --> 00:22:05,020 Siirrytään siitä tietovisa tässä vaiheessa. Kyllä? 265 00:22:05,020 --> 00:22:10,880 >> [Charlotte]] Miksi fclose (tiedosto) sijaan fclose (staff.csv)? 266 00:22:10,880 --> 00:22:19,100 >> Ah. Koska näyttää siltä, ​​että - niin kysymys, mikä on hieno, 267 00:22:19,100 --> 00:22:27,800 Siksi, kun kirjoitamme fclose, olemme kirjallisesti fclose (tiedosto) tähti muuttuja 268 00:22:27,800 --> 00:22:33,680 toisin kuin tiedostonimen, staff.csv? Onko se oikein? Joo. 269 00:22:33,680 --> 00:22:39,570 Joten katsomaan. Jos minun siirtyä takaisin minun laptop, 270 00:22:39,570 --> 00:22:45,040 ja katsokaamme fclose toimintoa. 271 00:22:45,040 --> 00:22:51,460 Joten fclose toiminto sulkee virta ja se vie osoitin stream että haluamme sulkea, 272 00:22:51,460 --> 00:22:57,010 toisin kuin varsinaisen tiedostonimen haluamme sulkea. 273 00:22:57,010 --> 00:23:01,620 Ja tämä johtuu siitä, kulissien takana, kun soittaa fopen, 274 00:23:01,620 --> 00:23:12,020 Kun avaat tiedoston, olet todella jakaa muistia tietoja tiedostosta. 275 00:23:12,020 --> 00:23:16,380 Joten sinulla on tiedoston osoitin, että on tietoa tiedoston, 276 00:23:16,380 --> 00:23:23,080 kuten se on auki, sen kokoa, missä kulloinkin olet tiedoston, 277 00:23:23,080 --> 00:23:29,100 jotta voit tehdä lukemisen ja kirjoittamisen puhelut että tiettyyn paikkaan tiedoston sisällä. 278 00:23:29,100 --> 00:23:38,060 Päädyt suljetaan osoitin sulkemisen sijasta tiedoston nimi. 279 00:23:38,060 --> 00:23:48,990 >> Kyllä? [Daniel] Joten jotta käyttää vuokraus, sanoisitteko - miten se saa käyttäjä syöttää? 280 00:23:48,990 --> 00:23:53,830 Onko fprintf toimivat kuten GetString siinä mielessä, että se vain odottaa käyttäjän syötettä 281 00:23:53,830 --> 00:23:57,180 ja pyytää sinua kirjoittamaan tähän - tai odota voit kirjoittaa nämä kolme asiaa? 282 00:23:57,180 --> 00:24:00,480 Vai joudut käyttämään jotain toteuttaa vuokra? 283 00:24:00,480 --> 00:24:04,100 >> Joo. Joten emme - kysymys, miten saamme käyttäjäsyötteen 284 00:24:04,100 --> 00:24:09,220 toteuttaakseen vuokraus? Ja mitä meillä täällä on soittajan vuokra, 285 00:24:09,220 --> 00:24:17,690 kulunut tämän henkilöstön struct kaikkien tallennettujen struct jo. 286 00:24:17,690 --> 00:24:22,990 Joten fprintf pystyy vain kirjoittaa, että tiedot suoraan tiedostoon. 287 00:24:22,990 --> 00:24:25,690 Ei ole odottaa käyttäjän syötettä. 288 00:24:25,690 --> 00:24:32,110 Käyttäjä on jo antanut panoksen asianmukaisesti laittamalla sen tässä henkilöstön struct. 289 00:24:32,110 --> 00:24:36,510 Ja asioita, tietenkin, rikkoisi jos näitä osoittimia olivat null, 290 00:24:36,510 --> 00:24:40,370 joten vierittää takaisin ylös tänne ja katsomme meidän struct. 291 00:24:40,370 --> 00:24:43,640 Meillä on merkkijono viimeinen merkkijono ensin merkkijono sähköpostin. 292 00:24:43,640 --> 00:24:48,530 Tiedämme nyt, että kaikki nämä todella, konepellin alle, ovat char * muuttujia. 293 00:24:48,530 --> 00:24:53,470 Tämä voidaan tai ei voida osoittaa null. 294 00:24:53,470 --> 00:24:55,800 Ne voidaan osoittaa muistiin kasaan, 295 00:24:55,800 --> 00:24:59,650 ehkä muistiin pinoon. 296 00:24:59,650 --> 00:25:04,580 Emme oikeastaan ​​tiedä, mutta jos jokin näistä osoittimia ovat nolla tai virheellinen, 297 00:25:04,580 --> 00:25:08,120 että taatusti kaatua meidän vuokra-toiminto. 298 00:25:08,120 --> 00:25:11,050 Se oli jotain, joka oli eräänlainen kuulu tentti. 299 00:25:11,050 --> 00:25:16,440 Emme murehtia siitä. 300 00:25:16,440 --> 00:25:22,170 Suuri. Okei. Joten siirtymässä tietovisa. 301 00:25:22,170 --> 00:25:25,760 >> Katsotaanpa sulkea tämän kaveri, ja aiomme katsoa PSET 4. 302 00:25:25,760 --> 00:25:34,700 Joten jos te tarkastellaan PSET spec, kun voit käyttää sitä, cs50.net/quizzes, 303 00:25:34,700 --> 00:25:42,730 aiomme käydä läpi muutamia osan ongelmista tänään. 304 00:25:42,730 --> 00:25:52,240 Olen vierittämällä - osa kysymyksistä alkaa kolmannella sivulla PSET spec. 305 00:25:52,240 --> 00:25:57,800 Ja ensimmäinen osa pyytää sinua menemään ja katsomaan lyhyt suuntaamaan ja putket. 306 00:25:57,800 --> 00:26:02,820 Joka oli eräänlainen viileä lyhyt, näyttää uusia, hienoja komentorivin temppuja, joita voit käyttää. 307 00:26:02,820 --> 00:26:06,050 Ja sitten meillä muutamia kysymyksiä sinulle samoin. 308 00:26:06,050 --> 00:26:10,860 Tämä ensimmäinen kysymys puroihin, joihin printf kirjoittaa oletusarvoisesti, 309 00:26:10,860 --> 00:26:15,920 me tavallaan sivuttiin vain vähän aikaa sitten. 310 00:26:15,920 --> 00:26:22,380 Tämä fprintf että olimme juuri keskustelleet vie tiedostoon * virta sen väitteen. 311 00:26:22,380 --> 00:26:26,580 fclose vie tiedostoon * stream samoin, 312 00:26:26,580 --> 00:26:32,660 ja palauttaa arvon fopen saat tiedoston * stream samoin. 313 00:26:32,660 --> 00:26:36,060 Syy emme ole nähneet niitä ennen kun olemme hoitaneet printf 314 00:26:36,060 --> 00:26:39,450 johtuu printf on oletuksena stream. 315 00:26:39,450 --> 00:26:41,810 Ja oletuksena virta, johon se kirjoittaa 316 00:26:41,810 --> 00:26:45,190 voit tietää lyhyellä. 317 00:26:45,190 --> 00:26:50,080 Joten ehdottomasti vilkaista sitä. 318 00:26:50,080 --> 00:26:53,010 >> Nykypäivän osiossa, aiomme puhua hieman siitä GDB, 319 00:26:53,010 --> 00:26:57,720 koska tutumpi olette, sitä enemmän käytäntö saat sen kanssa, 320 00:26:57,720 --> 00:27:01,390 paremmin voit itse metsästämään bugeja oman koodin. 321 00:27:01,390 --> 00:27:05,540 Tämä nopeuttaa prosessia virheenkorjaus valtavasti. 322 00:27:05,540 --> 00:27:09,230 Joten käyttämällä printf, joka kerta tehdä, että sinun täytyy kääntää koodin, 323 00:27:09,230 --> 00:27:13,000 sinun täytyy ajaa uudelleen, joskus täytyy siirtää printf puhelun ympärillä, 324 00:27:13,000 --> 00:27:17,100 kommentti, koodi, se vain vie aikaa. 325 00:27:17,100 --> 00:27:20,850 Tavoitteenamme on yrittää vakuuttaa teille, että GDB, voit pohjimmiltaan 326 00:27:20,850 --> 00:27:26,810 printf mitään missään vaiheessa koodi ja sinun ei tarvitse kääntää sitä. 327 00:27:26,810 --> 00:27:35,120 Sinun ei koskaan tarvitse aloittaa ja pitää arvailla mistä printf seuraavaksi. 328 00:27:35,120 --> 00:27:40,910 Ensimmäinen asia tehdä, on kopioida tämä rivi ja saada osan koodi pois www. 329 00:27:40,910 --> 00:27:47,530 Olen kopioiminen koodirivin joka sanoo, "wget ​​http://cdn.cs50.net". 330 00:27:47,530 --> 00:27:49,510 Aion kopioida sitä. 331 00:27:49,510 --> 00:27:55,950 Aion mennä yli minun laite, loitontaa niin näet mitä olen tekemässä, 332 00:27:55,950 --> 00:28:01,890 liittämällä sen sinne, ja kun osuin Anna, tämä wget komento kirjaimellisesti on web saada. 333 00:28:01,890 --> 00:28:06,210 Se tulee kaatamaan tämän tiedoston pois Internet, 334 00:28:06,210 --> 00:28:11,790 ja se tulee tallentaa sen nykyiseen hakemistoon. 335 00:28:11,790 --> 00:28:21,630 Nyt jos voin lisätä nykyisestä hakemistosta voit nähdä, että minulla on tämä section5.zip tiedoston suoraan sinne. 336 00:28:21,630 --> 00:28:25,260 Tapa käsitellä että kaveri on purkaa se, 337 00:28:25,260 --> 00:28:27,650 jonka voit tehdä komentoriviltä, ​​aivan kuten tämä. 338 00:28:27,650 --> 00:28:31,880 Section5.zip. 339 00:28:31,880 --> 00:28:36,980 Että saat pura se, luo kansio minulle, 340 00:28:36,980 --> 00:28:40,410 puhaltaa kaikki sisällöt, laita ne sinne. 341 00:28:40,410 --> 00:28:47,410 Joten nyt voin mennä minun 5 § hakemistoon cd-komennolla. 342 00:28:47,410 --> 00:28:58,310 Tyhjentää näytön avulla selvä. Joten tyhjentää näytön. 343 00:28:58,310 --> 00:29:02,280 Nyt minulla mukava puhdas terminaali käsitellä. 344 00:29:02,280 --> 00:29:06,200 >> Nyt jos listata kaikki tiedostot näen tässä hakemistossa, 345 00:29:06,200 --> 00:29:12,270 näet, että olen saanut neljä tiedostoa: buggy1, buggy2, buggy3 ja buggy4. 346 00:29:12,270 --> 00:29:16,180 Minulla on myös niiden vastaavat. C-tiedostoja. 347 00:29:16,180 --> 00:29:20,400 Emme aio katsoa. ​​C-tiedostoja nyt. 348 00:29:20,400 --> 00:29:24,140 Sen sijaan aiomme käyttää niitä, kun avaamme GDB. 349 00:29:24,140 --> 00:29:28,220 Olemme pitäneet heidät ympäri niin, että meillä on pääsy varsinaisen lähdekoodin kun käytämme GDB, 350 00:29:28,220 --> 00:29:32,740 mutta tavoitteena osan osa on korjailla ympäriinsä GDB 351 00:29:32,740 --> 00:29:40,370 ja miten voimme käyttää sitä selvittää mitä vikaa kussakin näistä neljästä buginen ohjelmia. 352 00:29:40,370 --> 00:29:43,380 Eli olemme juuri menossa ympäri huonetta todella nopeasti, 353 00:29:43,380 --> 00:29:47,000 ja aion pyytää jotakuta ajaa yhtä buginen ohjelmien 354 00:29:47,000 --> 00:29:54,730 ja sitten menemme ryhmänä kautta GDB, ja näemme, mitä voimme tehdä korjata näitä ohjelmia, 355 00:29:54,730 --> 00:29:58,460 tai ainakin tunnistaa mitä vikaa niissä kaikissa. 356 00:29:58,460 --> 00:30:04,760 Aloitetaan tänne Daniel. Aiotteko ajaa buggy1? Katsotaan mitä tapahtuu. 357 00:30:04,760 --> 00:30:09,470 [Daniel] Se sanoo, että sovelluksen vika. >> Joo. Aivan. 358 00:30:09,470 --> 00:30:12,460 Joten jos juoksen buggy1, saan seg vika. 359 00:30:12,460 --> 00:30:16,210 Tässä vaiheessa voisin mennä ja avata buggy1.c, 360 00:30:16,210 --> 00:30:19,450 yrittää selvittää, mitä pielessä, 361 00:30:19,450 --> 00:30:22,000 mutta yksi vastenmielinen asioita tämän väestönosan vika virhe 362 00:30:22,000 --> 00:30:27,610 on, että se ei kerro mitä rivillä ohjelman asiat todella meni pieleen ja rikkoi. 363 00:30:27,610 --> 00:30:29,880 Sinulla sellainen täytyy katsoa koodi 364 00:30:29,880 --> 00:30:33,990 ja selvittää käyttämällä arvaus ja tarkista tai printf nähdä mitä vialla. 365 00:30:33,990 --> 00:30:37,840 Yksi hienoimmista asioista noin GDB on, että se on todella, todella helppoa 366 00:30:37,840 --> 00:30:42,170 selvittää linjaa, jossa ohjelma kaatuu. 367 00:30:42,170 --> 00:30:46,160 Se on täysin sen arvoista käyttää sitä, vaikka juuri tätä. 368 00:30:46,160 --> 00:30:56,190 Joten käynnistyä GDB, kirjoitan GDB, ja sitten annan sen polku suoritettavan että haluan ajaa. 369 00:30:56,190 --> 00:31:01,960 Täällä olen kirjoittamalla GDB ./buggy1. 370 00:31:01,960 --> 00:31:06,600 Enter. Antaa minulle kaiken tämän tekijänoikeustiedot, 371 00:31:06,600 --> 00:31:13,000 ja täällä näet tämän linjan, joka sanoo, "Reading symboleja / home / 372 00:31:13,000 --> 00:31:17,680 jharvard/section5/buggy1. " 373 00:31:17,680 --> 00:31:22,060 Ja jos kaikki menee hyvin, näet sen tulostaa viestin, joka näyttää tältä. 374 00:31:22,060 --> 00:31:25,500 Se tulee lukea symboleja, se tulee sanoa "Luen symbolit teidän suoritettavan tiedoston," 375 00:31:25,500 --> 00:31:29,900 ja sitten se on tämä "valmis" viestin tänne. 376 00:31:29,900 --> 00:31:35,410 Jos näet jonkin muun vaihtelua tämän, tai näet se ei löytänyt symbolit 377 00:31:35,410 --> 00:31:41,460 tai jotain, mitä se tarkoittaa, että et vain ole kääntänyt suoritettavia kunnolla. 378 00:31:41,460 --> 00:31:49,980 Kun kääntää ohjelmia käytettäväksi GDB, meidän on käytettävä että erikois-g lippu, 379 00:31:49,980 --> 00:31:54,540 ja se on tehty oletuksena Jos käännät ohjelmia, vain kirjoittamalla tehdä 380 00:31:54,540 --> 00:31:59,320 tai tehdä buginen tai tehdä takaisin, mitään näistä. 381 00:31:59,320 --> 00:32:07,800 Mutta jos olet koota manuaalisesti clang, niin sinun täytyy mennä ja sisällytetäänkö-g lippu. 382 00:32:07,800 --> 00:32:10,310 >> Tässä vaiheessa, nyt meillä on GDB nopeasti, 383 00:32:10,310 --> 00:32:12,310 se on melko helppo käyttää ohjelmaa. 384 00:32:12,310 --> 00:32:19,740 Voimme joko kirjoittaa aikavälillä, tai voimme vain kirjoittaa r. 385 00:32:19,740 --> 00:32:22,820 Useimmat GDB komennot voidaan lyhentää. 386 00:32:22,820 --> 00:32:25,940 Yleensä vain yksi tai pari kirjainta, mikä on ihan kiva. 387 00:32:25,940 --> 00:32:30,980 Joten Saad, jos kirjoitat r ja paina Enter, mitä tapahtuu? 388 00:32:30,980 --> 00:32:39,390 [Saad] Minulla SIGSEGV, segmentointi vika, ja sitten kaikki tämä siansaksaa. 389 00:32:39,390 --> 00:32:43,650 >> Joo. 390 00:32:43,650 --> 00:32:47,990 Kuten näemme ruudulla juuri nyt, ja kuten Saad sanoi, 391 00:32:47,990 --> 00:32:53,430 kun kirjoitat ajaa tai r ja paina Enter, emme silti saman seg vika. 392 00:32:53,430 --> 00:32:55,830 Joten käyttäen GDB ei ratkaise ongelmaa. 393 00:32:55,830 --> 00:32:59,120 Mutta se antaa meille joitakin siansaksaa, ja käy ilmi, että tämä kapulakieli 394 00:32:59,120 --> 00:33:03,080 oikeastaan ​​kertoo meille, missä se tapahtuu. 395 00:33:03,080 --> 00:33:10,680 Jäsentää tätä vähän, tämä ensimmäinen bitti on toiminto, jossa kaikki menee pieleen. 396 00:33:10,680 --> 00:33:20,270 On tämä __ strcmp_sse4_2, ja se kertoo meille, että se tapahtuu tämän tiedoston 397 00:33:20,270 --> 00:33:29,450 kutsutaan sysdeps/i386, kaikki tämä taas eräänlainen sotku - mutta linja 254. 398 00:33:29,450 --> 00:33:31,670 Se on eräänlainen vaikea jäsentää. Yleensä kun näet juttuja kuten tämä, 399 00:33:31,670 --> 00:33:38,770 tämä tarkoittaa, että se on segmentti Virhesovellus yhdessä järjestelmän kirjastoista. 400 00:33:38,770 --> 00:33:43,220 Joten jotain tekemistä strcmp. Olette nähneet strcmp ennen. 401 00:33:43,220 --> 00:33:52,730 Ei liian hullu, mutta tarkoittaako tämä, että strcmp on rikki tai että siellä on ongelma strcmp? 402 00:33:52,730 --> 00:33:57,110 Mitä luulet, Alexander? 403 00:33:57,110 --> 00:34:04,890 [Alexander] Onko tuo - on 254 linja? Ja - ei binary, mutta se ei ole heidän katot, 404 00:34:04,890 --> 00:34:10,590 ja sitten on toinen kieli kullekin toiminnolle. Onko se 254 tähän toimintaan, tai -? 405 00:34:10,590 --> 00:34:21,460 >> On line 254. Se näyttää tältä. S tiedosto, joten se assembly luultavasti. 406 00:34:21,460 --> 00:34:25,949 >> Mutta kai entistä kiireellisempi asia on, koska olemme saaneet SEG vika, 407 00:34:25,949 --> 00:34:29,960 ja se näyttää että se tulee strcmp toiminto, 408 00:34:29,960 --> 00:34:38,030 tämä tarkoita, että silloin strcmp on rikki? 409 00:34:38,030 --> 00:34:42,290 Sen ei pitäisi, toivottavasti. Joten koska sinulla on segmentointi vika 410 00:34:42,290 --> 00:34:49,480 yhdessä järjestelmän toimintoja, tyypillisesti se tarkoittaa, että et vain ole kutsuneet sitä oikein. 411 00:34:49,480 --> 00:34:52,440 Nopein tapa selvittää, mitä todella tapahtuu 412 00:34:52,440 --> 00:34:55,500 kun näet jotain hullua, kuten tämä, kun näet SEG vika, 413 00:34:55,500 --> 00:34:59,800 varsinkin jos sinulla on ohjelma, joka on käytössä enemmän kuin vain tärkeimmät, 414 00:34:59,800 --> 00:35:03,570 on käyttää backtrace. 415 00:35:03,570 --> 00:35:13,080 I lyhenteenä backtrace kirjoittamalla bt, toisin kuin täyden backtrace sana. 416 00:35:13,080 --> 00:35:16,510 Mutta Charlotte, mitä tapahtuu, kun kirjoitat bt ja paina Enter? 417 00:35:16,510 --> 00:35:23,200 [Charlotte] Se näyttää minulle kaksi riviä, rivi 0 ja linja 1. 418 00:35:23,200 --> 00:35:26,150 >> Joo. Joten rivi 0 ja linja 1. 419 00:35:26,150 --> 00:35:34,560 Nämä ovat todellisia pino kehyksiä, jotka olivat tällä hetkellä pelata, kun ohjelma kaatui. 420 00:35:34,560 --> 00:35:42,230 Alkaen ylimmän kehyksen, kehys 0, ja menee alimmaisen, joka on runko 1. 421 00:35:42,230 --> 00:35:45,140 Meidän päällimmäinen kehys on strcmp kehys. 422 00:35:45,140 --> 00:35:50,080 Voit ajatella tätä samanlainen ongelma olimme juuri tekemässä tietokilpailu osoittimet, 423 00:35:50,080 --> 00:35:54,890 jossa meillä oli vaihtaa pinokehys päälle tärkeimmistä pinokehys, 424 00:35:54,890 --> 00:35:59,700 ja meillä oli muuttujat swap käytti päälle muuttujien tärkein käytti. 425 00:35:59,700 --> 00:36:08,440 Täällä meidän Crash tapahtui meidän strcmp toiminto, jota kutsuttiin meidän päätehtävä, 426 00:36:08,440 --> 00:36:14,370 ja backtrace antaa meille vain toimintoihin, joissa asioita epäonnistui, 427 00:36:14,370 --> 00:36:16,440 mutta se on myös kertoo meille, missä kaikki oli soitti. 428 00:36:16,440 --> 00:36:18,830 Joten jos vieritä hieman oikealle, 429 00:36:18,830 --> 00:36:26,110 Voimme nähdä, että joo, olimme line 254 Tämän strcmp-sse4.s tiedosto. 430 00:36:26,110 --> 00:36:32,540 Mutta puhelu tehtiin buggy1.c, rivi 6. 431 00:36:32,540 --> 00:36:35,960 Joten se tarkoittaa voimme tehdä - on, voimme vain mennä tarkistaa ja nähdä, mitä oli tekeillä 432 00:36:35,960 --> 00:36:39,930 klo buggy1.c, rivi 6. 433 00:36:39,930 --> 00:36:43,780 Jälleen on olemassa pari tapaa tehdä tätä. Yksi on poistuaksesi GDB 434 00:36:43,780 --> 00:36:49,460 tai pyydä koodia avoinna toisessa ikkunassa ja ristiviittaus. 435 00:36:49,460 --> 00:36:54,740 Tämä, ja sinänsä, on aika kätevä, sillä nyt jos olet aukioloajat 436 00:36:54,740 --> 00:36:57,220 ja sinulla seg vika ja sinun TF on ihmetellyt, mihin kaikki oli murtaa, 437 00:36:57,220 --> 00:36:59,710 voit vain sanoa, "Voi, rivi 6. En tiedä mitä tapahtuu, 438 00:36:59,710 --> 00:37:03,670 mutta jotain linjaa 6 aiheuttaa minun ohjelma murtaa. " 439 00:37:03,670 --> 00:37:10,430 Toinen tapa tehdä se on, voit käyttää tätä komentoa kutsutaan luettelon GDB. 440 00:37:10,430 --> 00:37:13,650 Voit myös lyhentää sitä l.. 441 00:37:13,650 --> 00:37:18,910 Joten jos me osuma l, mitä me saamme täällä? 442 00:37:18,910 --> 00:37:21,160 Saamme koko joukko outoja juttuja. 443 00:37:21,160 --> 00:37:26,030 Tämä on todellinen kokoonpano koodi 444 00:37:26,030 --> 00:37:29,860 joka on strcmp_sse4_2. 445 00:37:29,860 --> 00:37:32,440 Tämä näyttää ikään funky, 446 00:37:32,440 --> 00:37:36,520 ja syy Saamme tämä johtuu juuri nyt, 447 00:37:36,520 --> 00:37:40,160 GDB on meille kehyksen 0. 448 00:37:40,160 --> 00:37:43,070 >> Niin milloin katsomme muuttujia, tahansa katsomme lähdekoodia, 449 00:37:43,070 --> 00:37:50,530 me tarkastelemme lähdekoodin, joka on tekemisissä pinokehys emme tällä hetkellä tuumaa 450 00:37:50,530 --> 00:37:53,200 Joten saadakseen jotain mielekästä, meidän on 451 00:37:53,200 --> 00:37:57,070 siirtyä pinokehys että järkevämpää. 452 00:37:57,070 --> 00:38:00,180 Tässä tapauksessa pääasiallinen pinokehys tekisi hieman mielessä 453 00:38:00,180 --> 00:38:02,680 koska se oli todella koodin että me kirjoitti. 454 00:38:02,680 --> 00:38:05,330 Ei strcmp koodin. 455 00:38:05,330 --> 00:38:08,650 Näin voit siirtyä kehysten välillä, tässä tapauksessa, koska meillä on kaksi, 456 00:38:08,650 --> 00:38:10,430 meillä on 0 ja 1, 457 00:38:10,430 --> 00:38:13,650 teet että ylös ja alas-komentoja. 458 00:38:13,650 --> 00:38:18,480 Jos minä siirtyä yhden ruudun, 459 00:38:18,480 --> 00:38:21,770 nyt olen pääasiassa pinokehys. 460 00:38:21,770 --> 00:38:24,330 Voin siirtyä alas mennä takaisin missä olin, 461 00:38:24,330 --> 00:38:32,830 nousevat taas, mene alas, ja mene ylös. 462 00:38:32,830 --> 00:38:39,750 Jos joskus tee ohjelma GDB, saat kaatua, saat backtrace, 463 00:38:39,750 --> 00:38:42,380 ja huomaat, että se on joissakin tiedoston et tiedä mitä on tekeillä. 464 00:38:42,380 --> 00:38:45,460 Yrität luettelosta koodi ei näytä tutulta, 465 00:38:45,460 --> 00:38:48,150 katsomaan teidän kehyksiä ja selvittää, missä olet. 466 00:38:48,150 --> 00:38:51,010 Olet luultavasti väärässä pinokehys. 467 00:38:51,010 --> 00:38:58,760 Tai ainakin olet pinokehys joka ei ole yksi, että voit todella debug. 468 00:38:58,760 --> 00:39:03,110 Nyt olemme sopiva pinokehys, olemme pääasiassa, 469 00:39:03,110 --> 00:39:08,100 Nyt voimme käyttää luetteloa komennolla selvittää mikä linja oli. 470 00:39:08,100 --> 00:39:13,590 Ja voit nähdä sen, se tulostetaan se meille täällä. 471 00:39:13,590 --> 00:39:19,470 Mutta voimme lyödä listata kaikki samat, ja luettelo antaa meille tämän mukava tuloste 472 00:39:19,470 --> 00:39:23,920 varsinaisen lähdekoodin, joka on meneillään täällä. 473 00:39:23,920 --> 00:39:26,420 >> Erityisesti voimme tarkastella rivillä 6. 474 00:39:26,420 --> 00:39:29,330 Voimme nähdä, mitä täällä tapahtuu. 475 00:39:29,330 --> 00:39:31,250 Ja näyttää siltä Teemme merkkijono vertailu 476 00:39:31,250 --> 00:39:41,050 välinen merkkijono "CS50 kiviä" ja argv [1]. 477 00:39:41,050 --> 00:39:45,700 Jotain tästä oli kaatuu. 478 00:39:45,700 --> 00:39:54,120 Joten Missy, onko teillä ajatuksia siitä, mitä voisi olla tekeillä? 479 00:39:54,120 --> 00:39:59,400 [Missy] En tiedä miksi se kaatuu. >> Et tiedä miksi se kaatuu? 480 00:39:59,400 --> 00:40:02,700 Jimmy, mitään ajatuksia? 481 00:40:02,700 --> 00:40:06,240 [Jimmy] En ole aivan varma, mutta viimeinen kerta käytimme merkkijono vertailla, 482 00:40:06,240 --> 00:40:10,260 tai strcmp, meillä oli jotain kolme erilaista tapausta sen alle. 483 00:40:10,260 --> 00:40:12,800 Meillä ei ollut ==, en usko, oikeassa että ensimmäisellä rivillä. 484 00:40:12,800 --> 00:40:16,700 Sen sijaan se oli jaettu kolmeen, ja yksi oli == 0, 485 00:40:16,700 --> 00:40:19,910 yksi oli <0, luulen, ja yksi oli> 0. 486 00:40:19,910 --> 00:40:22,590 Joten ehkä jotain? >> Joo. Eli siellä on asiaa 487 00:40:22,590 --> 00:40:27,200 ja teemme vertailua oikein? 488 00:40:27,200 --> 00:40:31,660 Stella? Mitään ajatuksia? 489 00:40:31,660 --> 00:40:38,110 [Stella] En ole varma. >> Etkö ole varma. Daniel? Ajatuksia? Okei. 490 00:40:38,110 --> 00:40:44,770 On käynyt ilmi, mitä tapahtuu täällä on, kun meillä oli ohjelmassa 491 00:40:44,770 --> 00:40:48,370 ja saimme segmenteille vika, kun juoksi ohjelman ensimmäistä kertaa, Daniel, 492 00:40:48,370 --> 00:40:50,800 annoit sen mitään komentoriviargumentteja? 493 00:40:50,800 --> 00:40:58,420 [Daniel] No >> Nro Tässä tapauksessa, mikä on arvo argv [1]? 494 00:40:58,420 --> 00:41:00,920 >> Ei arvoa. >> Oikea. 495 00:41:00,920 --> 00:41:06,120 No, ei ole sopiva merkkijono arvoa. 496 00:41:06,120 --> 00:41:10,780 Mutta on jotain arvoa. Mikä on arvo, joka saa säilyttää siellä? 497 00:41:10,780 --> 00:41:15,130 >> Roskat arvo? >> Se on joko roskat arvoa tai, tässä tapauksessa, 498 00:41:15,130 --> 00:41:19,930 loppuun argv matriisi on aina päättyy null. 499 00:41:19,930 --> 00:41:26,050 Joten mitä todella todella tallennetaan on nolla. 500 00:41:26,050 --> 00:41:30,810 Toinen tapa ratkaista tämä, sen sijaan ajatella sitä kautta, 501 00:41:30,810 --> 00:41:33,420 on kokeilla tulostaa sitä. 502 00:41:33,420 --> 00:41:35,880 Tämä on, jos olin sanomassa, että käyttämällä GDB on suuri, 503 00:41:35,880 --> 00:41:40,640 koska voit tulostaa kaikki muuttujat, kaikki arvot, jotka haluat 504 00:41:40,640 --> 00:41:43,230 Käyttämällä tätä kätevä-dandy p komento. 505 00:41:43,230 --> 00:41:48,520 Joten jos kirjoitat p ja sitten kirjoita muuttujan tai nimen muuttujan, 506 00:41:48,520 --> 00:41:55,320 sanovat, argc, näen että argc on 1. 507 00:41:55,320 --> 00:42:01,830 Jos haluan tulostaa argv [0], voin tehdä sen vain. 508 00:42:01,830 --> 00:42:04,840 Ja kuten näimme, argv [0] on aina nimi ohjelman 509 00:42:04,840 --> 00:42:06,910 aina nimi suoritettavan. 510 00:42:06,910 --> 00:42:09,740 Täällä näet se sai koko polku. 511 00:42:09,740 --> 00:42:15,920 Voin myös tulostaa argv [1] ja katso mitä tapahtuu. 512 00:42:15,920 --> 00:42:20,890 >> Täällä saimme tällaista mystistä arvoa. 513 00:42:20,890 --> 00:42:23,890 Saimme tätä 0x0. 514 00:42:23,890 --> 00:42:27,850 Muista alussa aikavälillä, kun puhuimme heksadesimaaliluvut? 515 00:42:27,850 --> 00:42:34,680 Tai että pieni kysymys lopussa PSET 0 miten edustaa 50 hex? 516 00:42:34,680 --> 00:42:39,410 Tapamme kirjoittaa hex numerot CS, vain ei pidä sekoittaa itse 517 00:42:39,410 --> 00:42:46,080 kanssa desimaalilukuja, on aina etuliite niitä 0x. 518 00:42:46,080 --> 00:42:51,420 Joten tämä 0x etuliite aina vain sitä tulkitsevat seuraavat numeron heksadesimaaliluvuksi, 519 00:42:51,420 --> 00:42:57,400 eikä merkkijono, ei desimaalilukuna, ei binäärilukuna. 520 00:42:57,400 --> 00:43:02,820 Koska numero 5-0 on kelvollinen numero heksadesimaalimuodossa. 521 00:43:02,820 --> 00:43:06,240 Ja se on numeron desimaali, 50. 522 00:43:06,240 --> 00:43:10,050 Joten tämä on, miten me disambiguate. 523 00:43:10,050 --> 00:43:14,860 Joten 0x0 tarkoittaa heksadesimaali 0, joka on myös desimaalin 0, binääri 0. 524 00:43:14,860 --> 00:43:17,030 Se on vain arvo 0. 525 00:43:17,030 --> 00:43:22,630 On käynyt ilmi, että tämä on mitä null on oikeastaan ​​muistiin. 526 00:43:22,630 --> 00:43:25,940 Null on vain 0. 527 00:43:25,940 --> 00:43:37,010 Tässä elementti säilytettiin argv [1] on nolla. 528 00:43:37,010 --> 00:43:45,220 Joten yritämme verrata meidän "CS50 rocks" merkkijonon null merkkijono. 529 00:43:45,220 --> 00:43:48,130 Joten dereferencing null, yrittäen päästä asioita null, 530 00:43:48,130 --> 00:43:55,050 nämä ovat yleensä menossa aiheuttaa jonkinlaista segmentoitumisen vika tai muita pahoja asioita tapahtuu. 531 00:43:55,050 --> 00:43:59,350 Ja näyttää siltä, ​​että strcmp ei tarkasta 532 00:43:59,350 --> 00:44:04,340 onko olet hyväksyttiin arvo on null. 533 00:44:04,340 --> 00:44:06,370 Pikemminkin se vain menee eteenpäin, yrittää tehdä sen asian, 534 00:44:06,370 --> 00:44:14,640 ja jos se segmentti vikoja, se segmentti vikoja, ja se on sinun ongelmasi. Sinun täytyy korjata se. 535 00:44:14,640 --> 00:44:19,730 Todella nopeasti, miten voi voimme korjata tämän ongelman? Charlotte? 536 00:44:19,730 --> 00:44:23,540 [Charlotte] Voit tarkistaa käytössä jos. 537 00:44:23,540 --> 00:44:32,240 Joten jos argv [1] on nolla, == 0, palauta 1, tai jotain [käsittämätön]. 538 00:44:32,240 --> 00:44:34,590 >> Joo. Niin, että yksi hyvä tapa tehdä se, koska voimme tarkistaa, 539 00:44:34,590 --> 00:44:39,230 arvo aiomme kulkeutua strcmp, argv [1], on se null? 540 00:44:39,230 --> 00:44:45,830 Jos se on tyhjä, niin voimme sanoa okei, keskeytä. 541 00:44:45,830 --> 00:44:49,450 >> Yleisempää tapa tehdä tämä on käyttää argc arvoa. 542 00:44:49,450 --> 00:44:52,040 Voit nähdä täällä alussa tärkein, 543 00:44:52,040 --> 00:44:58,040 me pois, että ensimmäinen testi että me yleensä teemme, kun käytämme komentoriviargumentteja, 544 00:44:58,040 --> 00:45:05,240 joka on testata onko meidän argc arvoa odotamme. 545 00:45:05,240 --> 00:45:10,290 Tässä tapauksessa me odotamme vähintään kaksi argumenttia, 546 00:45:10,290 --> 00:45:13,660 ohjelman nimi plus yksi muista. 547 00:45:13,660 --> 00:45:17,140 Koska aiomme käyttää toisen väitteen täällä. 548 00:45:17,140 --> 00:45:21,350 Niin ottaa jonkinlainen testi etukäteen, ennen meidän strcmp puhelua 549 00:45:21,350 --> 00:45:37,390 että testit onko argv on vähintään 2, voisi myös tehdä samaa sellainen asia. 550 00:45:37,390 --> 00:45:40,620 Voimme nähdä, jos se toimii suorittamalla ohjelma uudelleen. 551 00:45:40,620 --> 00:45:45,610 Voit aina käynnistää ohjelman puitteissa GDB, mikä on todella mukavaa. 552 00:45:45,610 --> 00:45:49,310 Voit juosta, ja kun kulkea argumentteja oman ohjelman, 553 00:45:49,310 --> 00:45:53,060 ohitat ne kun soitat ajaa, ei kun käynnistät GDB. 554 00:45:53,060 --> 00:45:57,120 Näin voit pitää vetoamalla ohjelman eri argumentteja kerta. 555 00:45:57,120 --> 00:46:08,080 Joten juosta, tai uudelleen, voin kirjoittaa R, ja katsotaan mitä tapahtuu, jos me kirjoita "Hello". 556 00:46:08,080 --> 00:46:11,140 Se aina kysyy haluatko käynnistää sen uudelleen alusta. 557 00:46:11,140 --> 00:46:17,490 Yleensä et halua aloittaa sitä alusta uudelleen. 558 00:46:17,490 --> 00:46:25,010 Ja tässä vaiheessa, se käynnistyy uudelleen uudelleen, se tulostuu 559 00:46:25,010 --> 00:46:28,920 ohjelma, jota käynnissä, buggy1, jossa väite Hei, 560 00:46:28,920 --> 00:46:32,720 ja se tulostaa tämän standardin ulos, se sanoo, "Saat D" surulliset kasvot. 561 00:46:32,720 --> 00:46:37,610 Mutta emme segmentti vika. Se sanoi, että prosessi lähtenyt normaalisti. 562 00:46:37,610 --> 00:46:39,900 Niin että näyttää aika hyvältä. 563 00:46:39,900 --> 00:46:43,050 Ei enää SEG vikaa, teimme sen ohi, 564 00:46:43,050 --> 00:46:48,190 niin se näyttää, että oli todellakin seg vika vika että olimme tulossa. 565 00:46:48,190 --> 00:46:51,540 Valitettavasti se kertoo meille, että saamme D 566 00:46:51,540 --> 00:46:54,090 >> Voimme mennä takaisin ja katsoa koodi ja nähdä mitä siellä tapahtuu 567 00:46:54,090 --> 00:46:57,980 selvittää, mitä oli - miksi se oli kertomassa meille, että saimme D. 568 00:46:57,980 --> 00:47:03,690 Katsotaanpa, tässä on tämä printf sanoa, että sinulla D. 569 00:47:03,690 --> 00:47:08,540 Jos me luettelosta kuin jatkat kirjoittamista luetteloon, se pitää iteroimalla alas läpi ohjelman 570 00:47:08,540 --> 00:47:10,940 joten se näyttää muutaman ensimmäisen rivin ohjelman. 571 00:47:10,940 --> 00:47:15,450 Sitten se näytämme seuraavassa muutama rivi, ja seuraavaksi murikka ja seuraavan palan. 572 00:47:15,450 --> 00:47:18,240 Ja se tulee pitää yrittää mennä alas. 573 00:47:18,240 --> 00:47:21,180 Ja nyt me saamme "rivinumero 16 on alueen ulkopuolella." 574 00:47:21,180 --> 00:47:23,940 Koska se on vain 15 riviä. 575 00:47:23,940 --> 00:47:30,310 Jos saat tähän pisteeseen ja mietit, "Mitä voin tehdä?" Voit käyttää apuna komentoa. 576 00:47:30,310 --> 00:47:34,340 Käytä apua ja sitten antaa sen nimen komennon. 577 00:47:34,340 --> 00:47:36,460 Ja näet GDB antaa meille kaikille tällaista kamaa. 578 00:47:36,460 --> 00:47:43,870 Se sanoo: "Ilman väitettä, luettelee kymmenen enemmän rivejä jälkeen tai sen edellisen listalle. 579 00:47:43,870 --> 00:47:47,920 List - luetellaan kymmenen riviä ennen - " 580 00:47:47,920 --> 00:47:52,960 Joten kokeile luettelossa miinus. 581 00:47:52,960 --> 00:47:57,000 Ja että luetellaan 10 riviä edellisen, voit leikkiä luettelon hieman. 582 00:47:57,000 --> 00:48:02,330 Voit tehdä listan, lista - voit jopa antaa luetella useita, kuten luettelon 8, 583 00:48:02,330 --> 00:48:07,500 ja se tulee luettelo 10 riviä noin linjan 8. 584 00:48:07,500 --> 00:48:10,290 Ja voit nähdä mitä täällä tapahtuu on sinulla yksinkertainen, jos muu. 585 00:48:10,290 --> 00:48:13,980 Jos kirjoitat CS50 kiviä, se tulostaa "Saat A." 586 00:48:13,980 --> 00:48:16,530 Muuten se tulostaa "Saat D." 587 00:48:16,530 --> 00:48:23,770 Bummer kaupunki. Selvä. Kyllä? 588 00:48:23,770 --> 00:48:26,730 >> [Daniel] Joten kun olen yrittänyt tehdä CS50 kiviä ilman lainausmerkkejä, 589 00:48:26,730 --> 00:48:29,290 se sanoo "Saat D." 590 00:48:29,290 --> 00:48:32,560 Tarvitsin lainausmerkkejä saada sitä toimimaan, miksi näin on? 591 00:48:32,560 --> 00:48:38,490 >> Joo. On käynyt ilmi, että kun - tämä on toinen hauska pieni makupala - 592 00:48:38,490 --> 00:48:47,900 kun suoritat ohjelman, jos käyttää sitä ja me kirjoita CS50 kiviä, 593 00:48:47,900 --> 00:48:50,800 aivan kuten Daniel sanoi hän, ja sinä Enter, 594 00:48:50,800 --> 00:48:52,870 se vielä sanoo saamme D 595 00:48:52,870 --> 00:48:55,580 Ja kysymys on, miksi tämä on? 596 00:48:55,580 --> 00:49:02,120 Ja näyttää siltä, ​​että sekä pääte-ja GDB jäsentää näitä kahtena erillisenä argumentteja. 597 00:49:02,120 --> 00:49:04,800 Koska kun siellä tilaa, että implisiittisen kuin 598 00:49:04,800 --> 00:49:08,730 Ensimmäinen väite päättyi, seuraava argumentti on alkamassa. 599 00:49:08,730 --> 00:49:13,260 Tapa yhdistää nämä kahteen tai anteeksi, tulee yksi argumentti, 600 00:49:13,260 --> 00:49:18,510 on käyttää lainausmerkkejä. 601 00:49:18,510 --> 00:49:29,560 Joten nyt, jos me laita se lainausmerkkeihin ja ajaa se uudelleen, saamme A. 602 00:49:29,560 --> 00:49:38,780 Joten kertaus, ilman lainausmerkkejä, CS50 ja kiviä jäsennetään kaksi erillistä väitettä. 603 00:49:38,780 --> 00:49:45,320 Lainausmerkkeihin, se jäsentää, koska yhden argumentin kokonaan. 604 00:49:45,320 --> 00:49:53,070 >> Voimme nähdä tätä keskeytyskohta. 605 00:49:53,070 --> 00:49:54,920 Toistaiseksi olemme ohjanneet ohjelmaa, ja se on ollut käynnissä 606 00:49:54,920 --> 00:49:58,230 kunnes joko se segmentti vikoja tai osumia virhe 607 00:49:58,230 --> 00:50:05,930 tai kunnes se on lähtenyt, ja kaikki on ollut täysin kunnossa. 608 00:50:05,930 --> 00:50:08,360 Tämä ei ole välttämättä kaikkein hyödyllinen asia, sillä joskus 609 00:50:08,360 --> 00:50:11,840 sinulla on virhe ohjelmassa, mutta se ei aiheuta segmentointi vika. 610 00:50:11,840 --> 00:50:16,950 Se ei ole aiheuttaa ohjelman lopettamaan tai mitään sellaista. 611 00:50:16,950 --> 00:50:20,730 Tapa saada GDB keskeyttää ohjelman tietyssä vaiheessa 612 00:50:20,730 --> 00:50:23,260 on asettaa murtuessa. 613 00:50:23,260 --> 00:50:26,520 Voit joko tehdä tämän asettamalla keskeytyskohta on funktion nimi 614 00:50:26,520 --> 00:50:30,770 tai voit asettaa keskeytyskohdan tietyn koodirivin. 615 00:50:30,770 --> 00:50:34,450 Haluan asettaa raja-arvot on funktioiden nimiä, koska - helppo muistaa, 616 00:50:34,450 --> 00:50:37,700 ja jos todella mennä ja muuttaa lähdekoodia jopa hieman, 617 00:50:37,700 --> 00:50:42,020 Sitten sinun murtuessa todella yöpyä samassa paikassa omassa koodiin. 618 00:50:42,020 --> 00:50:44,760 Taas jos käytät rivinumerot, ja rivinumerot muuttua 619 00:50:44,760 --> 00:50:51,740 koska lisäät tai poista koodia, niin sinun keskeytyskohtia kaikki täysin sekaisin. 620 00:50:51,740 --> 00:50:58,590 Yksi yleisimpiä asioita teen on asetettu keskeytyskohta on päätehtävä. 621 00:50:58,590 --> 00:51:05,300 Usein minä käynnistyä GDB, minä tyyppi b tärkein Enter, ja että tulee asettaa keskeytyskohta 622 00:51:05,300 --> 00:51:10,630 on tärkein ominaisuus, joka vain sanoo "keskeyttää ohjelman heti kun alkaa kulua" 623 00:51:10,630 --> 00:51:17,960 ja näin, kun minä ajaa minun ohjelma, vaikkapa CS50 kiviä kaksi argumenttia 624 00:51:17,960 --> 00:51:24,830 ja paina Enter, se pääsee päätehtävä ja se pysähtyy heti ensimmäinen rivi, 625 00:51:24,830 --> 00:51:30,620 juuri ennen sen arvioi strcmp toimintoa. 626 00:51:30,620 --> 00:51:34,940 >> Koska olen keskeytetty, nyt voin aloittaa mucking ympäri ja nähdä mitä tapahtuu 627 00:51:34,940 --> 00:51:40,250 kaikki eri muuttujia, joita johdetaan oman ohjelman. 628 00:51:40,250 --> 00:51:43,670 Täällä voin tulostaa argc ja katso mitä tapahtuu. 629 00:51:43,670 --> 00:51:50,030 Nähdä, että argc on 3, koska se sai 3 eri arvoja sen. 630 00:51:50,030 --> 00:51:54,060 Se sai ohjelman nimi, se sai ensimmäisen väitteen ja toinen argumentti. 631 00:51:54,060 --> 00:52:09,330 Voimme tulostaa ne ulos katsomalla argv [0], argv [1], ja argv [2]. 632 00:52:09,330 --> 00:52:12,030 Nyt voit myös nähdä, miksi tämä strcmp puhelu menossa epäonnistua, 633 00:52:12,030 --> 00:52:21,650 koska näet että se hajosi CS50 ja kiviä kahteen erilliseen argumentteja. 634 00:52:21,650 --> 00:52:27,250 Tässä vaiheessa, kun olet osuma keskeytyskohdan, voit jatkaa vaiheeseen kautta ohjelma 635 00:52:27,250 --> 00:52:32,920 rivi riviltä, ​​eikä aloittaa ohjelma uudelleen. 636 00:52:32,920 --> 00:52:35,520 Joten jos et halua aloittaa ohjelma uudelleen ja jatka lukeminen tässä, 637 00:52:35,520 --> 00:52:41,970 voit Jatka-komennon ja jatkaa ajaa ohjelman loppuun. 638 00:52:41,970 --> 00:52:45,010 Aivan kuten se teki täällä. 639 00:52:45,010 --> 00:52:54,880 Kuitenkin, jos käynnistä ohjelma, CS50 kiviä, se iskee minun keskeytyskohdan jälleen 640 00:52:54,880 --> 00:52:59,670 ja tällä kertaa, jos en halua vain mennä kaikki läpi muun ohjelman 641 00:52:59,670 --> 00:53:08,040 Voin käyttää seuraavaa komentoa, joka olen myös lyhenteenä n. 642 00:53:08,040 --> 00:53:12,960 Ja tämä selata ohjelman rivi. 643 00:53:12,960 --> 00:53:17,530 Joten voit katsella asioita suorittaa, koska muuttujia muutos, kun asiat saada päivitetään. 644 00:53:17,530 --> 00:53:21,550 Mikä on ihan kiva. 645 00:53:21,550 --> 00:53:26,570 Muut viileä asia on pikemminkin kuin toistaa samaa komentoa uudestaan ​​ja uudestaan ​​ja uudestaan, 646 00:53:26,570 --> 00:53:30,670 jos vain enteriä - joten tässä näette en ole kirjoittanut mitään - 647 00:53:30,670 --> 00:53:33,780 jos olen vain Enter, se toistaa edellisen komennon, 648 00:53:33,780 --> 00:53:36,900 tai edellinen GDB komento minä vain laittaa sisään 649 00:53:36,900 --> 00:53:56,000 Voin pitää lyödä Anna ja se tulee säilyttää tehostamalla läpi minun koodin rivi riviltä. 650 00:53:56,000 --> 00:53:59,310 Kehotan teitä menemään tarkistaa muiden buginen ohjelmista. 651 00:53:59,310 --> 00:54:01,330 Meillä ei ole aikaa saada läpi ne kaikki tänään osiossa. 652 00:54:01,330 --> 00:54:05,890 Lähdekoodi on siellä, joten voit eräänlainen nähdä mitä tapahtuu 653 00:54:05,890 --> 00:54:07,730 kulissien takana, jos saat todella jumissa, 654 00:54:07,730 --> 00:54:11,940 mutta ainakin juuri harjoitella käynnistämistä GDB, 655 00:54:11,940 --> 00:54:13,940 käynnissä ohjelma kunnes se hajoaa sinua, 656 00:54:13,940 --> 00:54:18,260 saada backtrace, kuvauksen, mitä toimia romahdus oli, 657 00:54:18,260 --> 00:54:24,450 mitä linjaa se oli, tulostaa joitakin muuttujan arvot, 658 00:54:24,450 --> 00:54:30,140 vain niin saat tuntuman siitä, koska se todella auttaa sinua eteenpäin. 659 00:54:30,140 --> 00:54:36,340 Tässä vaiheessa aiomme lopettaa ulos GDB, johon et käytät lopettaa tai vain q. 660 00:54:36,340 --> 00:54:40,460 Jos ohjelma on keskellä käynnissä edelleen, ja se ei ole poistunut, 661 00:54:40,460 --> 00:54:43,510 se kysyy aina, "Oletko varma, haluatko todella lopettaa?" 662 00:54:43,510 --> 00:54:48,770 Voit painaa kyllä. 663 00:54:48,770 --> 00:54:55,250 >> Nyt olemme menossa katsomaan seuraava ongelma meillä on, mikä on kissa ohjelma. 664 00:54:55,250 --> 00:54:59,880 Jos katsot lyhyt suuntaamaan ja putket, näet, että Tommy käyttää tätä ohjelmaa 665 00:54:59,880 --> 00:55:07,540 että periaatteessa tulostaa kaikki tuotos tiedoston näytölle. 666 00:55:07,540 --> 00:55:12,660 Joten jos juoksen kissa, tämä on oikeastaan ​​sisäänrakennettu ohjelma laitteen 667 00:55:12,660 --> 00:55:16,860 ja jos sinulla on Mac, voit tehdä tämän Macin myös, jos avaat päätteen. 668 00:55:16,860 --> 00:55:25,630 Ja me - kissa, sanokaamme, cp.c, ja paina Enter. 669 00:55:25,630 --> 00:55:29,640 Mitä tämä teki, jos me siirry ylös hieman ja nähdä, missä me juoksi linja, 670 00:55:29,640 --> 00:55:40,440 tai jos me juoksi kissa komennon, se kirjaimellisesti vain tulostaa sisältöä cp.c meidän näyttöön. 671 00:55:40,440 --> 00:55:44,140 Voimme käyttää sitä uudelleen ja voit laittaa useita tiedostoja yhteen. 672 00:55:44,140 --> 00:55:49,880 Joten voit tehdä kissan cp.c, ja voimme myös liität cat.c tiedosto, 673 00:55:49,880 --> 00:55:53,250 mikä on ohjelma aiomme kirjoittaa, 674 00:55:53,250 --> 00:55:58,140 ja se tulee tulostaa sekä tiedostoja takaisin takaisin meidän näyttöön. 675 00:55:58,140 --> 00:56:05,490 Joten jos vierittää ylös hieman, näemme, että kun me juoksi tämän kissan cp.c, cat.c, 676 00:56:05,490 --> 00:56:17,110 ensin se tulostaa cp tiedosto, ja sitten sen alla, se tulostetaan cat.c tiedosto alas tänne. 677 00:56:17,110 --> 00:56:19,650 Me aiomme käyttää tätä vain saada meidän jalat märkä. 678 00:56:19,650 --> 00:56:25,930 Leikkiä yksinkertainen tulostus terminaaliin, miten se toimii. 679 00:56:25,930 --> 00:56:39,170 Jos kaverit avata kanssa gedit cat.c Enter, 680 00:56:39,170 --> 00:56:43,760 voit nähdä ohjelman aiomme kirjoittaa. 681 00:56:43,760 --> 00:56:48,980 Olemme mukana tässä mukava kattila levy, joten meidän ei tarvitse käyttää aikaa kirjoittamalla kaikki ulos. 682 00:56:48,980 --> 00:56:52,310 Olemme myös tarkistaa määrää argumenttien sisään 683 00:56:52,310 --> 00:56:56,910 Me tulostaa kiva käyttöohje. 684 00:56:56,910 --> 00:57:00,950 >> Tämä on sellainen asia, että taas, kuten olemme puhuneet, 685 00:57:00,950 --> 00:57:04,490 se on melkein kuin lihas muisti. 686 00:57:04,490 --> 00:57:07,190 Vain muistaa pitää tehdä samanlaista kamaa 687 00:57:07,190 --> 00:57:11,310 ja aina tulostaa jonkinlainen hyödyllisiä viestin 688 00:57:11,310 --> 00:57:17,670 niin että ihmiset osaavat ajaa ohjelmaa. 689 00:57:17,670 --> 00:57:21,630 Kissa, se on melko yksinkertainen, olemme juuri menossa läpi kaikki eri argumentteja 690 00:57:21,630 --> 00:57:24,300 jotka siirrettiin meidän ohjelmaan, ja aiomme tulostaa 691 00:57:24,300 --> 00:57:29,950 niiden sisältö ulos näytön yksi kerrallaan. 692 00:57:29,950 --> 00:57:35,670 Jotta tulostaa tiedostoja ulos näytön, aiomme tehdä jotain hyvin samanlaista 693 00:57:35,670 --> 00:57:38,120 mitä teimme lopussa tietokilpailu. 694 00:57:38,120 --> 00:57:45,350 Lopussa tietokilpailu, että vuokraus-ohjelma, meidän oli avata tiedoston, 695 00:57:45,350 --> 00:57:48,490 ja sitten meillä oli tulostaa sen. 696 00:57:48,490 --> 00:57:54,660 Tässä tapauksessa aiomme avata tiedoston, ja me aiomme lukea sen sijaan. 697 00:57:54,660 --> 00:58:00,630 Sitten menemme tulostaa, sijasta tiedoston, aiomme tulostaa näyttöön. 698 00:58:00,630 --> 00:58:05,830 Joten tulostaa näytölle olet kaikki tehnyt ennen kanssa printf. 699 00:58:05,830 --> 00:58:08,290 Joten se ei ole liian hullu. 700 00:58:08,290 --> 00:58:12,190 Mutta lukeminen tiedosto on eräänlainen outo. 701 00:58:12,190 --> 00:58:17,300 Menemme läpi vähän kerrallaan. 702 00:58:17,300 --> 00:58:20,560 Jos te mennä takaisin, että viime ongelma tietokilpailun, ongelma 33, 703 00:58:20,560 --> 00:58:27,280 ensimmäinen rivi, että aiomme tehdä täällä, avaa tiedosto, on hyvin samanlainen kuin mitä teimme siellä. 704 00:58:27,280 --> 00:58:36,370 Joten Stella, mitä se viiva näyttää, kun avaamme tiedoston? 705 00:58:36,370 --> 00:58:47,510 [Stella] Capital FILE *, tiedosto - >> Okei. >> - On yhtä suuri kuin fopen. >> Jep. 706 00:58:47,510 --> 00:58:55,980 Joka tässä tapauksessa on? Se on kommentti. 707 00:58:55,980 --> 00:59:06,930 >> Se on kommentoida? argv [i] ja r? 708 00:59:06,930 --> 00:59:11,300 >> Aivan. Aivan. Joten Stella on täysin oikeassa. 709 00:59:11,300 --> 00:59:13,720 Tämä on mitä rivi näyttää. 710 00:59:13,720 --> 00:59:19,670 Aiomme saada tiedoston stream muuttuja, säilytä se FILE *, joten kaikki lippikset, 711 00:59:19,670 --> 00:59:25,720 FILE *, ja nimi Tämä muuttuja tiedostoon. 712 00:59:25,720 --> 00:59:32,250 Voisimme kutsua sitä mitä haluamme. Voisimme kutsua sitä first_file tai file_i, mitä haluaisimme. 713 00:59:32,250 --> 00:59:37,590 Ja sitten tiedoston nimi hyväksyttiin komentorivillä tähän ohjelmaan. 714 00:59:37,590 --> 00:59:44,450 Joten se on tallennettuna argv [i,] ja sitten aiomme avata tämän tiedoston lukutilassa. 715 00:59:44,450 --> 00:59:48,100 Nyt kun olemme avannut tiedoston, mitä asia, että meillä on aina muistaa tehdä 716 00:59:48,100 --> 00:59:52,230 kun olemme avanneet tiedoston? Sulje se. 717 00:59:52,230 --> 00:59:57,220 Joten Missy, miten suljemme tiedoston? 718 00:59:57,220 --> 01:00:01,020 [Missy] fclose (tiedosto) >> fclose (tiedosto). Aivan. 719 01:00:01,020 --> 01:00:05,340 Suuri. Okei. Jos tarkastelemme tätä tehdä kommentin täällä, 720 01:00:05,340 --> 01:00:11,940 se sanoo, "Open argv [i] ja tulosta sen sisällön stdout." 721 01:00:11,940 --> 01:00:15,460 >> Standard ulos on outo nimi. Stdout on vain meidän tapamme 722 01:00:15,460 --> 01:00:22,880 haluamme tulostaa sen terminaalin, haluamme tulostaa sen vakiotulosteeseen stream. 723 01:00:22,880 --> 01:00:26,450 Voimme todella päästä eroon tästä kommentti täällä. 724 01:00:26,450 --> 01:00:36,480 Aion kopioida ja liittää sen jälkeen niinhän me teimme. 725 01:00:36,480 --> 01:00:41,290 Tässä vaiheessa, nyt joudumme lukemaan tiedostoa vähän kerrallaan. 726 01:00:41,290 --> 01:00:46,300 Olemme keskustelleet pari tapaa lukea tiedostoja. 727 01:00:46,300 --> 01:00:51,830 Mitkä ovat suosikkejasi toistaiseksi? 728 01:00:51,830 --> 01:00:57,960 Millä tavoin olet nähnyt tai muistatko, lukea tiedostoja? 729 01:00:57,960 --> 01:01:04,870 [Daniel] fread? >> Fread? Joten fread on yksi. Jimmy, tiedätkö mitään muita? 730 01:01:04,870 --> 01:01:12,150 [Jimmy] No >> Okei. Nope. Charlotte? Alexander? Kaikki muut? Okei. 731 01:01:12,150 --> 01:01:20,740 Eli toisilla on fgetc, on joka käytämme paljon. 732 01:01:20,740 --> 01:01:26,410 Mukana on myös fscanf; te nähdä kuvion täällä? 733 01:01:26,410 --> 01:01:29,170 Ne kaikki alkavat f. Mitään tekemistä tiedoston. 734 01:01:29,170 --> 01:01:35,260 On fread, fgetc, fscanf. Nämä ovat kaikki lukemisen toimintoja. 735 01:01:35,260 --> 01:01:49,120 Kirjoittamista varten meillä on fwrite, meillä on fputc sijasta fgetc. 736 01:01:49,120 --> 01:01:58,250 Olemme myös fprintf kuten näimme tietovisa. 737 01:01:58,250 --> 01:02:01,680 Koska tämä on ongelma, joka liittyy lukemisen tiedostosta, 738 01:02:01,680 --> 01:02:04,940 aiomme käyttää yhtä näistä kolmesta toiminnoista. 739 01:02:04,940 --> 01:02:10,890 Emme aio käyttää näitä toimintoja tänne. 740 01:02:10,890 --> 01:02:14,880 Nämä toiminnot löytyvät kaikki vakio I / O-kirjasto. 741 01:02:14,880 --> 01:02:17,510 Joten jos tarkastellaan yläosassa ohjelman 742 01:02:17,510 --> 01:02:24,110 voit nähdä, että olemme jo header tiedosto vakio I / O-kirjasto. 743 01:02:24,110 --> 01:02:27,120 Jos haluamme selvittää kumpi haluamme käyttää, 744 01:02:27,120 --> 01:02:29,690 Voimme aina avata man sivua. 745 01:02:29,690 --> 01:02:34,350 Joten voimme kirjoittaa mies vakiotulosteesi 746 01:02:34,350 --> 01:02:43,180 ja lue kaikki vakiotulosteesi tulon ja lähdön toiminnot C. 747 01:02:43,180 --> 01:02:49,870 Ja voimme jo nähdä Kappas. Se on viittaavat fgetc, se viittaavat fputc. 748 01:02:49,870 --> 01:02:57,220 Joten voit porata alas hieman ja katsoa vaikkapa fgetc 749 01:02:57,220 --> 01:03:00,060 ja tarkastella sen man-sivulta. 750 01:03:00,060 --> 01:03:03,430 Voit nähdä, että se menee yhdessä koko joukko muita toimintoja: 751 01:03:03,430 --> 01:03:12,640 fgetc, fgets, getc, getchar, saa, ungetc, ja sen panos merkkien ja merkkijonojen. 752 01:03:12,640 --> 01:03:19,180 Joten tämä on, miten luemme merkkejä ja merkkijonoja tiedostoista vakiosyötteestä, 753 01:03:19,180 --> 01:03:21,990 joka on olennaisesti käyttäjältä. 754 01:03:21,990 --> 01:03:24,780 Ja näin me teemme sen itse C. 755 01:03:24,780 --> 01:03:30,850 Joten tämä ei käytä GetString ja GetChar toimintoja 756 01:03:30,850 --> 01:03:36,840 että käytetty CS50 kirjastosta. 757 01:03:36,840 --> 01:03:39,710 Me aiomme tehdä tämän ongelman pari tapaa 758 01:03:39,710 --> 01:03:43,430 jotta voit nähdä kaksi eri tapaa tehdä se. 759 01:03:43,430 --> 01:03:48,490 Sekä fread toiminto Daniel mainitut ja fgetc ovat hyviä tapoja tehdä se. 760 01:03:48,490 --> 01:03:53,790 Mielestäni fgetc on hieman helpompaa, koska se on vain, kuten näette, 761 01:03:53,790 --> 01:03:59,660 yhden argumentin, FILE * että yritämme lukea merkki, 762 01:03:59,660 --> 01:04:02,740 ja sen paluuarvo on int. 763 01:04:02,740 --> 01:04:05,610 Ja tämä on hieman sekava, eikö? 764 01:04:05,610 --> 01:04:11,450 >> Koska saamme merkin, joten miksi ei tätä paluuta char? 765 01:04:11,450 --> 01:04:18,700 Teillä mitään ideoita miksi tämä ei välttämättä palauta char? 766 01:04:18,700 --> 01:04:25,510 [Missy vastauksia, käsittämätön] >> Joo. Joten Missy on täysin oikeassa. 767 01:04:25,510 --> 01:04:31,570 Jos se on ASCII, niin tämä kokonaisluku voidaan kuvata todellista merkkiä. 768 01:04:31,570 --> 01:04:33,520 Voisiko olla ASCII, ja se on oikein. 769 01:04:33,520 --> 01:04:36,220 Juuri mitä tapahtuu. 770 01:04:36,220 --> 01:04:39,190 Käytämme int yksinkertaisesti koska se on enemmän bittejä. 771 01:04:39,190 --> 01:04:44,750 Se on suurempi kuin char; meidän char on vain 8 bittiä, että 1 tavu meidän 32-bit koneita. 772 01:04:44,750 --> 01:04:48,520 Ja int on kaikki 4 tavua edestä tilaa. 773 01:04:48,520 --> 01:04:50,940 Ja näyttää siltä, ​​että niin fgetc toimii, 774 01:04:50,940 --> 01:04:53,940 jos me vierittää meidän synopsis tämän miehen sivun vähän, 775 01:04:53,940 --> 01:05:05,000 selaa kaikki alas. On käynyt ilmi, että he käyttävät tätä erityistä arvoa nimeltään EOF. 776 01:05:05,000 --> 01:05:09,640 Se on erityinen vakiona paluuarvon fgetc funktion 777 01:05:09,640 --> 01:05:14,570 kun osut tiedoston loppuun tai jos saat virheilmoituksen. 778 01:05:14,570 --> 01:05:18,170 Ja näyttää siltä, ​​että tekemistä näiden vertailuja EOF oikein, 779 01:05:18,170 --> 01:05:24,060 Haluatko olla, että ylimääräinen määrä tietoa, että sinulla on int 780 01:05:24,060 --> 01:05:28,420 vastakohtana käyttäen char muuttuja. 781 01:05:28,420 --> 01:05:32,130 Vaikka fgetc tehokkaasti saada merkin tiedostosta, 782 01:05:32,130 --> 01:05:38,450 haluat muistaa että se on palaamassa jotain, joka on tyyppiä int sinulle. 783 01:05:38,450 --> 01:05:41,360 Se sanoi, se on melko helppo käyttää. 784 01:05:41,360 --> 01:05:44,960 Se antaa meille merkin, joten meidän täytyy tehdä, on pitää pyytää tiedostoa, 785 01:05:44,960 --> 01:05:48,440 "Anna minulle seuraavan merkin, anna minulle seuraavan merkin, anna minulle seuraavan merkin" 786 01:05:48,440 --> 01:05:51,400 kunnes saamme tiedoston loppuun. 787 01:05:51,400 --> 01:05:54,730 Ja se vetää yksi merkki kerrallaan meidän tiedoston, 788 01:05:54,730 --> 01:05:56,250 ja sitten voimme tehdä mitä haluamme sen kanssa. 789 01:05:56,250 --> 01:06:00,160 Voimme tallentaa sen, voimme lisätä sen merkkijono, voimme tulostaa sen. 790 01:06:00,160 --> 01:06:04,630 Tehdä mitään siitä. 791 01:06:04,630 --> 01:06:09,600 >> Zoomaus takaisin ulos ja menee takaisin meidän cat.c ohjelmaan 792 01:06:09,600 --> 01:06:16,170 Jos aiomme käyttää fgetc, 793 01:06:16,170 --> 01:06:21,710 miten voi lähestymme tätä seuraava rivi koodia? 794 01:06:21,710 --> 01:06:26,020 Aiomme käyttää - fread tekee jotain hieman erilaista. 795 01:06:26,020 --> 01:06:32,600 Ja tällä kertaa olemme juuri menossa käyttää fgetc saada yhden merkin kerrallaan. 796 01:06:32,600 --> 01:06:40,910 Käsitellä koko tiedoston, mitä voisi meidän täytyy tehdä? 797 01:06:40,910 --> 01:06:44,030 Kuinka monta merkkiä siellä tiedoston? 798 01:06:44,030 --> 01:06:47,390 On olemassa paljon. Joten todennäköisesti haluat saada yksi 799 01:06:47,390 --> 01:06:49,860 ja sitten saat toisen ja saada toinen ja saada toinen. 800 01:06:49,860 --> 01:06:53,330 Millaisia ​​algoritmin luulet saatamme joutua käyttämään täällä? 801 01:06:53,330 --> 01:06:55,470 Millaisia ​​-? [Alexander] for silmukka? >> Aivan. 802 01:06:55,470 --> 01:06:57,500 Tietyntyyppinen silmukan. 803 01:06:57,500 --> 01:07:03,380 For silmukka on todella suuri, tässä tapauksessa. 804 01:07:03,380 --> 01:07:08,620 Ja kuten sanoit, se kuulostaa haluat silmukan koko tiedoston, 805 01:07:08,620 --> 01:07:11,820 saada merkki kerrallaan. 806 01:07:11,820 --> 01:07:13,850 Kaikki ehdotukset siitä, mitä se voisi näyttää? 807 01:07:13,850 --> 01:07:22,090 [Alexander, käsittämättömällä] 808 01:07:22,090 --> 01:07:30,050 >> Okei, kerro minulle Englanti mitä yrität tehdä? [Alexander, käsittämättömällä] 809 01:07:30,050 --> 01:07:36,270 Joten tässä tapauksessa se kuulostaa me vain yritämme silmukan koko tiedoston. 810 01:07:36,270 --> 01:07:45,330 [Alexander] Joten i > Koko -? 811 01:07:45,330 --> 01:07:49,290 Oletan tiedoston kokoa, eikö? Koko - we'll vain kirjoittaa sen näin. 812 01:07:49,290 --> 01:07:57,470 Tiedoston koko toistaiseksi, i + +. 813 01:07:57,470 --> 01:08:04,610 Joten näyttää siltä, ​​että niin teet tämän käyttämällä fgetc, ja tämä on uutta, 814 01:08:04,610 --> 01:08:10,460 on, että ei ole helppo tapa vain saada koko tiedoston 815 01:08:10,460 --> 01:08:16,979 Tämän "sizeof" tyyppinen rakentaa että olet nähnyt ennen. 816 01:08:16,979 --> 01:08:20,910 Kun käytämme että fgetc toimintoa, otamme käyttöön jonkinlainen 817 01:08:20,910 --> 01:08:29,069 uusi, funky syntaksia tätä silmukka, jossa sijasta vain perus laskuri 818 01:08:29,069 --> 01:08:33,920 mennä merkki merkiltä, ​​me aiomme vetää yhden merkin kerrallaan, 819 01:08:33,920 --> 01:08:37,120 yksi merkki kerrallaan, ja miten me tiedämme, että olemme lopussa 820 01:08:37,120 --> 01:08:41,290 ei kun olemme lasketa tiettyjä merkkejä, 821 01:08:41,290 --> 01:08:49,939 mutta kun hahmo me vedä että erityinen tiedoston loppu luonnetta. 822 01:08:49,939 --> 01:08:58,689 Joten voimme tehdä tämän - Kutsun tätä kjs, ja aiomme sen alustamiseen 823 01:08:58,689 --> 01:09:08,050 meidän ensimmäinen puhelu saada ensimmäinen merkki pois tiedoston. 824 01:09:08,050 --> 01:09:14,979 Joten tämä osa täällä, tämä on menossa merkin pois tiedoston 825 01:09:14,979 --> 01:09:20,840 ja tallenna se muuttujaan ch. 826 01:09:20,840 --> 01:09:25,420 Aiomme pitää tätä kunnes saamme loppuun tiedoston, 827 01:09:25,420 --> 01:09:41,170 jonka teemme testaamalla merkin ei ole sama kuin että erityistä EOF luonnetta. 828 01:09:41,170 --> 01:09:48,750 Ja sitten sen sijaan tehdä ch + +, mikä olisi vain n arvoa, 829 01:09:48,750 --> 01:09:52,710 joten jos luemme ulos tiedoston, pääoma, sanovat, 830 01:09:52,710 --> 01:09:56,810 ch + + antaisi meille b, ja sitten saisin c ja sitten d. 831 01:09:56,810 --> 01:09:59,310 Se ei selvästikään ole mitä haluamme. Mitä me haluamme täällä 832 01:09:59,310 --> 01:10:05,830 Tässä viimeinen bitti haluamme saada seuraavan merkin tiedostosta. 833 01:10:05,830 --> 01:10:09,500 >> Joten miten voisi saamme seuraavan merkin tiedostosta? 834 01:10:09,500 --> 01:10:13,470 Miten saamme ensimmäisen merkin tiedoston? 835 01:10:13,470 --> 01:10:17,200 [Student] fgetfile? >> Fgetc, tai anteeksi, olit täysin oikeassa. 836 01:10:17,200 --> 01:10:20,470 Minä kirjoitusvirhe se oikeassa. Niin joo. 837 01:10:20,470 --> 01:10:26,240 Täällä sen sijaan tehdä ch + +, 838 01:10:26,240 --> 01:10:29,560 olemme juuri menossa soittaa fgetc (tiedosto) uudelleen 839 01:10:29,560 --> 01:10:39,180 ja tuloksen tallentaminen meidän samaan kjs muuttuja. 840 01:10:39,180 --> 01:10:43,730 [Student kysymys, käsittämättömällä] 841 01:10:43,730 --> 01:10:52,390 >> Tässä on nämä FILE * kaverit ovat erityisiä. 842 01:10:52,390 --> 01:10:59,070 Miten he työskentelevät he - kun avaat - kun ensin tehdä se fopen puhelun 843 01:10:59,070 --> 01:11:04,260 FILE * tehokkaasti toimii osoittimen tiedoston alusta. 844 01:11:04,260 --> 01:11:12,830 Ja sitten aina kutsua fgetc, se liikkuu yhden merkin kautta tiedosto. 845 01:11:12,830 --> 01:11:23,280 Joten jos soittaa tämän, olet kasvattamalla tiedoston osoitin yhden merkin. 846 01:11:23,280 --> 01:11:26,210 Ja kun fgetc taas, olet muuttamassa sen toisen hahmon 847 01:11:26,210 --> 01:11:28,910 ja toinen merkki ja toinen merkki ja toinen merkki. 848 01:11:28,910 --> 01:11:32,030 [Student kysymys, käsittämätön] >> ja that's - joo. 849 01:11:32,030 --> 01:11:34,810 Se on tavallaan tämä taika konepellin alle. 850 01:11:34,810 --> 01:11:37,930 Sinä vain pitää lisäävä kautta. 851 01:11:37,930 --> 01:11:46,510 Tässä vaiheessa et voi todella työskennellä merkki. 852 01:11:46,510 --> 01:11:52,150 Joten miten voisi voimme tulostaa tämän ulos näytön, nyt? 853 01:11:52,150 --> 01:11:58,340 Voimme käyttää samaa printf asia, että me käytetään ennen. 854 01:11:58,340 --> 01:12:00,330 Että olemme käyttäneet kaikki lukukauden. 855 01:12:00,330 --> 01:12:05,450 Voimme soittaa printf, 856 01:12:05,450 --> 01:12:21,300 ja voimme kulkea luonteeltaan vain. 857 01:12:21,300 --> 01:12:27,430 Toinen tapa tehdä se on pikemminkin kuin käyttämällä printf ja ottaa tähän muotomerkkijonoa, 858 01:12:27,430 --> 01:12:29,490 Voimme myös käyttää yhtä muita toimintoja. 859 01:12:29,490 --> 01:12:40,090 Voimme käyttää fputc, joka tulostaa merkin näytölle, 860 01:12:40,090 --> 01:12:52,580 paitsi jos katsomme fputc - haluan loitontaa vähän. 861 01:12:52,580 --> 01:12:56,430 Näemme mitä mukavaa se vie merkin, että luemme käyttäen fgetc, 862 01:12:56,430 --> 01:13:05,100 mutta sitten meidän täytyy antaa se virta tulostaa. 863 01:13:05,100 --> 01:13:11,850 Voimme käyttää myös putchar toiminto, joka laittaa suoraan tavallisen ulos. 864 01:13:11,850 --> 01:13:16,070 Joten on olemassa koko joukko erilaisia ​​vaihtoehtoja, joita voimme käyttää tulostukseen. 865 01:13:16,070 --> 01:13:19,580 He kaikki vakio I / O-kirjasto. 866 01:13:19,580 --> 01:13:25,150 Kun haluat tulostaa - niin printf, oletuksena tulostaa erityisiin standardin ulos stream, 867 01:13:25,150 --> 01:13:27,910 joka on, että stdout. 868 01:13:27,910 --> 01:13:41,300 Joten voimme vain viitata se sellaista tämä taika arvoa, stdout täällä. 869 01:13:41,300 --> 01:13:48,410 Oho. Laita puolipiste ulkopuolella. 870 01:13:48,410 --> 01:13:52,790 >> Tämä on paljon uutta, funky tietoa täältä. 871 01:13:52,790 --> 01:13:58,600 Paljon tämä on hyvin idiomaattinen, siinä mielessä, että tämä on koodi 872 01:13:58,600 --> 01:14:05,700 että on kirjoitettu tällä tavalla vain koska se on puhdas lukea, helppo lukea. 873 01:14:05,700 --> 01:14:11,520 On olemassa monia erilaisia ​​tapoja tehdä sitä, monia eri toimintoja voi käyttää, 874 01:14:11,520 --> 01:14:14,680 mutta meillä on tapana vain noudattaa näitä samoja kuvioita uudestaan ​​ja uudestaan. 875 01:14:14,680 --> 01:14:20,180 Joten älä ihmettele, jos näet koodia näin tulossa uudestaan ​​ja uudestaan. 876 01:14:20,180 --> 01:14:25,690 Selvä. Tässä vaiheessa meidän on pakko rikkoa päivän. 877 01:14:25,690 --> 01:14:31,300 Kiitos, että tulit. Kiitos katsomassa jos olet verkossa. Ja näemme ensi viikolla. 878 01:14:31,300 --> 01:14:33,890 [CS50.TV]