1 00:00:00,000 --> 00:00:02,730 [Powered by Google Translate] [ARTIKEL 5: minder gemaklike] 2 00:00:02,730 --> 00:00:05,180 [Nate Hardison, Harvard Universiteit] 3 00:00:05,180 --> 00:00:08,260 [Hierdie is CS50.] [CS50.TV] 4 00:00:08,260 --> 00:00:11,690 So welkom terug, ouens. 5 00:00:11,690 --> 00:00:16,320 Welkom by artikel 5. 6 00:00:16,320 --> 00:00:20,220 Op hierdie punt, quiz 0 voltooi en gesien hoe jy gedoen het, 7 00:00:20,220 --> 00:00:25,770 hopelik jy voel regtig goed, want ek was baie beïndruk deur die tellings in hierdie afdeling. 8 00:00:25,770 --> 00:00:28,050 Vir ons aanlyn kykers, het ons het 'n paar vrae 9 00:00:28,050 --> 00:00:33,680 oor die laaste twee probleme op die probleem te stel - of op die quiz, eerder. 10 00:00:33,680 --> 00:00:39,690 So ons gaan om te gaan oor dié wat regtig vinnig, sodat almal sien wat gebeur het 11 00:00:39,690 --> 00:00:45,060 en hoe om te gaan deur middel van die werklike oplossing eerder as net die lees van die oplossing self. 12 00:00:45,060 --> 00:00:50,330 Ons gaan om te gaan oor die laaste paar probleme regtig vinnig, 32 en 33. 13 00:00:50,330 --> 00:00:53,240 Net weer, sodat die aanlyn-kykers kan sien. 14 00:00:53,240 --> 00:00:59,080 >> As jy aan jou probleem 32, wat is op bladsy 13, 15 00:00:59,080 --> 00:01:02,730 13 uit 16, probleem 32 is al oor die swaps. 16 00:01:02,730 --> 00:01:05,010 Dit was alles oor die uitruiling van twee heelgetalle. 17 00:01:05,010 --> 00:01:08,740 Dit is die probleem wat ons gaan oor 'n paar keer in die lesing. 18 00:01:08,740 --> 00:01:13,590 En hier, wat ons vra jou om te doen is 'n vinnige geheue spoor. 19 00:01:13,590 --> 00:01:17,000 Te vul in die waardes van die veranderlikes soos hulle is op die stapel 20 00:01:17,000 --> 00:01:20,250 as die kode gaan deur middel van hierdie swap funksie. 21 00:01:20,250 --> 00:01:24,500 In die besonder, wat ons op soek na - Achievement gaan hierdie iPad neer te sit - 22 00:01:24,500 --> 00:01:29,650 in die besonder, wat ons is op soek na hierdie lyn genommer 6 reg hier. 23 00:01:29,650 --> 00:01:36,740 En dit is genommer 6 vir net aanraking met die vorige probleem. 24 00:01:36,740 --> 00:01:41,720 Wat ons wil doen, is die toestand van die geheue te vertoon of benoem 25 00:01:41,720 --> 00:01:46,090 as dit is op die oomblik wanneer ons uitvoer hierdie lyn nommer 6, 26 00:01:46,090 --> 00:01:52,540 wat effektief 'n opbrengs van ons swap funksie reg hier. 27 00:01:52,540 --> 00:01:59,450 As ons scroll down hier, het ons gesien dat die adresse van alles in die geheue is vir ons. 28 00:01:59,450 --> 00:02:02,540 Dit is 'n baie belangrike, ons sal terug kom om dit in net 'n oomblik. 29 00:02:02,540 --> 00:02:09,240 En dan af hier aan die onderkant, ons het 'n bietjie geheue diagram dat ons gaan om te verwys na. 30 00:02:09,240 --> 00:02:12,490 Ek het eintlik gedoen op my iPad. 31 00:02:12,490 --> 00:02:20,720 So ek gaan om heen en weer te wissel tussen die iPad en hierdie kode net vir verwysing. 32 00:02:20,720 --> 00:02:26,540 >> Kom ons begin. Eers, laat se fokus op die eerste paar lyne van die belangrikste reg hier. 33 00:02:26,540 --> 00:02:30,220 Om mee te begin, gaan ons x te inisialiseer 1 en y 2. 34 00:02:30,220 --> 00:02:33,040 So ons het twee integer veranderlikes, is hulle albei gaan word op die stapel geplaas. 35 00:02:33,040 --> 00:02:36,050 Ons gaan 'n 1 en 'n 2 te sit in hulle. 36 00:02:36,050 --> 00:02:43,150 So as ek draai op my iPad, hopelik, laat ons sien - 37 00:02:43,150 --> 00:02:48,660 Apple TV mirroring, en daar gaan ons. Okay. 38 00:02:48,660 --> 00:02:51,670 So as ek draai op my iPad, 39 00:02:51,670 --> 00:02:56,220 Ek wil x te inisialiseer 1 en y 2. 40 00:02:56,220 --> 00:03:00,580 Ons doen dit eenvoudig deur die skryf van 'n 1 in die boks gemerk x 41 00:03:00,580 --> 00:03:07,730 en 'n 2 in die boks gemerk y. Redelik eenvoudig. 42 00:03:07,730 --> 00:03:11,620 So nou, laat ons gaan terug na die laptop, kyk wat gebeur volgende. 43 00:03:11,620 --> 00:03:15,810 So die volgende lyn is waar dinge lastig. 44 00:03:15,810 --> 00:03:28,110 Ons ry verby die adres van x en die adres van y as die parameters a en b die swap funksie. 45 00:03:28,110 --> 00:03:32,380 Die adres van die x en die adres van y is dinge wat ons nie kan bereken 46 00:03:32,380 --> 00:03:36,360 sonder om te verwys na hierdie bullet wys hier regs af. 47 00:03:36,360 --> 00:03:39,750 En gelukkig, die eerste twee bullet punte vir ons vertel presies wat die antwoorde is. 48 00:03:39,750 --> 00:03:44,740 Die adres van x in die geheue is 10, en die adres van y in die geheue is 14. 49 00:03:44,740 --> 00:03:51,870 So dit is die waardes wat in geslaag kry as A en B tot bo in ons swap funksie. 50 00:03:51,870 --> 00:04:00,760 Dit weer doen, skakel terug na ons diagram, kan ek skryf 'n 10 in 'n 51 00:04:00,760 --> 00:04:07,400 en 'n 14 in b. 52 00:04:07,400 --> 00:04:11,610 Nou, hierdie punt is waar ons voortgaan met die ruiltransaksie. 53 00:04:11,610 --> 00:04:14,520 So daarby terug weer aan die laptop, 54 00:04:14,520 --> 00:04:21,079 sien ons dat die manier waarop die swap werk, is ek die eerste keer dereference a en stoor die resultaat in tmp. 55 00:04:21,079 --> 00:04:27,650 So sê die dereference operateur, "Hey. Behandel die inhoud van die veranderlike 'n as 'n adres. 56 00:04:27,650 --> 00:04:33,830 Gaan na alles wat by daardie adres gestoor, en laai dit. " 57 00:04:33,830 --> 00:04:41,720 Wat jy laai van die veranderlike gaan word gestoor in ons tmp veranderlike. 58 00:04:41,720 --> 00:04:45,150 Daarby terug na die iPad. 59 00:04:45,150 --> 00:04:51,690 As ons gaan om 10 aan te spreek, weet ons dat adres 10 is die varible x 60 00:04:51,690 --> 00:04:55,480 want ons is vertel deur ons bullet punt dat die adres van x in die geheue is 10. 61 00:04:55,480 --> 00:05:00,180 Sodat ons kan daar gaan, kry die waarde van dit, wat is 1, soos ons sien op ons iPad, 62 00:05:00,180 --> 00:05:06,300 en laai dit in tmp. 63 00:05:06,300 --> 00:05:08,250 Weereens, dit is nie die finale inhoud. 64 00:05:08,250 --> 00:05:14,350 Ons gaan om te loop deur en ons sal kry om ons finale toestand van die program aan die einde. 65 00:05:14,350 --> 00:05:17,210 Maar nou, ons het die waarde 1 gestoor in tmp. 66 00:05:17,210 --> 00:05:19,210 >> En daar is 'n vinnige vraag hier. 67 00:05:19,210 --> 00:05:23,980 [Alexander] Is die dereference operateur - dit is net die ster reg in die voorkant van die veranderlike? 68 00:05:23,980 --> 00:05:27,600 >> Ja. So het die dereference operateur, as ons draai terug na ons laptop weer, 69 00:05:27,600 --> 00:05:33,780 is hierdie ster reg in die voorkant. 70 00:05:33,780 --> 00:05:37,460 In daardie sin, dit is - jy kontrasteer dit met die vermenigvuldiging operateur 71 00:05:37,460 --> 00:05:42,400 wat vereis dat twee dinge, die dereference operateur is 'n Unêre operateur. 72 00:05:42,400 --> 00:05:46,130 Net toegepas op een waarde as gekant teen 'n binêre operateur, 73 00:05:46,130 --> 00:05:48,810 waar jy aansoek doen om twee verskillende waardes. 74 00:05:48,810 --> 00:05:52,080 So dit is wat gebeur in hierdie lyn. 75 00:05:52,080 --> 00:05:58,390 Ons laai die waarde 1 en dit in ons tydelike heelgetal veranderlike gestoor. 76 00:05:58,390 --> 00:06:05,800 Die volgende lyn, slaan ons die inhoud van b in 77 00:06:05,800 --> 00:06:12,630 of, eerder, slaan ons die inhoud wat b wys in die plek waar 'n wys. 78 00:06:12,630 --> 00:06:17,690 As ons analiseer dit van regs na links, gaan ons dereference b, 79 00:06:17,690 --> 00:06:23,580 ons gaan 14 aan te spreek, gaan ons die heelgetal wat daar is om te gryp, 80 00:06:23,580 --> 00:06:26,900 en dan gaan ons om te gaan na die adres 10, 81 00:06:26,900 --> 00:06:34,240 en ons gaan die gevolg van ons dereference van b in daardie ruimte te gooi. 82 00:06:34,240 --> 00:06:40,080 Daarby terug na ons iPad, waar ons kan maak dit 'n bietjie meer konkrete, 83 00:06:40,080 --> 00:06:44,070 dit kan help as ek skryf nommers op al die adresse hier. 84 00:06:44,070 --> 00:06:53,820 Dus weet ons dat, ons is by y by adres 14, x is by adres 10. 85 00:06:53,820 --> 00:07:00,180 Wanneer ons begin by b, ons dereference b, ons gaan die waarde 2 aan te gryp. 86 00:07:00,180 --> 00:07:08,320 Ons gaan hierdie waarde te gryp, want wat is die waarde wat woon by adres 14. 87 00:07:08,320 --> 00:07:15,700 En ons gaan om dit in die veranderlike wat woon by adres 10, 88 00:07:15,700 --> 00:07:19,160 wat reg is, wat ooreenstem met ons veranderlike x. 89 00:07:19,160 --> 00:07:21,810 Sodat ons kan doen om 'n bietjie van die vervang hier 90 00:07:21,810 --> 00:07:35,380 waar ons ontslae te raak van ons 1 en in plaas daarvan het ons skryf 'n 2. 91 00:07:35,380 --> 00:07:39,560 So was dan al is goed en goed in die wêreld, selfs al het ons nou oorskryf x. 92 00:07:39,560 --> 00:07:44,890 Ons het x se ou waarde in ons tmp veranderlike gestoor. 93 00:07:44,890 --> 00:07:50,210 Sodat ons dit kan die ruiltransaksie voltooi met die volgende reël. 94 00:07:50,210 --> 00:07:53,030 Daarby terug aan ons laptop. 95 00:07:53,030 --> 00:07:58,150 Nou al wat oorbly is om die inhoud uit te neem van ons tydelike heelgetal veranderlike 96 00:07:58,150 --> 00:08:05,630 en stoor dit in die veranderlike wat woon by die adres wat b hou. 97 00:08:05,630 --> 00:08:10,230 So ons gaan om effektief dereference b toegang te kry tot die veranderlike 98 00:08:10,230 --> 00:08:14,340 wat by die adres wat b hou dit, 99 00:08:14,340 --> 00:08:19,190 en ons gaan die waarde wat tmp hou in dit te stop. 100 00:08:19,190 --> 00:08:23,280 Daarby terug na die iPad weer. 101 00:08:23,280 --> 00:08:31,290 Ek kan hierdie waarde hier vee, 2, 102 00:08:31,290 --> 00:08:41,010 en in plaas daarvan sal ons die 1 reg kopieer dit. 103 00:08:41,010 --> 00:08:43,059 Dan die volgende lyn wat voer, natuurlik - 104 00:08:43,059 --> 00:08:47,150 as ons draai terug na die laptop - is hierdie punt 6, 105 00:08:47,150 --> 00:08:52,500 wat is die punt waar ons wou hê ons diagram heeltemal ingestuur. 106 00:08:52,500 --> 00:08:58,940 So daarby terug na die iPad weer, net sodat jy kan sien die voltooide diagram, 107 00:08:58,940 --> 00:09:06,610 kan jy sien dat ons het 'n 10 in 'n, 'n 14 in b, 'n 1 in tmp, 'n 2 in x, en 'n 1 in y. 108 00:09:06,610 --> 00:09:11,000 Is daar enige vrae het oor hierdie? 109 00:09:11,000 --> 00:09:14,640 Maak dit meer sin te wandel deur dit? 110 00:09:14,640 --> 00:09:24,850 Maak minder sin? Hopelik nie. Okay. 111 00:09:24,850 --> 00:09:28,230 >> Pointers is 'n baie moeilike onderwerp. 112 00:09:28,230 --> 00:09:33,420 Een van die ouens wat ons werk met 'n baie algemene gesegde: 113 00:09:33,420 --> 00:09:36,590 "Pointers te verstaan, moet jy eers verstaan ​​wysers." 114 00:09:36,590 --> 00:09:40,530 Wat ek dink is baie waar. Dit neem 'n rukkie om daaraan gewoond te raak. 115 00:09:40,530 --> 00:09:45,360 Loting van die foto's, trek baie van die geheue diagramme soos hierdie een baie nuttig, 116 00:09:45,360 --> 00:09:49,480 en nadat jy loop deur die voorbeeld op voorbeeld na voorbeeld, 117 00:09:49,480 --> 00:09:54,450 dit sal begin om 'n bietjie meer sin en 'n bietjie meer sin en 'n bietjie meer sin te maak. 118 00:09:54,450 --> 00:10:01,560 Ten slotte, 'n dag, jy het dit alles heeltemal bemeester. 119 00:10:01,560 --> 00:10:13,800 Enige vrae voor ons beweeg aan na die volgende probleem? Alles reg. 120 00:10:13,800 --> 00:10:18,840 So terug flip na die laptop. 121 00:10:18,840 --> 00:10:23,300 Die volgende probleem wat ons het, is probleem nommer 33 op lêer I / O. 122 00:10:23,300 --> 00:10:26,350 Zoom in op hierdie 'n bietjie. 123 00:10:26,350 --> 00:10:28,710 Probleem 33 - Ja? 124 00:10:28,710 --> 00:10:32,110 >> [Daniel] Ek het net 'n vinnige vraag het. Hierdie ster, of die asterisk, 125 00:10:32,110 --> 00:10:35,590 dit genoem ontwysing wanneer jy voor 'n asterisk. 126 00:10:35,590 --> 00:10:38,820 Wat is Dit is dan wanneer jy die ampersand voor? 127 00:10:38,820 --> 00:10:43,140 >> Die ampersand voor die adres van die operateur. 128 00:10:43,140 --> 00:10:45,880 So laat scroll back-up. 129 00:10:45,880 --> 00:10:49,310 Oeps. Ek is in die soom af so ek kan nie regtig scroll. 130 00:10:49,310 --> 00:10:52,780 As ons kyk na hierdie kode regtig vinnig reg hier, 131 00:10:52,780 --> 00:10:54,980 weer, dieselfde ding gebeur. 132 00:10:54,980 --> 00:10:59,180 As ons kyk na die kode hier, op hierdie lyn waar ons die oproep om te ruil, 133 00:10:59,180 --> 00:11:10,460 die ampersand word net gesê: "kry die adres waar veranderlike x lewens." 134 00:11:10,460 --> 00:11:14,460 Wanneer jou samesteller stel jou kode, 135 00:11:14,460 --> 00:11:20,590 dit het eintlik fisies merk 'n plek in die geheue vir al jou veranderlikes om te lewe. 136 00:11:20,590 --> 00:11:24,910 En wat die vertaler kan doen nadat dit opgestel is alles, 137 00:11:24,910 --> 00:11:31,110 dit weet, "O, ek het x by adres 10 Ek het y by adres 14." 138 00:11:31,110 --> 00:11:34,640 Dit kan dan in te vul hierdie waardes vir jou. 139 00:11:34,640 --> 00:11:44,740 Sodat jy kan dan - dit kan dan slaag en slaag en y in sowel. 140 00:11:44,740 --> 00:11:50,730 Hierdie ouens kry die adres, maar ook hulle sal, as jy slaag hulle in die swap funksie, 141 00:11:50,730 --> 00:11:55,690 hierdie tipe inligting, hierdie int * reg hier, sê die samesteller, 142 00:11:55,690 --> 00:12:01,350 "Okay, ons gaan na die interpretasie van hierdie adres as 'n adres van 'n heelgetal veranderlike." 143 00:12:01,350 --> 00:12:05,900 As 'n adres van 'n int, wat verskil van die adres van 'n karakter veranderlike 144 00:12:05,900 --> 00:12:09,930 omdat 'n int neem op 'n 32-bis masjien, neem 4 grepe van die ruimte, 145 00:12:09,930 --> 00:12:13,310 terwyl 'n karakter neem slegs 1 greep van die ruimte. 146 00:12:13,310 --> 00:12:17,310 Daarom is dit belangrik om ook te weet wat is - wat leef, watter tipe van waarde 147 00:12:17,310 --> 00:12:20,340 woon by die adres wat het geslaag. 148 00:12:20,340 --> 00:12:22,020 Of die adres wat jy met. 149 00:12:22,020 --> 00:12:29,020 Op dié manier, jy weet hoeveel bytes van inligting om werklik te laai van jou geheue. 150 00:12:29,020 --> 00:12:31,780 En dan, ja, is hierdie dereference operateur, soos jy vra, 151 00:12:31,780 --> 00:12:37,200 gaan en toegang tot inligting by 'n spesifieke adres. 152 00:12:37,200 --> 00:12:42,820 So dit sê, met hierdie 'n veranderlike hier, behandel die inhoud van 'n as 'n adres, 153 00:12:42,820 --> 00:12:47,880 gaan na die adres, en trek uit, laai in die verwerker, laai in 'n register 154 00:12:47,880 --> 00:12:56,340 die werklike waardes of die inhoud wat by daardie adres woon. 155 00:12:56,340 --> 00:12:59,620 Nog meer vrae? Hierdie is goeie vrae. 156 00:12:59,620 --> 00:13:01,650 Dit is 'n baie nuwe terminologie. 157 00:13:01,650 --> 00:13:09,800 Dit is ook soort van funky, aangesien & * in verskillende plekke. 158 00:13:09,800 --> 00:13:13,180 >> Alles reg. 159 00:13:13,180 --> 00:13:18,530 So terug na die probleem 33, lêer I / O. 160 00:13:18,530 --> 00:13:22,540 Dit was een van die probleme wat ek dink 'n paar van die dinge wat gebeur. 161 00:13:22,540 --> 00:13:25,400 Een, dit is 'n redelik nuwe onderwerp. 162 00:13:25,400 --> 00:13:30,590 Dit was 'n bietjie gou voor die aangesig van die quiz, 163 00:13:30,590 --> 00:13:33,400 En dan dink ek dit was soort van soos een van daardie woord probleme in wiskunde 164 00:13:33,400 --> 00:13:39,720 waar hulle gee jou 'n baie inligting, maar jy eintlik eindig nie met 'n ton van dit te gebruik. 165 00:13:39,720 --> 00:13:44,060 Die eerste deel van die probleem beskryf wat 'n CSV-lêer is. 166 00:13:44,060 --> 00:13:50,620 Nou, 'n CSV-lêer, volgens die beskrywing, is 'n deur kommas geskei waardes lêer. 167 00:13:50,620 --> 00:13:55,300 Die rede waarom hierdie is by al die interessante, en die rede waarom jy altyd gebruik, 168 00:13:55,300 --> 00:14:00,800 is, want, hoeveel van julle het al ooit gebruik om dinge soos Excel? 169 00:14:00,800 --> 00:14:03,240 Figuur die meeste van julle het, waarskynlik, of sal gebruik om op 'n sekere punt in jou lewe. 170 00:14:03,240 --> 00:14:06,430 Jy gebruik iets soos Excel. 171 00:14:06,430 --> 00:14:10,940 Ten einde die data te kry uit 'n Excel spreiblad of enige soort van verwerking met dit, 172 00:14:10,940 --> 00:14:17,240 as jy wou 'n C program of Python program, Java program te skryf, 173 00:14:17,240 --> 00:14:20,070 om te gaan met die data wat jy daar gestoor het, 174 00:14:20,070 --> 00:14:23,170 een van die mees algemene maniere om dit uit te kry, is in 'n CSV-lêer. 175 00:14:23,170 --> 00:14:26,850 En jy kan oopmaak Excel en wanneer jy na die 'Save As 'n dialoog, 176 00:14:26,850 --> 00:14:32,840 wat jy kan kry 'n werklike CSV. 177 00:14:32,840 --> 00:14:35,890 >> Handig om te weet hoe om te gaan met hierdie dinge. 178 00:14:35,890 --> 00:14:42,010 Die manier waarop dit werk, is dat dit is soortgelyk aan - ek bedoel, is dit in wese nabootsen van 'n sigblad, 179 00:14:42,010 --> 00:14:47,590 waar, soos ons hier sien, in die mees linkse stuk, 180 00:14:47,590 --> 00:14:49,910 ons het al die laaste name. 181 00:14:49,910 --> 00:14:54,670 So ons het Malan, dan Hardison, en dan Bowden, MacWilliam, en dan Chan. 182 00:14:54,670 --> 00:14:59,470 Al die laaste name. En dan 'n komma skei die laaste name van die eerste name. 183 00:14:59,470 --> 00:15:02,970 Dawid, Nate, Rob, Tommy, en Zamyla. 184 00:15:02,970 --> 00:15:06,850 Ek het altyd meng Robby en Tom. 185 00:15:06,850 --> 00:15:10,940 En dan, uiteindelik, die derde kolom is die e-pos adresse. 186 00:15:10,940 --> 00:15:18,500 Sodra jy verstaan ​​dat die res van die program is redelik eenvoudig om te implementeer. 187 00:15:18,500 --> 00:15:23,850 Wat ons gedoen het ten einde hierdie selfde struktuur na te boots in die C-program 188 00:15:23,850 --> 00:15:27,510 is dat ons het wat gebruik word om 'n struktuur. 189 00:15:27,510 --> 00:15:30,520 Ons sal begin speel met hierdie 'n bietjie meer as well. 190 00:15:30,520 --> 00:15:35,790 Ons het gesien dat hulle vir die eerste bietjie in die probleem stel 3, wanneer ons te doen het met die woordeboeke. 191 00:15:35,790 --> 00:15:40,290 Maar hierdie personeel struct slaan 'n laaste naam, 'n eerste naam, en 'n e-pos. 192 00:15:40,290 --> 00:15:44,500 Net soos ons CSV-lêer stoor. 193 00:15:44,500 --> 00:15:47,950 So dit is net die omskakeling van een formaat na 'n ander. 194 00:15:47,950 --> 00:15:54,630 Ons het om te sit, in hierdie geval, 'n personeel struct in 'n lyn, 195 00:15:54,630 --> 00:15:59,060 'n komma-geskeide lyn, net soos wat. 196 00:15:59,060 --> 00:16:01,500 Maak dit sin? Julle het al die quiz, 197 00:16:01,500 --> 00:16:07,680 so ek dink jy het ten minste 'n tyd om te dink oor hierdie. 198 00:16:07,680 --> 00:16:16,410 >> In die huur-funksie, die probleem vra om ons te neem in - we'll zoom in op hierdie 'n bietjie - 199 00:16:16,410 --> 00:16:22,480 neem in 'n personeel struktuur, 'n personeel struct, met die naam s, 200 00:16:22,480 --> 00:16:30,900 en voeg die inhoud daarvan aan ons staff.csv lêer. 201 00:16:30,900 --> 00:16:34,230 Dit blyk dat dit is redelik eenvoudig om te gebruik. 202 00:16:34,230 --> 00:16:37,430 Ons sal soort van rondom speel met hierdie funksies 'n bietjie meer vandag. 203 00:16:37,430 --> 00:16:44,510 Maar in hierdie geval, die fprintf funksie is regtig die sleutel. 204 00:16:44,510 --> 00:16:51,960 So met fprintf, kan ons druk, net soos julle ouens printf hierdie hele term is deur. 205 00:16:51,960 --> 00:16:55,050 Jy kan printf 'n lyn na 'n lêer. 206 00:16:55,050 --> 00:16:59,030 So in plaas van net die gewone printf oproep waar jy dit die formaat string 207 00:16:59,030 --> 00:17:05,380 en dan kan jy al die veranderlikes vervang met die volgende argumente, 208 00:17:05,380 --> 00:17:11,290 met fprintf, jou heel eerste argument is in plaas van die lêer wat jy wil skryf. 209 00:17:11,290 --> 00:17:21,170 As ons kyk na dit in die toestel, byvoorbeeld, man fprintf, 210 00:17:21,170 --> 00:17:25,980 ons kan die verskil sien tussen printf en fprintf. 211 00:17:25,980 --> 00:17:28,960 Ek sal hier 'n bietjie zoom. 212 00:17:28,960 --> 00:17:33,140 So met printf, ons gee dit 'n formaat string, en dan die daaropvolgende argumente 213 00:17:33,140 --> 00:17:37,580 is al die veranderlikes vir die vervanging of vervanging in die formaat string. 214 00:17:37,580 --> 00:17:47,310 AANGESIEN dit met fprintf, die eerste argument is inderdaad hierdie lêer * 'n stroom. 215 00:17:47,310 --> 00:17:51,800 >> Beweeg terug hier by ons huur, 216 00:17:51,800 --> 00:17:54,550 ons het reeds ons lêer * stroom vir ons oopgegaan. 217 00:17:54,550 --> 00:17:57,810 Dit is wat die eerste lyn nie, maar dit maak die staff.csv lêer, 218 00:17:57,810 --> 00:18:01,690 dit maak dit in append af, en al wat oorbly vir ons te doen is 219 00:18:01,690 --> 00:18:08,640 skryf die personeel struktuur na die lêer. 220 00:18:08,640 --> 00:18:10,870 En, laat ons sien, wil ek die iPad te gebruik? 221 00:18:10,870 --> 00:18:17,900 Ek sal gebruik maak van die iPad. Ons het nietig - laat dit is op die tafel sit sodat ek kan 'n bietjie beter te skryf - 222 00:18:17,900 --> 00:18:33,680 nietig huur en neem dit in 'n argument, 'n personeel struktuur genoem s. 223 00:18:33,680 --> 00:18:44,120 Het ons draadjies, ons het ons lêer * genoem lêer, 224 00:18:44,120 --> 00:18:48,380 ons het ons fopen lyn wat aan ons gegee is, 225 00:18:48,380 --> 00:18:51,890 en ek sal net skryf dit as kolletjies, want dit is reeds in die Pedia. 226 00:18:51,890 --> 00:19:00,530 En dan op ons volgende lyn, ons gaan 'n oproep te maak fprintf 227 00:19:00,530 --> 00:19:03,700 en ons gaan om te slaag in die lêer wat ons wil uit te druk, 228 00:19:03,700 --> 00:19:10,290 en dan is ons formaat string, wat - 229 00:19:10,290 --> 00:19:14,300 Ek sal jou laat julle ouens my vertel hoe dit lyk. 230 00:19:14,300 --> 00:19:20,500 Hoe gaan jy, Stella? Weet jy wat die eerste deel van die formaat string lyk? 231 00:19:20,500 --> 00:19:24,270 [Stella] Ek is nie seker nie. >> Voel vry om Jimmy om te vra. 232 00:19:24,270 --> 00:19:27,690 Weet jy, Jimmy? 233 00:19:27,690 --> 00:19:31,000 [Jimmy] Sou dit net die laaste? Ek weet nie. Ek is nie heeltemal seker nie. 234 00:19:31,000 --> 00:19:39,020 >> Goed. Hoe gaan, het iemand dit korrek op die eksamen? 235 00:19:39,020 --> 00:19:41,770 Nee Alle regte. 236 00:19:41,770 --> 00:19:47,920 Dit blyk dat hier al wat ons hoef te doen, is ons wil hê dat elke deel van ons personeel struktuur 237 00:19:47,920 --> 00:19:53,290 word uitgedruk as 'n string in ons lêer. 238 00:19:53,290 --> 00:19:59,900 Ons moet net gebruik maak van die string vervanging karakter drie verskillende tye, want ons het 'n laaste naam 239 00:19:59,900 --> 00:20:07,160 gevolg deur komma, dan 'n eerste naam gevolg deur 'n komma, 240 00:20:07,160 --> 00:20:12,430 en dan uiteindelik die e-pos adres wat gevolg word - wat nie 241 00:20:12,430 --> 00:20:15,140 pas op my skerm - maar dit is gevolg deur 'n newline karakter. 242 00:20:15,140 --> 00:20:20,060 So ek gaan dit net af daar skryf. 243 00:20:20,060 --> 00:20:23,560 En dan na ons formaat string, 244 00:20:23,560 --> 00:20:27,880 ons het net die substitusies, wat ons toegang tot die gebruik van die dot-notasie 245 00:20:27,880 --> 00:20:31,370 wat ons gesien het in die probleem stel 3. 246 00:20:31,370 --> 00:20:48,820 Ons kan gebruik s.last, s.first en s.email 247 00:20:48,820 --> 00:20:58,990 te vervang in dié drie waardes in ons formaat string. 248 00:20:58,990 --> 00:21:06,190 So hoe het dit gaan? Sin maak? 249 00:21:06,190 --> 00:21:09,700 Ja? Nie? Moontlik? Okay. 250 00:21:09,700 --> 00:21:14,180 >> Die laaste ding wat ons doen nadat ons het gedruk en nadat ons ons lêer oopgemaak het: 251 00:21:14,180 --> 00:21:17,370 wanneer ons het 'n lêer oopmaak, kry ons altyd moet onthou om dit te sluit. 252 00:21:17,370 --> 00:21:19,430 Want anders sal ons uiteindelik die lek van die geheue, 253 00:21:19,430 --> 00:21:22,500 gebruik lêer beskrywers. 254 00:21:22,500 --> 00:21:25,950 So om dit te sluit, welke funksie gebruik ons? Daniel? 255 00:21:25,950 --> 00:21:30,120 [Daniel] fclose? >> Fclose, presies. 256 00:21:30,120 --> 00:21:37,520 So het die laaste deel van die probleem was om behoorlik te sluit van die lêer, met behulp van die fclose funksie, 257 00:21:37,520 --> 00:21:40,370 wat lyk net soos daardie. 258 00:21:40,370 --> 00:21:43,880 Nie te gek. 259 00:21:43,880 --> 00:21:46,990 Cool. 260 00:21:46,990 --> 00:21:49,520 So wat is probleem 33 op die quiz. 261 00:21:49,520 --> 00:21:52,480 Ons sal beslis meer lêer I / O kom. 262 00:21:52,480 --> 00:21:55,130 Ons sal 'n bietjie meer vandag in die lesing te doen, of in artikel vandag, 263 00:21:55,130 --> 00:22:01,710 want dit is wat gaan die grootste deel te vorm van hierdie komende pset. 264 00:22:01,710 --> 00:22:05,020 Kom ons gaan van die quiz op hierdie punt. Ja? 265 00:22:05,020 --> 00:22:10,880 >> [Charlotte]] Hoekom fclose (lêer) in plaas van fclose (staff.csv)? 266 00:22:10,880 --> 00:22:19,100 >> Ah. Omdat dit blyk dat - so die vraag, wat is 'n groot een, 267 00:22:19,100 --> 00:22:27,800 is die rede waarom, wanneer ons skryf fclose, ons skryf fclose (lêer) ster veranderlike 268 00:22:27,800 --> 00:22:33,680 in teenstelling met die lêernaam, staff.csv? Is dit korrek? Ja. 269 00:22:33,680 --> 00:22:39,570 So laat ons neem 'n blik. As ek skakel terug na my laptop, 270 00:22:39,570 --> 00:22:45,040 en laat ons kyk by die fclose funksie. 271 00:22:45,040 --> 00:22:51,460 So het die fclose funksie sluit 'n stroom en neem dit in die wyser na die stroom wat ons wil om te sluit, 272 00:22:51,460 --> 00:22:57,010 in teenstelling met die werklike lêernaam wat ons wil maak. 273 00:22:57,010 --> 00:23:01,620 En dit is omdat agter die skerms, wanneer jy 'n oproep tot fopen, 274 00:23:01,620 --> 00:23:12,020 wanneer jy 'n lêer oop te maak, moet jy eintlik die toekenning van geheue inligting oor die lêer te stoor. 275 00:23:12,020 --> 00:23:16,380 So jy het lêer pointer wat inligting oor die lêer, 276 00:23:16,380 --> 00:23:23,080 soos dit is oop, sy grootte, waar jy tans in die lêer, 277 00:23:23,080 --> 00:23:29,100 sodat jy dit kan lees en skryf oproepe na daardie spesifieke plek in die lêer. 278 00:23:29,100 --> 00:23:38,060 Jy uiteindelik die sluiting van die muis in plaas van die sluiting van die lêernaam. 279 00:23:38,060 --> 00:23:48,990 >> Ja? [Daniel] So om huur te gebruik, sou jy sê - hoe werk dit die toevoer van die gebruiker kry? 280 00:23:48,990 --> 00:23:53,830 Is fprintf tree soos GetString in die sin dat dit net sal wag vir die toevoer van die gebruiker 281 00:23:53,830 --> 00:23:57,180 en vra om dit te tik - of wag vir jou hierdie drie dinge in te tik? 282 00:23:57,180 --> 00:24:00,480 Of het jy nodig om iets te gebruik om huur te implementeer? 283 00:24:00,480 --> 00:24:04,100 >> Ja. So ons is nie - die vraag is hoe kry ons die toevoer van die gebruiker 284 00:24:04,100 --> 00:24:09,220 om huur te implementeer? En wat ons hier het, is die oproeper van die huur, 285 00:24:09,220 --> 00:24:17,690 geslaag in hierdie staf struct met al die data wat gestoor word in die struct reeds. 286 00:24:17,690 --> 00:24:22,990 So is fprintf staat is om net te skryf dat die data direk na die lêer. 287 00:24:22,990 --> 00:24:25,690 Daar is geen wag vir toevoer van die gebruiker. 288 00:24:25,690 --> 00:24:32,110 Die gebruiker se reeds die insette deur behoorlik om dit in hierdie personeel struct. 289 00:24:32,110 --> 00:24:36,510 En dinge, natuurlik, sou breek indien enige van daardie wysers was null, 290 00:24:36,510 --> 00:24:40,370 sodat ons blaai terug hier en ons kyk na ons struct. 291 00:24:40,370 --> 00:24:43,640 Ons het string laaste string eerste, string e-pos. 292 00:24:43,640 --> 00:24:48,530 Ons weet nou dat almal van diegene wat werklik onder die kap, is 'n char * veranderlikes. 293 00:24:48,530 --> 00:24:53,470 Wat mag of nie mag nie wys wees aan nul. 294 00:24:53,470 --> 00:24:55,800 Hulle kan wys word die geheue op die hoop, 295 00:24:55,800 --> 00:24:59,650 miskien geheue op die stapel. 296 00:24:59,650 --> 00:25:04,580 Ons nie regtig weet nie, maar indien enige van hierdie wenke is null of ongeldige 297 00:25:04,580 --> 00:25:08,120 dat dit sal beslis ons huur funksie crash. 298 00:25:08,120 --> 00:25:11,050 Dit was iets wat dit was soort van buite die omvang van die eksamen. 299 00:25:11,050 --> 00:25:16,440 Ons is nie bekommerd te wees oor dat. 300 00:25:16,440 --> 00:25:22,170 Groot. Okay. So beweeg van die quiz. 301 00:25:22,170 --> 00:25:25,760 >> Kom ons sluit hierdie man, en ons gaan om te kyk na pset 4. 302 00:25:25,760 --> 00:25:34,700 So as jy ouens kyk na die pset spec, sodra jy dit kan oopmaak, cs50.net/quizzes, 303 00:25:34,700 --> 00:25:42,730 ons gaan om te gaan deur middel van 'n paar van die artikel probleme vandag. 304 00:25:42,730 --> 00:25:52,240 Ek blaai af - afdeling van vrae begin op die derde bladsy van die pset spec. 305 00:25:52,240 --> 00:25:57,800 En die eerste deel vra dat jy om te gaan en die kort kyk op redirecting en pype. 306 00:25:57,800 --> 00:26:02,820 Dit was soort van 'n koel kort, wys jou 'n paar nuwe, cool command line truuks wat jy kan gebruik. 307 00:26:02,820 --> 00:26:06,050 En dan het ons het 'n paar vrae vir jou so goed. 308 00:26:06,050 --> 00:26:10,860 Die eerste vraag oor strome, waarin printf skryf by verstek, 309 00:26:10,860 --> 00:26:15,920 ons soort van net 'n bietjie aangeraak 'n oomblik gelede. 310 00:26:15,920 --> 00:26:22,380 Dit fprintf wat ons nou net bespreek neem in 'n lêer * stroom as sy argument. 311 00:26:22,380 --> 00:26:26,580 fclose neem in 'n lêer * stroom so goed, 312 00:26:26,580 --> 00:26:32,660 en die terugkeer waarde van fopen gee jou 'n lêer * stroom as well. 313 00:26:32,660 --> 00:26:36,060 Die rede waarom ons nie die voorheen gesien wanneer ons het gehandel met printf 314 00:26:36,060 --> 00:26:39,450 is omdat printf 'n standaard stroom. 315 00:26:39,450 --> 00:26:41,810 En die verstek stroom wat dit skryf 316 00:26:41,810 --> 00:26:45,190 jy sal vind meer uit oor in die kort. 317 00:26:45,190 --> 00:26:50,080 So beslis neem 'n blik op dit. 318 00:26:50,080 --> 00:26:53,010 >> In vandag se artikel, gaan ons 'n bietjie om te praat oor GDB, 319 00:26:53,010 --> 00:26:57,720 sedert die meer vertroud is jy met dit, die meer oefening jy met dit, 320 00:26:57,720 --> 00:27:01,390 beter in staat sal wees om werklik te jag af foute in jou eie kode. 321 00:27:01,390 --> 00:27:05,540 Dit versnel die proses van ontfouting geweldig. 322 00:27:05,540 --> 00:27:09,230 Dus, deur die gebruik van printf, elke keer as jy doen wat jy het om jou kode te hercompileren, 323 00:27:09,230 --> 00:27:13,000 jy het dit weer uit te voer, soms moet jy die printf oproep om rond te beweeg, 324 00:27:13,000 --> 00:27:17,100 kommentaar kode, dit neem net 'n rukkie. 325 00:27:17,100 --> 00:27:20,850 Ons doel is om te probeer en jy oortuig dat met GDB, kan jy in wese 326 00:27:20,850 --> 00:27:26,810 printf enigiets op enige punt in jou kode en jy nooit weer hoef dit te hercompileren. 327 00:27:26,810 --> 00:27:35,120 Jy hoef nooit weer te begin en hou raai waar om te printf volgende. 328 00:27:35,120 --> 00:27:40,910 Die eerste ding om te doen is om hierdie lyn te kopieer en die afdeling kode van die web af. 329 00:27:40,910 --> 00:27:47,530 Ek die kopiëring van hierdie lyn van kode wat sê, "wget ​​http://cdn.cs50.net". 330 00:27:47,530 --> 00:27:49,510 Ek gaan om dit te kopieer. 331 00:27:49,510 --> 00:27:55,950 Ek gaan om te gaan na my toestel, uitzoomen sodat jy kan sien wat ek doen, 332 00:27:55,950 --> 00:28:01,890 plak dit in daar, en toe ek druk Enter hierdie wget opdrag letterlik is om 'n web te kry. 333 00:28:01,890 --> 00:28:06,210 Dit gaan hierdie lêer af te trek van die Internet af, 334 00:28:06,210 --> 00:28:11,790 en dit gaan en stoor dit in die huidige gids. 335 00:28:11,790 --> 00:28:21,630 Nou as ek my huidige gids lys kan jy sien dat ek hierdie section5.zip lêer het reg daar. 336 00:28:21,630 --> 00:28:25,260 Die manier om te gaan met daardie man is om dit oop te rits, 337 00:28:25,260 --> 00:28:27,650 wat jy kan doen in die command line, net soos hierdie. 338 00:28:27,650 --> 00:28:31,880 Section5.zip. 339 00:28:31,880 --> 00:28:36,980 Dat dit sal Pak, die skep van die gids vir my, 340 00:28:36,980 --> 00:28:40,410 blaas al die inhoud, sit hulle in daar. 341 00:28:40,410 --> 00:28:47,410 So nou kan ek gaan in my artikel 5 directory deur gebruik te maak van die cd opdrag. 342 00:28:47,410 --> 00:28:58,310 Duidelik dat die skerm met behulp van duidelike. So duidelik die skerm. 343 00:28:58,310 --> 00:29:02,280 Nou het ek 'n mooi skoon terminale om te hanteer. 344 00:29:02,280 --> 00:29:06,200 >> Maar as ek n lys van al die lêers wat ek sien in hierdie gids, 345 00:29:06,200 --> 00:29:12,270 jy sien dat ek vier lêers het: buggy1, buggy2, buggy3 en buggy4. 346 00:29:12,270 --> 00:29:16,180 Ek het ook 'hul ooreenstemmende c lêers. 347 00:29:16,180 --> 00:29:20,400 Ons gaan nie om te kyk na die c-lêers. Vir nou. 348 00:29:20,400 --> 00:29:24,140 In plaas daarvan, ons gaan om dit te gebruik wanneer ons oopmaak GDB. 349 00:29:24,140 --> 00:29:28,220 Ons het het hulle rondom, sodat ons toegang tot die werklike bronkode wanneer ons gebruik GDB, 350 00:29:28,220 --> 00:29:32,740 maar die doel van hierdie deel van die artikel is om te geknoei rondom met GDB 351 00:29:32,740 --> 00:29:40,370 en kyk hoe ons dit kan gebruik om uit te vind wat verkeerd gaan met elk van hierdie vier buggy programme. 352 00:29:40,370 --> 00:29:43,380 Sodat ons net gaan regtig vinnig in die kamer rond, 353 00:29:43,380 --> 00:29:47,000 en ek gaan om iemand te vra om een ​​van die karretjie programme uit te voer, 354 00:29:47,000 --> 00:29:54,730 en dan sal ons as 'n groep deur GDB, en ons sal sien wat ons kan doen om hierdie programme te los, 355 00:29:54,730 --> 00:29:58,460 of ten minste identifiseer wat verkeerd gaan in elkeen van hulle. 356 00:29:58,460 --> 00:30:04,760 Kom ons begin hier met Daniël. Sal jy hardloop buggy1? Kom ons kyk wat gebeur. 357 00:30:04,760 --> 00:30:09,470 [Daniel] Dit sê daar is 'n aansoek skuld. >> Ja. Presies. 358 00:30:09,470 --> 00:30:12,460 So as ek hardloop buggy1, ek kry 'n seg skuld. 359 00:30:12,460 --> 00:30:16,210 Op hierdie punt, kan ek gaan en maak buggy1.c, 360 00:30:16,210 --> 00:30:19,450 probeer uitvind wat verkeerd gaan, 361 00:30:19,450 --> 00:30:22,000 maar een van die mees aanstootlike dinge oor hierdie seg fout 362 00:30:22,000 --> 00:30:27,610 is dat dit nie vertel op watter lyn van die program dinge verkeerd geloop het en gebreek het. 363 00:30:27,610 --> 00:30:29,880 Jy soort van om te kyk na die kode 364 00:30:29,880 --> 00:30:33,990 en uit te vind met behulp van raaiskoot en kyk of printf om te sien wat verkeerd gaan. 365 00:30:33,990 --> 00:30:37,840 Een van die coolste dinge oor GDB is dat dit regtig, regtig maklik 366 00:30:37,840 --> 00:30:42,170 die lyn om uit te vind wat jou program crashes. 367 00:30:42,170 --> 00:30:46,160 Dit is heeltemal die moeite werd om dit te gebruik, selfs al is net vir daardie. 368 00:30:46,160 --> 00:30:56,190 So om te laat selflaai GDB, ek tik GDB en dan gee ek dit die pad na die uitvoer wat ek wil uit te voer. 369 00:30:56,190 --> 00:31:01,960 Hier is ek tik gdb ./buggy1. 370 00:31:01,960 --> 00:31:06,600 Druk Enter. Gee my al hierdie inligting oor kopiereg, 371 00:31:06,600 --> 00:31:13,000 en af ​​hier, sien jy hierdie lyn wat sê, "Lees simbole van / home / 372 00:31:13,000 --> 00:31:17,680 jharvard/section5/buggy1. " 373 00:31:17,680 --> 00:31:22,060 En as alles goed gaan, sien jy druk dit uit 'n boodskap wat lyk soos hierdie. 374 00:31:22,060 --> 00:31:25,500 Dit simbole sal lees, sal dit sê: "Ek simbole is op die lees van jou uitvoerbare lêer" 375 00:31:25,500 --> 00:31:29,900 en dan sal dit hierdie "gedoen" boodskap hier. 376 00:31:29,900 --> 00:31:35,410 As jy sien 'n ander variasie van hierdie, of jy sien dit nie kon vind die simbole 377 00:31:35,410 --> 00:31:41,460 of iets soos dit, wat dit beteken, is dat jy net nie jou uitvoerbare saamgestel behoorlik. 378 00:31:41,460 --> 00:31:49,980 Wanneer ons programme vir gebruik met GDB stel, ons het daardie spesiale g vlag te gebruik, 379 00:31:49,980 --> 00:31:54,540 en dit is by verstek as jy jou programme stel, net deur te tik maak 380 00:31:54,540 --> 00:31:59,320 of buggy of herstel, enige van daardie. 381 00:31:59,320 --> 00:32:07,800 Maar as jy dit handmatig opstel met kletteren, dan sal jy het om te gaan en dat-g vlag insluit. 382 00:32:07,800 --> 00:32:10,310 >> Op hierdie punt, nou dat ons ons GDB prompt, 383 00:32:10,310 --> 00:32:12,310 dit is redelik maklik om die program uit te voer. 384 00:32:12,310 --> 00:32:19,740 Ons kan óf tik hardloop, of ons kan net tik r. 385 00:32:19,740 --> 00:32:22,820 Meeste GDB opdragte kan afgekort word. 386 00:32:22,820 --> 00:32:25,940 Gewoonlik net een of 'n paar letters, wat is redelik nice. 387 00:32:25,940 --> 00:32:30,980 So Saad, as jy tik r en druk Enter, wat gebeur? 388 00:32:30,980 --> 00:32:39,390 [Saad] Ek het SIGSEGV, segmentering skuld, en dan sal al hierdie codes. 389 00:32:39,390 --> 00:32:43,650 >> Ja. 390 00:32:43,650 --> 00:32:47,990 Soos ons sien op die skerm op die oomblik, en soos Saad het gesê, 391 00:32:47,990 --> 00:32:53,430 wanneer ons tik run of r en druk Enter, ons kry nog steeds dieselfde seg skuld. 392 00:32:53,430 --> 00:32:55,830 Sodat die gebruik GDB nie ons probleem op te los. 393 00:32:55,830 --> 00:32:59,120 Maar dit gee ons 'n paar codes, en dit blyk dat hierdie codes 394 00:32:59,120 --> 00:33:03,080 eintlik vertel vir ons waar dit gebeur. 395 00:33:03,080 --> 00:33:10,680 Dit 'n bietjie te verwerk, hierdie eerste bietjie is die funksie wat alles verkeerd gaan. 396 00:33:10,680 --> 00:33:20,270 Daar is dit __ strcmp_sse4_2, en dit vertel ons dat dit gebeur in hierdie lêer 397 00:33:20,270 --> 00:33:29,450 genoem sysdeps/i386, al hierdie, weer, soort van 'n gemors, maar line 254. 398 00:33:29,450 --> 00:33:31,670 Dit is soort van moeilik om te ontleed. Gewoonlik wanneer jy sien dinge soos hierdie, 399 00:33:31,670 --> 00:33:38,770 wat beteken dat dit seg verskuiwings in een van die stelsel biblioteke. 400 00:33:38,770 --> 00:33:43,220 So iets te doen met strcmp. Julle het gesien strcmp voor. 401 00:33:43,220 --> 00:33:52,730 Nie te gek, maar dit beteken nie dat strcmp is gebreek of dat daar is 'n probleem met strcmp? 402 00:33:52,730 --> 00:33:57,110 Wat dink jy, Alexander? 403 00:33:57,110 --> 00:34:04,890 [Alexander] Is dit - is 254 die lyn? En die nie die binêre, maar dit is nie hul plafonne, 404 00:34:04,890 --> 00:34:10,590 en dan is daar ander taal vir elke funksie. Is dat 254 in die funksie, of -? 405 00:34:10,590 --> 00:34:21,460 >> Dis line 254. Dit lyk soos in hierdie s-lêer, so dit is gemeente-kode waarskynlik. 406 00:34:21,460 --> 00:34:25,949 >> , Maar ek dink die meer dringende ding is, want ons het 'n seg skuld gekry, 407 00:34:25,949 --> 00:34:29,960 en dit lyk asof dit kom van die strcmp funksie, 408 00:34:29,960 --> 00:34:38,030 impliseer dit, dan is daardie strcmp gebreek? 409 00:34:38,030 --> 00:34:42,290 Dit behoort nie, hopelik. So net omdat jy 'n segmentering skuld 410 00:34:42,290 --> 00:34:49,480 in een van die stelsel funksioneer, tipies wat beteken dat jy net nie genoem dit korrek. 411 00:34:49,480 --> 00:34:52,440 Die vinnigste ding om te doen om uit te vind wat werklik aangaan 412 00:34:52,440 --> 00:34:55,500 wanneer jy iets sien wat mal soos hierdie, wanneer jy sien 'n seg skuld, 413 00:34:55,500 --> 00:34:59,800 veral as jy 'n program wat die gebruik van meer as net die hoof, 414 00:34:59,800 --> 00:35:03,570 is 'n sleepspoor te gebruik. 415 00:35:03,570 --> 00:35:13,080 Ek afkorten sleepspoor deur die skryf van BT, in teenstelling met die volle sleepspoor woord. 416 00:35:13,080 --> 00:35:16,510 Maar Charlotte, wat gebeur wanneer jy tik bt en druk Enter? 417 00:35:16,510 --> 00:35:23,200 [Charlotte] Dit wys my twee lyne, lyn 0 en lyn 1. 418 00:35:23,200 --> 00:35:26,150 >> Ja. So lyn 0 en line 1. 419 00:35:26,150 --> 00:35:34,560 Dit is die werklike stapel rame wat tans in die spel wanneer jou program neergestort het. 420 00:35:34,560 --> 00:35:42,230 Begin van die boonste raam, raam 0, en gaan na die onderste, wat is raam 1. 421 00:35:42,230 --> 00:35:45,140 Ons boonste raam is die strcmp raam. 422 00:35:45,140 --> 00:35:50,080 Jy kan dink van hierdie as soortgelyk aan dat die probleem wat ons net op die quiz met die wysers, 423 00:35:50,080 --> 00:35:54,890 waar ons het op die top van die belangrikste stapel stapel ruil, 424 00:35:54,890 --> 00:35:59,700 en ons het die veranderlikes wat swap gebruik op die top van die veranderlikes wat die belangrikste is die gebruik van. 425 00:35:59,700 --> 00:36:08,440 Hier om ons ongeluk gebeur het in ons strcmp funksie, wat deur ons belangrikste funksie genoem is, 426 00:36:08,440 --> 00:36:14,370 en sleepspoor gee ons nie net die funksies wat dinge misluk, 427 00:36:14,370 --> 00:36:16,440 maar dit is ook om ons te vertel waar alles is, geroepe uit. 428 00:36:16,440 --> 00:36:18,830 So as ek scroll oor 'n bietjie meer na regs, 429 00:36:18,830 --> 00:36:26,110 kan ons sien dat ja, ons on line 254 van hierdie strcmp-sse4.s lêer. 430 00:36:26,110 --> 00:36:32,540 Maar die oproep was gemaak by buggy1.c, line 6. 431 00:36:32,540 --> 00:36:35,960 Dus beteken dit dat ons kan doen - ons kan net gaan check en kyk wat aangaan 432 00:36:35,960 --> 00:36:39,930 by buggy1.c, line 6. 433 00:36:39,930 --> 00:36:43,780 Weereens, daar is 'n paar maniere om dit te doen. Een daarvan is om af te sluit van GDB 434 00:36:43,780 --> 00:36:49,460 of jou kode in 'n ander venster oopmaak en kruisverwysing. 435 00:36:49,460 --> 00:36:54,740 Dat, in en van die self, is redelik handig want nou as jy by kantoorure 436 00:36:54,740 --> 00:36:57,220 en jy het 'n seg skuld en jou TF wonder waar alles breek, 437 00:36:57,220 --> 00:36:59,710 jy kan net sê, "O, lyn 6. Ek weet nie wat gaan aan, 438 00:36:59,710 --> 00:37:03,670 maar iets oor line 6 veroorsaak dat my program om te breek. " 439 00:37:03,670 --> 00:37:10,430 Die ander manier om dit te doen, is wat jy kan gebruik maak van hierdie opdrag genoem lys in GDB. 440 00:37:10,430 --> 00:37:13,650 Jy kan ook afkorten dit met l. 441 00:37:13,650 --> 00:37:18,910 So as ons getref l, wat ons hier kry? 442 00:37:18,910 --> 00:37:21,160 Ons kry 'n hele klomp van die vreemde dinge. 443 00:37:21,160 --> 00:37:26,030 Dit is die werklike vergadering kode 444 00:37:26,030 --> 00:37:29,860 wat in strcmp_sse4_2. 445 00:37:29,860 --> 00:37:32,440 Dit lyk soort van funky, 446 00:37:32,440 --> 00:37:36,520 en die rede waarom ons kry is omdat right now, 447 00:37:36,520 --> 00:37:40,160 GDB het ons in raam 0. 448 00:37:40,160 --> 00:37:43,070 >> Dit doen wanneer ons kyk na die veranderlikes, enige tyd wat ons kyk na die bronkode, 449 00:37:43,070 --> 00:37:50,530 ons is op soek na die bronkode wat betrekking het op die stapel raam ons tans is. 450 00:37:50,530 --> 00:37:53,200 So om iets betekenisvol te kry, moet ons 451 00:37:53,200 --> 00:37:57,070 skuif na 'n stapel raam wat meer sin maak. 452 00:37:57,070 --> 00:38:00,180 In hierdie geval, sou die belangrikste stapel raam 'n bietjie meer sin maak, 453 00:38:00,180 --> 00:38:02,680 want dit was eintlik die kode wat ons geskryf het. 454 00:38:02,680 --> 00:38:05,330 Nie die strcmp kode. 455 00:38:05,330 --> 00:38:08,650 Die manier waarop jy kan beweeg tussen rame, in hierdie geval, want ons het twee, 456 00:38:08,650 --> 00:38:10,430 ons het 0 en 1, 457 00:38:10,430 --> 00:38:13,650 jy dit doen met die up en down opdragte. 458 00:38:13,650 --> 00:38:18,480 As ek beweeg op 'n raam, 459 00:38:18,480 --> 00:38:21,770 nou is ek in die belangrikste stapel raam. 460 00:38:21,770 --> 00:38:24,330 Ek kan beweeg om terug te gaan na waar ek was, 461 00:38:24,330 --> 00:38:32,830 weer nader trek, gaan af weer, en gaan weer. 462 00:38:32,830 --> 00:38:39,750 As jy ooit jou program in GDB doen, kry jy 'n ongeluk, kry jy die sleepspoor 463 00:38:39,750 --> 00:38:42,380 en jy sien dat dit in sommige lêer dat jy nie weet wat gaan aan. 464 00:38:42,380 --> 00:38:45,460 Jy probeer lys, die kode nie kyk aan jou bekend, 465 00:38:45,460 --> 00:38:48,150 neem 'n blik op jou rame en uit te vind waar jy is. 466 00:38:48,150 --> 00:38:51,010 Is jy waarskynlik in die verkeerde stapel raam. 467 00:38:51,010 --> 00:38:58,760 Of ten minste jy in 'n stapel raam dit is nie die een wat jy werklik kan ontfout. 468 00:38:58,760 --> 00:39:03,110 Nou dat ons in die toepaslike stapel raam, ons is in die hoof, 469 00:39:03,110 --> 00:39:08,100 nou kan ons die lys opdrag gebruik om uit te vind wat die lyn was. 470 00:39:08,100 --> 00:39:13,590 En jy kan sien dit, dit druk dit vir ons hier. 471 00:39:13,590 --> 00:39:19,470 Maar ons kan Hit List almal dieselfde, en die lys gee ons hierdie mooi uitdruk 472 00:39:19,470 --> 00:39:23,920 van die werklike bron kode wat gaan hier. 473 00:39:23,920 --> 00:39:26,420 >> In die besonder, kan ons kyk na line 6. 474 00:39:26,420 --> 00:39:29,330 Ons kan sien wat hier aangaan nie. 475 00:39:29,330 --> 00:39:31,250 En dit lyk asof ons die maak van 'n string vergelyking 476 00:39:31,250 --> 00:39:41,050 tussen die string "CS50 rotse" en bevat SPASIES [1]. 477 00:39:41,050 --> 00:39:45,700 Iets omtrent hierdie is gekraak. 478 00:39:45,700 --> 00:39:54,120 So Missy, het jy enige gedagtes oor wat gaan hier aan? 479 00:39:54,120 --> 00:39:59,400 [Missy] Ek weet nie waarom dit gekraak. >> Jy weet nie hoekom dit gekraak? 480 00:39:59,400 --> 00:40:02,700 Jimmy, enige gedagtes? 481 00:40:02,700 --> 00:40:06,240 [Jimmy] Ek is nie heeltemal seker nie, maar die laaste keer wat ons gebruik string te vergelyk, 482 00:40:06,240 --> 00:40:10,260 of strcmp, het ons soos drie verskillende gevalle onder dit. 483 00:40:10,260 --> 00:40:12,800 Ons het nie 'n ==, ek dink nie, reg in daardie eerste lyn. 484 00:40:12,800 --> 00:40:16,700 In plaas daarvan was verdeel in drie en een was == 0, 485 00:40:16,700 --> 00:40:19,910 een was <0, dink ek, en 'n mens was> 0. 486 00:40:19,910 --> 00:40:22,590 So miskien iets soos dit? >> Ja. So daar is hierdie kwessie 487 00:40:22,590 --> 00:40:27,200 van doen ons die vergelyking korrek? 488 00:40:27,200 --> 00:40:31,660 Stella? Enige gedagtes? 489 00:40:31,660 --> 00:40:38,110 [Stella] Ek is nie seker nie. >> Nie seker nie. Daniel? Gedagtes? Okay. 490 00:40:38,110 --> 00:40:44,770 Dit blyk uit wat gebeur hier is wanneer ons hardloop die program 491 00:40:44,770 --> 00:40:48,370 en ons het die seg skuld, wanneer jy hardloop die program vir die eerste keer, Daniel, 492 00:40:48,370 --> 00:40:50,800 het jy gee dit 'n command line argumente? 493 00:40:50,800 --> 00:40:58,420 [Daniel] No >> No. In daardie geval, wat is die waarde van [1] bevat SPASIES? 494 00:40:58,420 --> 00:41:00,920 >> Daar is geen waarde nie. >> Reg. 495 00:41:00,920 --> 00:41:06,120 Wel, daar is geen geskikte string waarde. 496 00:41:06,120 --> 00:41:10,780 Maar daar is 'n paar waarde. Wat is die waarde wat daar gestoor kry? 497 00:41:10,780 --> 00:41:15,130 >> 'N gemors waarde? >> Dit is óf 'n gemors waarde of, in hierdie geval, 498 00:41:15,130 --> 00:41:19,930 die einde van die bevat SPASIES skikking is altyd beëindig met null. 499 00:41:19,930 --> 00:41:26,050 So, wat eintlik het gestoor in daar is null. 500 00:41:26,050 --> 00:41:30,810 Die ander manier om dit op te los, eerder as om te dink dit deur, 501 00:41:30,810 --> 00:41:33,420 is om te probeer om druk dit uit. 502 00:41:33,420 --> 00:41:35,880 Dit is waar ek het gesê dat die gebruik van GDB is 'n groot, 503 00:41:35,880 --> 00:41:40,640 want jy kan druk uit al die veranderlikes, al die waardes wat jy wil 504 00:41:40,640 --> 00:41:43,230 die gebruik van hierdie handy-dandy p opdrag. 505 00:41:43,230 --> 00:41:48,520 So as ek tik p en dan het ek tik die waarde van 'n veranderlike of die naam van 'n veranderlike, 506 00:41:48,520 --> 00:41:55,320 sê, die argc, ek sien dat argc is 1. 507 00:41:55,320 --> 00:42:01,830 As ek wil uit te druk bevat SPASIES [0], kan ek dit doen net soos wat. 508 00:42:01,830 --> 00:42:04,840 En soos ons gesien het, bevat SPASIES [0] is altyd die naam van jou program, 509 00:42:04,840 --> 00:42:06,910 altyd die naam van die uitvoerbare. 510 00:42:06,910 --> 00:42:09,740 Hier sien jy die volle padnaam het. 511 00:42:09,740 --> 00:42:15,920 Ek kan ook druk bevat SPASIES [1] en sien wat gebeur. 512 00:42:15,920 --> 00:42:20,890 >> Hier het ons het hierdie soort van mistieke waarde. 513 00:42:20,890 --> 00:42:23,890 Ons het hierdie 0x0. 514 00:42:23,890 --> 00:42:27,850 Onthou om die begin van die kwartaal, toe ons gepraat oor heksadesimale getalle? 515 00:42:27,850 --> 00:42:34,680 Of daardie klein vraag oor hoe om 50 te verteenwoordig in blok aan die einde van pset 0? 516 00:42:34,680 --> 00:42:39,410 Die manier waarop ons skryf blok getalle in CS, net om nie verwar onsself 517 00:42:39,410 --> 00:42:46,080 met desimale getalle, is dat ons altyd prefix hulle met 0x. 518 00:42:46,080 --> 00:42:51,420 So hierdie 0x voorvoegsel beteken net altyd interpreteer die volgende nommer as 'n heksadesimale getal, 519 00:42:51,420 --> 00:42:57,400 nie as 'n string, nie as 'n desimale getal, nie as 'n binêre getal. 520 00:42:57,400 --> 00:43:02,820 Aangesien die getal 5-0 is 'n geldige nommer in heksadesimaal. 521 00:43:02,820 --> 00:43:06,240 En dit is 'n aantal desimale, 50. 522 00:43:06,240 --> 00:43:10,050 So dit is net hoe ons disambiguate. 523 00:43:10,050 --> 00:43:14,860 So 0x0 middel heksadesimale 0, wat ook desimale 0, binêre 0. 524 00:43:14,860 --> 00:43:17,030 Dit is net die waarde 0. 525 00:43:17,030 --> 00:43:22,630 Dit blyk dat dit is wat null is, eintlik, in die geheue. 526 00:43:22,630 --> 00:43:25,940 Null is net 0. 527 00:43:25,940 --> 00:43:37,010 Hier is die element gestoor op [1] bevat SPASIES null. 528 00:43:37,010 --> 00:43:45,220 Dus het ons probeer om ons "CS50 rotse" string te vergelyk met 'n null string. 529 00:43:45,220 --> 00:43:48,130 So ontwysing null, probeer dinge om toegang te verkry tot null, 530 00:43:48,130 --> 00:43:55,050 dit word gewoonlik gaan om 'n soort van segmentering skuld of ander slegte dinge gebeur te veroorsaak. 531 00:43:55,050 --> 00:43:59,350 En dit blyk dat strcmp nie kyk om te sien 532 00:43:59,350 --> 00:44:04,340 of jy in 'n waarde wat null geslaag het. 533 00:44:04,340 --> 00:44:06,370 Inteendeel, dit gaan net vorentoe, probeer om sy ding te doen, 534 00:44:06,370 --> 00:44:14,640 en indien dit seg foute, dit seg foute, en dit is jou probleem. Jy het om te gaan regmaak. 535 00:44:14,640 --> 00:44:19,730 Regtig vinnig, kan hoe ons hierdie probleem op te los? Charlotte? 536 00:44:19,730 --> 00:44:23,540 [Charlotte] Jy kan die gebruik van as. 537 00:44:23,540 --> 00:44:32,240 So as bevat SPASIES [1], is van nul, == 0, dan terug 1, of iets [onverstaanbaar]. 538 00:44:32,240 --> 00:44:34,590 >> Ja. So dit is 'n goeie manier om dit te doen, as ons kan kyk om te sien, 539 00:44:34,590 --> 00:44:39,230 die waarde wat ons is om te slaag in strcmp, bevat SPASIES [1], is dit nul? 540 00:44:39,230 --> 00:44:45,830 As dit null, dan moet ons kan sê okay, aborteer. 541 00:44:45,830 --> 00:44:49,450 >> 'N meer algemene manier om dit te doen, is om die argc waarde te gebruik. 542 00:44:49,450 --> 00:44:52,040 Jy kan hier aan die begin van die hoof sien, 543 00:44:52,040 --> 00:44:58,040 ons dat die eerste toets weggelaat wat ons gewoonlik doen wanneer ons gebruik command line argumente, 544 00:44:58,040 --> 00:45:05,240 wat is om te toets of ons argc waarde is wat ons verwag. 545 00:45:05,240 --> 00:45:10,290 In hierdie geval, ons verwag dat ten minste twee argumente, 546 00:45:10,290 --> 00:45:13,660 die naam van die program, plus een ander persoon. 547 00:45:13,660 --> 00:45:17,140 Want ons is oor die tweede argument hier gebruik. 548 00:45:17,140 --> 00:45:21,350 So 'n soort van die toets vooraf voor ons strcmp oproep 549 00:45:21,350 --> 00:45:37,390 dat toetse of bevat SPASIES is ten minste 2, sou ook die dieselfde soort van ding doen. 550 00:45:37,390 --> 00:45:40,620 Ons kan sien of dit werk deur die loop van die program weer. 551 00:45:40,620 --> 00:45:45,610 Jy kan altyd herlaai program binne GDB, wat is regtig mooi. 552 00:45:45,610 --> 00:45:49,310 Jy kan hardloop, en wanneer jy in argumente na jou program, 553 00:45:49,310 --> 00:45:53,060 jy slaag hulle in wanneer jy bel hardloop, nie wanneer jy opstart GDB. 554 00:45:53,060 --> 00:45:57,120 Die manier wat jy kan hou oproep van jou program met verskillende argumente elke keer. 555 00:45:57,120 --> 00:46:08,080 So hardloop, of weer, ek kan tik r, en laat ons sien wat gebeur as ons tik "hallo". 556 00:46:08,080 --> 00:46:11,140 Dit sal altyd vra as jy wil dit van die begin af weer te begin. 557 00:46:11,140 --> 00:46:17,490 Gewoonlik wil jy dit van die begin af weer te begin. 558 00:46:17,490 --> 00:46:25,010 En op hierdie punt, is dit weer begin dit weer, dit druk uit 559 00:46:25,010 --> 00:46:28,920 die program dat ons hardloop, buggy1, met die argument hallo, 560 00:46:28,920 --> 00:46:32,720 en dit druk hierdie standaard uit, dit sê, "Jy kry 'n D," hartseer gesig. 561 00:46:32,720 --> 00:46:37,610 Maar ons het nie seg skuld. Daar word gesê dat die proses gewoonlik opgewonde. 562 00:46:37,610 --> 00:46:39,900 So dit lyk redelik goed. 563 00:46:39,900 --> 00:46:43,050 Geen meer seg fout, ons het dit verlede, 564 00:46:43,050 --> 00:46:48,190 sodat dit lyk soos dit was inderdaad die seg fout fout wat ons kon kry. 565 00:46:48,190 --> 00:46:51,540 Ongelukkig is dit vir ons sê dat ons 'n D. kry 566 00:46:51,540 --> 00:46:54,090 >> Ons kan terug gaan en kyk na die kode en kyk wat daar aangaan 567 00:46:54,090 --> 00:46:57,980 om uit te vind wat was - waarom dit is om ons te vertel dat ons 'n D. 568 00:46:57,980 --> 00:47:03,690 Kom ons kyk, hier is hierdie printf sê dat jy 'n D. 569 00:47:03,690 --> 00:47:08,540 As ons tik lys, as jy hou tik lys, dit hou deur jou program iterating, 570 00:47:08,540 --> 00:47:10,940 so dit sal wys jy die eerste paar lyne van jou program. 571 00:47:10,940 --> 00:47:15,450 Dan sal dit wys dat jy die volgende paar lyne, en die volgende stuk en die volgende stuk. 572 00:47:15,450 --> 00:47:18,240 En dit sal aanhou probeer om af te gaan. 573 00:47:18,240 --> 00:47:21,180 En nou het ons kry "lyn nommer 16 is buite bereik." 574 00:47:21,180 --> 00:47:23,940 Want dit het slegs 15 lyne. 575 00:47:23,940 --> 00:47:30,310 As jy op hierdie punt en jou wonder, "Wat moet ek doen?" jy kan gebruik om die hulp opdrag. 576 00:47:30,310 --> 00:47:34,340 Gebruik help en dan gee dit die naam van 'n opdrag. 577 00:47:34,340 --> 00:47:36,460 En jy sien die GDB gee ons al hierdie soort van dinge. 578 00:47:36,460 --> 00:47:43,870 Dit sê, "Met geen argument, lys van tien lyne na of rondom die vorige lys. 579 00:47:43,870 --> 00:47:47,920 Lys - bevat 'n lys van die tien lyne voor " 580 00:47:47,920 --> 00:47:52,960 So laat ons probeer om met behulp van lys minus. 581 00:47:52,960 --> 00:47:57,000 En 'n lys van die 10 lyne vorige, kan jy speel 'n bietjie rond met lys. 582 00:47:57,000 --> 00:48:02,330 Jy kan lys, lys doen - jy kan selfs gee noem 'n aantal, soos die lys 8, 583 00:48:02,330 --> 00:48:07,500 en dit sal n lys van die 10 lyne rondom line 8. 584 00:48:07,500 --> 00:48:10,290 En jy kan sien wat gaan hier aan jy het 'n eenvoudige as anders. 585 00:48:10,290 --> 00:48:13,980 As jy tik in CS50 rotse, druk dit uit "Jy kry 'n A." 586 00:48:13,980 --> 00:48:16,530 Andersins is dit druk uit "Jy kry 'n D." 587 00:48:16,530 --> 00:48:23,770 Bummer dorp. Alles reg. Ja? 588 00:48:23,770 --> 00:48:26,730 >> [Daniel] En toe ek probeer doen CS50 rotse sonder die aanhalingstekens, 589 00:48:26,730 --> 00:48:29,290 dit sê: "Jy kry 'n D." 590 00:48:29,290 --> 00:48:32,560 Ek nodig het om die kwotasies te kry om dit te werk, hoekom is dit? 591 00:48:32,560 --> 00:48:38,490 >> Ja. Dit blyk dat wanneer - dit is 'n prettige klein versnapering - 592 00:48:38,490 --> 00:48:47,900 wanneer jy die program, as ons hardloop en ons tik in CS50 rotse, 593 00:48:47,900 --> 00:48:50,800 net soos Daniël het gesê hy gedoen het, en jy druk Enter, 594 00:48:50,800 --> 00:48:52,870 dit sê nog steeds kry ons 'n D. 595 00:48:52,870 --> 00:48:55,580 En die vraag is hoekom nie, is dit? 596 00:48:55,580 --> 00:49:02,120 En dit blyk dat beide ons terminale en GDB parse dit as twee afsonderlike argumente. 597 00:49:02,120 --> 00:49:04,800 Want wanneer daar 'n ruimte, wat geïmpliseer is as 598 00:49:04,800 --> 00:49:08,730 die eerste argument geëindig, die volgende argument is om te begin. 599 00:49:08,730 --> 00:49:13,260 Die manier waarop dié in twee te kombineer, of jammer, in 'n argument, 600 00:49:13,260 --> 00:49:18,510 is die aanhalingstekens te gebruik. 601 00:49:18,510 --> 00:49:29,560 So as ons nou, sit dit in aanhalingstekens en loop dit weer, kry ons 'n A. 602 00:49:29,560 --> 00:49:38,780 So net om te Kortom, geen aanhalings, CS50 en rotse as twee afsonderlike argumente ontleed. 603 00:49:38,780 --> 00:49:45,320 Met aanhalings, dit ontleed as 'n argument heeltemal. 604 00:49:45,320 --> 00:49:53,070 >> Ons kan dit met 'n breekpunt. 605 00:49:53,070 --> 00:49:54,920 Tot dusver het ons is die uitvoer van ons program, en dit is al 606 00:49:54,920 --> 00:49:58,230 totdat dit óf seg foute of hits 'n fout 607 00:49:58,230 --> 00:50:05,930 of totdat dit het 'n opgewonde en alles was heeltemal fyn. 608 00:50:05,930 --> 00:50:08,360 Dit is nie noodwendig die mees nuttige ding, want soms 609 00:50:08,360 --> 00:50:11,840 jy het 'n fout in jou program, maar dit is nie veroorsaak dat 'n segmentering skuld. 610 00:50:11,840 --> 00:50:16,950 Dit is nie veroorsaak dat jou program te stop of iets soos dit. 611 00:50:16,950 --> 00:50:20,730 Die manier waarop GDB te kry om te breek jou program op 'n bepaalde punt 612 00:50:20,730 --> 00:50:23,260 is 'n breekpunt te stel. 613 00:50:23,260 --> 00:50:26,520 Jy kan dit doen deur die opstel van 'n breekpunt op 'n funksie naam 614 00:50:26,520 --> 00:50:30,770 of jy kan 'n breekpunt te stel op 'n spesifieke lyn van kode. 615 00:50:30,770 --> 00:50:34,450 Ek hou van inspeksiepunte op die funksie name te stel, omdat - maklik om te onthou, 616 00:50:34,450 --> 00:50:37,700 en as jy eintlik gaan in en verander jou bron-kode 'n bietjie, 617 00:50:37,700 --> 00:50:42,020 dan sal jou breekpunt eintlik bly op dieselfde plek in jou kode. 618 00:50:42,020 --> 00:50:44,760 AANGESIEN dit as jy reëlnommers gebruik, en die lyn nommers verander 619 00:50:44,760 --> 00:50:51,740 omdat jy byvoeg of verwyder een of ander kode, dan is jou inspeksiepunte is heeltemal al screwed up. 620 00:50:51,740 --> 00:50:58,590 Een van die mees algemene dinge wat ek doen is 'n breekpunt op die belangrikste funksie. 621 00:50:58,590 --> 00:51:05,300 Dikwels het ek sal selflaai GDB, sal ek tik b hoof, druk Enter, en dit sal 'n breekpunt te stel 622 00:51:05,300 --> 00:51:10,630 op die hooffunksie wat net sê, "Stop die program so gou as jy begin hardloop," 623 00:51:10,630 --> 00:51:17,960 en dat die pad, toe ek my program met, sê, CS50 rotse loop as twee argumente 624 00:51:17,960 --> 00:51:24,830 en druk Enter, dit raak aan die hoofprogram en dit stop regs by die heel eerste lyn, 625 00:51:24,830 --> 00:51:30,620 reg voor dit evalueer die strcmp funksie. 626 00:51:30,620 --> 00:51:34,940 >> Aangesien ek gestop, nou kan ek begin mucking rond en sien wat gaan aan 627 00:51:34,940 --> 00:51:40,250 met al die verskillende veranderlikes wat in my program geslaag word. 628 00:51:40,250 --> 00:51:43,670 Hier kan ek druk argc en kyk wat gaan aan. 629 00:51:43,670 --> 00:51:50,030 Sien dat argc is 3 nie, want dit het 3 verskillende waardes in. 630 00:51:50,030 --> 00:51:54,060 Dit die naam van die program het, dit het die eerste argument en die tweede argument. 631 00:51:54,060 --> 00:52:09,330 Ons kan druk wat uit deur te kyk by bevat SPASIES [0], bevat SPASIES [1], en bevat SPASIES [2]. 632 00:52:09,330 --> 00:52:12,030 So nou kan jy ook sien waarom hierdie strcmp oproep gaan om te misluk, 633 00:52:12,030 --> 00:52:21,650 omdat julle sien dat dit het verdeel die CS50 en die rotse in twee afsonderlike argumente. 634 00:52:21,650 --> 00:52:27,250 Op hierdie punt, as jy het 'n breekpunt getref, kan jy voortgaan om te stap vir stap deur jou program 635 00:52:27,250 --> 00:52:32,920 reël vir reël, eerder as aan die begin van jou program weer. 636 00:52:32,920 --> 00:52:35,520 So as jy nie wil hê om jou program te weer en net begin voortgaan om van hier, 637 00:52:35,520 --> 00:52:41,970 kan jy die continue opdrag gebruik en voortgaan sal die program loop tot die einde toe. 638 00:52:41,970 --> 00:52:45,010 Net soos dit hier gedoen het. 639 00:52:45,010 --> 00:52:54,880 Maar as ek die program, CS50 rotse herlaai, is dit treffers weer my breekpunt, 640 00:52:54,880 --> 00:52:59,670 en hierdie keer, as ek wil nie om net te gaan al die pad deur die res van die program, 641 00:52:59,670 --> 00:53:08,040 Ek kan gebruik om die volgende opdrag, wat Ek ook afkorten met n. 642 00:53:08,040 --> 00:53:12,960 En dit sal stap vir stap deur die program lyn deur die lyn. 643 00:53:12,960 --> 00:53:17,530 Sodat jy kan sien as dinge uit te voer, as veranderlikes, soos dinge opgedateer. 644 00:53:17,530 --> 00:53:21,550 Wat is redelik nice. 645 00:53:21,550 --> 00:53:26,570 Die ander cool ding is, eerder as dieselfde opdrag herhaal oor en oor en oor weer, 646 00:53:26,570 --> 00:53:30,670 as jy net Enter tref - so hier is julle sien dat Ek het nie in enigiets getik - 647 00:53:30,670 --> 00:53:33,780 as ek net druk Enter, sal dit die vorige opdrag herhaal, 648 00:53:33,780 --> 00:53:36,900 of die vorige GDB bevel gegee het dat ek net sit. 649 00:53:36,900 --> 00:53:56,000 Ek kan hou Enter en dit sal aanhou versterk deur my kode reël vir reël. 650 00:53:56,000 --> 00:53:59,310 Ek wil julle aanmoedig om te gaan check out die ander buggy programme sowel. 651 00:53:59,310 --> 00:54:01,330 Ons het nie tyd om te kry deur almal van hulle vandag in artikel. 652 00:54:01,330 --> 00:54:05,890 Die bron-kode is daar, sodat jy kan soort van kyk wat gaan aan 653 00:54:05,890 --> 00:54:07,730 agter die skerms as jy regtig vashaak, 654 00:54:07,730 --> 00:54:11,940 maar op die heel minste, net oefen selflaai GDB, 655 00:54:11,940 --> 00:54:13,940 die uitvoer van die program totdat dit breek op jou, 656 00:54:13,940 --> 00:54:18,260 om die sleepspoor, uitzoeken wat funksioneer die ongeluk was, 657 00:54:18,260 --> 00:54:24,450 watter lyn dit was op sommige veranderlike waardes uit te druk, 658 00:54:24,450 --> 00:54:30,140 net sodat jy kry 'n gevoel vir dit, want dit sal regtig help om die pad vorentoe. 659 00:54:30,140 --> 00:54:36,340 Op hierdie punt, ons gaan uit GDB om op te hou, wat jy met behulp van stop of net q. 660 00:54:36,340 --> 00:54:40,460 As jou program is in die middel van die bestuur nog steeds, en dit het nie opgewonde, 661 00:54:40,460 --> 00:54:43,510 dit sal altyd vra jou, "Is jy seker dat jy regtig wil om te stop?" 662 00:54:43,510 --> 00:54:48,770 Jy kan net getref ja. 663 00:54:48,770 --> 00:54:55,250 >> Nou gaan ons kyk na die volgende probleem wat ons het, wat is die kat. 664 00:54:55,250 --> 00:54:59,880 As jy kyk na die kort redirecting en pype, sal jy sien dat Tommy gebruik maak van hierdie program 665 00:54:59,880 --> 00:55:07,540 wat druk basies al die uitset van 'n lêer op die skerm. 666 00:55:07,540 --> 00:55:12,660 So as ek hardloop kat, dit is eintlik 'n ingeboude in die program aan die apparaat, 667 00:55:12,660 --> 00:55:16,860 en as jy 'n Mac, kan jy dit doen op jou Mac, as jy oopmaak terminale. 668 00:55:16,860 --> 00:55:25,630 En ons kat, laat ons sê, cp.c, en druk Enter. 669 00:55:25,630 --> 00:55:29,640 Wat dit gedoen het, as ons 'n bietjie scroll en kyk waar ons die lyn gehardloop, 670 00:55:29,640 --> 00:55:40,440 of waar ons die kat opdrag gehardloop, het dit letterlik net gedruk uit die inhoud van cp.c na ons skerm. 671 00:55:40,440 --> 00:55:44,140 Ons dit weer kan hardloop en jy kan sit in veelvuldige lêers saam. 672 00:55:44,140 --> 00:55:49,880 Sodat jy kan kat cp.c doen, en dan kan ons ook koppel die cat.c lêer, 673 00:55:49,880 --> 00:55:53,250 wat is die program wat ons oor te skryf, 674 00:55:53,250 --> 00:55:58,140 en dit sal beide lêers druk rug aan rug na ons skerm. 675 00:55:58,140 --> 00:56:05,490 So as ons 'n bietjie scroll, sien ons dat wanneer ons hierdie kat cp.c, cat.c gehardloop, 676 00:56:05,490 --> 00:56:17,110 dit eerste gedruk die cp lêer, en dan hier, is dit druk die cat.c lêer regs af hier. 677 00:56:17,110 --> 00:56:19,650 Ons gaan om dit te gebruik om net ons voete nat. 678 00:56:19,650 --> 00:56:25,930 Speel rond met 'n eenvoudige druk op die terminale, sien hoe dit werk. 679 00:56:25,930 --> 00:56:39,170 As julle oop te maak met gedit cat.c, druk Enter 680 00:56:39,170 --> 00:56:43,760 jy kan sien die program dat ons oor te skryf. 681 00:56:43,760 --> 00:56:48,980 Ons het hierdie mooi ketel plaat het, sodat ons nie tyd het om te bestee tik alles wat uit. 682 00:56:48,980 --> 00:56:52,310 Ons gaan ook die aantal argumente geslaag. 683 00:56:52,310 --> 00:56:56,910 Ons druk 'n mooi gebruik boodskap. 684 00:56:56,910 --> 00:57:00,950 >> Dit is die soort van ding wat, weer, soos ons het gepraat oor, 685 00:57:00,950 --> 00:57:04,490 dit is amper soos spier-geheue. 686 00:57:04,490 --> 00:57:07,190 Net onthou om te hou die dieselfde soort van dinge te doen 687 00:57:07,190 --> 00:57:11,310 en altyd 'n soort van nuttige boodskap uit te druk 688 00:57:11,310 --> 00:57:17,670 sodat mense weet hoe om jou program te begin. 689 00:57:17,670 --> 00:57:21,630 Met kat, dit is redelik maklik, ons is net gaan om te gaan deur al die verskillende argumente 690 00:57:21,630 --> 00:57:24,300 wat geslaag is aan ons program, en ons gaan te druk 691 00:57:24,300 --> 00:57:29,950 hul inhoud op die skerm een ​​op 'n tyd. 692 00:57:29,950 --> 00:57:35,670 Om die lêers na die skerm te druk, gaan ons iets baie soortgelyk aan 693 00:57:35,670 --> 00:57:38,120 wat ons gedoen het aan die einde van die quiz. 694 00:57:38,120 --> 00:57:45,350 Aan die einde van die quiz, wat huur program, het ons 'n lêer oop te maak, 695 00:57:45,350 --> 00:57:48,490 en dan het ons het om dit uit te druk. 696 00:57:48,490 --> 00:57:54,660 In hierdie geval, ons gaan 'n lêer oop te maak, en ons gaan in plaas van dit te lees. 697 00:57:54,660 --> 00:58:00,630 Daarna het ons gaan uit te druk, in plaas van na 'n lêer, gaan ons na die skerm te druk. 698 00:58:00,630 --> 00:58:05,830 So druk op die skerm wat jy al voorheen gedoen met printf. 699 00:58:05,830 --> 00:58:08,290 So dit is nie te gek. 700 00:58:08,290 --> 00:58:12,190 Maar die lees van 'n lêer is 'n soort van weird. 701 00:58:12,190 --> 00:58:17,300 Ons gaan deur dat 'n bietjie op 'n tyd. 702 00:58:17,300 --> 00:58:20,560 As jy ouens gaan terug na daardie laaste probleem op jou quiz, probleem 33, 703 00:58:20,560 --> 00:58:27,280 die eerste lyn wat ons gaan doen, die opening van die lêer, is baie soortgelyk aan wat ons daar het. 704 00:58:27,280 --> 00:58:36,370 So Stella, wat beteken dat die lyn lyk soos wanneer ons 'n lêer oopmaak? 705 00:58:36,370 --> 00:58:47,510 [Stella] Capital FILE *, lêer - >> Goed. >> - Is gelyk aan fopen. >> Yup. 706 00:58:47,510 --> 00:58:55,980 Wat in hierdie geval is? Dit is in die kommentaar. 707 00:58:55,980 --> 00:59:06,930 >> Dit is in die kommentaar? bevat SPASIES [i] en r? 708 00:59:06,930 --> 00:59:11,300 >> Presies. Reg op. Stella is dus heeltemal reg. 709 00:59:11,300 --> 00:59:13,720 Dit is wat die lyn so lyk. 710 00:59:13,720 --> 00:59:19,670 Ons gaan 'n lêer stroom veranderlike te kry, stoor dit in 'n lêer *, sodat alle pette, 711 00:59:19,670 --> 00:59:25,720 FILE, *, en die naam van hierdie veranderlike sal wees lêer. 712 00:59:25,720 --> 00:59:32,250 Ons kan dit noem wat ons wil. Ons kan dit noem first_file, of file_i, wat ons ook al wil. 713 00:59:32,250 --> 00:59:37,590 En dan die naam van die lêer is op die command line tot hierdie program geslaag. 714 00:59:37,590 --> 00:59:44,450 So dit is gestoor in bevat SPASIES [i] en dan gaan ons om hierdie lêer oop te maak in die lees af. 715 00:59:44,450 --> 00:59:48,100 Nou dat ons die lêer oopgemaak het, wat is die ding wat ons altyd moet onthou om te doen 716 00:59:48,100 --> 00:59:52,230 wanneer ons 'n lêer geopen het? Sluit dit. 717 00:59:52,230 --> 00:59:57,220 So Missy, hoe ons 'n lêer sluit? 718 00:59:57,220 --> 01:00:01,020 [Missy] fclose (lêer) >> fclose (lêer). Presies. 719 01:00:01,020 --> 01:00:05,340 Groot. Okay. As ons kyk na hierdie kommentaar hier doen, 720 01:00:05,340 --> 01:00:11,940 dit sê, "Open bevat SPASIES [i] en druk die inhoud na stdout." 721 01:00:11,940 --> 01:00:15,460 >> Standard out is 'n vreemde naam. Stdout is net ons manier om te sê 722 01:00:15,460 --> 01:00:22,880 ons wil om dit te druk tot die terminale, ons wil om dit te druk om die standaard produksie stroom. 723 01:00:22,880 --> 01:00:26,450 Ons kan eintlik ontslae te raak van hierdie kommentaar hier. 724 01:00:26,450 --> 01:00:36,480 Ek gaan om dit te kopieer en plak dit want dit is wat ons gedoen het. 725 01:00:36,480 --> 01:00:41,290 Op hierdie punt, nou het ons om te lees van die lêer bietjie vir bietjie by. 726 01:00:41,290 --> 01:00:46,300 Ons het 'n paar van die maniere van lees lêers bespreek. 727 01:00:46,300 --> 01:00:51,830 Watter is jou gunsteling tot dusver? 728 01:00:51,830 --> 01:00:57,960 Watter maniere het jy al gesien of onthou jy, lêers te lees? 729 01:00:57,960 --> 01:01:04,870 [Daniel] fread? >> Fread? So fread is een. Jimmy, weet jy enige ander? 730 01:01:04,870 --> 01:01:12,150 [Jimmy] No >> Goed. Nope. Charlotte? Alexander? Enige ander? Okay. 731 01:01:12,150 --> 01:01:20,740 Sodat die ander kinders is fgetc, is een wat ons sal gebruik maak van 'n baie. 732 01:01:20,740 --> 01:01:26,410 Daar is ook fscanf; julle sien 'n patroon hier? 733 01:01:26,410 --> 01:01:29,170 Hulle het almal begin met f. Om iets te doen met 'n lêer. 734 01:01:29,170 --> 01:01:35,260 Daar is fread, fgetc, fscanf. Dit is al van die lees van funksies. 735 01:01:35,260 --> 01:01:49,120 Vir die skryf van ons het fwrite, ons het in plaas van fgetc fputc. 736 01:01:49,120 --> 01:01:58,250 Ons het ook graag fprintf het ons op die quiz gesien het. 737 01:01:58,250 --> 01:02:01,680 Want dit is 'n probleem wat behels die lees van 'n lêer, 738 01:02:01,680 --> 01:02:04,940 ons gaan een van hierdie drie funksies te gebruik. 739 01:02:04,940 --> 01:02:10,890 Ons gaan nie hierdie funksies te gebruik hier neer. 740 01:02:10,890 --> 01:02:14,880 Hierdie funksies is almal in die standaard I / O biblioteek. 741 01:02:14,880 --> 01:02:17,510 So as jy kyk na die top van hierdie program, 742 01:02:17,510 --> 01:02:24,110 kan jy sien dat ons alreeds die header-lêer vir die standaard I / O biblioteek ingesluit. 743 01:02:24,110 --> 01:02:27,120 As ons wil hê om uit te vind watter een ons wil gebruik, 744 01:02:27,120 --> 01:02:29,690 ons kan altyd die man bladsye oop te maak. 745 01:02:29,690 --> 01:02:34,350 Sodat ons kan tik man Wiskunde Streek Leuven B. 746 01:02:34,350 --> 01:02:43,180 en lees alles oor die Wiskunde Streek Leuven B. inset en uitset funksies in C. 747 01:02:43,180 --> 01:02:49,870 En ons kan reeds sien oh, kyk. Dit fgetc noem, is dit waarin fputc. 748 01:02:49,870 --> 01:02:57,220 Sodat jy kan boor 'n bietjie af en kyk na, sê, fgetc 749 01:02:57,220 --> 01:03:00,060 en kyk op sy man bladsy. 750 01:03:00,060 --> 01:03:03,430 Jy kan sien dat dit gaan saam met 'n hele klomp van die ander funksies: 751 01:03:03,430 --> 01:03:12,640 fgetc, fgets, AOOS, getChar, kry, ungetc, en sy insette van karakters en stringe. 752 01:03:12,640 --> 01:03:19,180 So dit is hoe ons lees in karakters en stringe van lêers van standaard insette, 753 01:03:19,180 --> 01:03:21,990 wat is in wese van die gebruiker. 754 01:03:21,990 --> 01:03:24,780 En dit is hoe ons dit doen in die werklike C. 755 01:03:24,780 --> 01:03:30,850 Dit is dus nie die gebruik van die GetString en getChar funksies 756 01:03:30,850 --> 01:03:36,840 wat ons gebruik van die CS50 biblioteek. 757 01:03:36,840 --> 01:03:39,710 Ons gaan hierdie probleem op te doen in 'n paar van die maniere 758 01:03:39,710 --> 01:03:43,430 sodat jy kan sien twee verskillende maniere om dit te doen. 759 01:03:43,430 --> 01:03:48,490 Beide die fread funksie wat Daniël genoem en fgetc is goeie maniere om dit te doen. 760 01:03:48,490 --> 01:03:53,790 Ek dink fgetc is 'n bietjie makliker, omdat dit net, soos jy kan sien, 761 01:03:53,790 --> 01:03:59,660 een argument, die lêer * dat ons probeer om die karakter te lees, 762 01:03:59,660 --> 01:04:02,740 en sy terugkeer waarde is 'n int. 763 01:04:02,740 --> 01:04:05,610 En dit is 'n bietjie verwarrend, reg? 764 01:04:05,610 --> 01:04:11,450 >> Omdat ons om 'n karakter, so hoekom nie hierdie opgawe 'n kar? 765 01:04:11,450 --> 01:04:18,700 Julle ouens het enige idees oor hoekom dit dalk nie terugkeer nie 'n kar? 766 01:04:18,700 --> 01:04:25,510 [Missy antwoorde, onverstaanbare] >> Ja. Missy is dus heeltemal reg. 767 01:04:25,510 --> 01:04:31,570 As dit is ASCII, dan is hierdie heelgetal kan gekarteer word om 'n werklike karakter. 768 01:04:31,570 --> 01:04:33,520 Kan 'n ASCII-karakter wees, en dit is reg. 769 01:04:33,520 --> 01:04:36,220 Dit is presies wat gebeur. 770 01:04:36,220 --> 01:04:39,190 Ons is met behulp van 'n int bloot omdat dit meer stukkies. 771 01:04:39,190 --> 01:04:44,750 Dit is groter as 'n char, ons kar net bestaan ​​uit 8 bisse, dat 1 greep op ons 32-bit masjiene. 772 01:04:44,750 --> 01:04:48,520 En 'n int het al 4 bytes waarde van die ruimte. 773 01:04:48,520 --> 01:04:50,940 En dit blyk dat die manier fgetc werk, 774 01:04:50,940 --> 01:04:53,940 as ons scroll down in ons sinopsis in hierdie man 'n bietjie, 775 01:04:53,940 --> 01:05:05,000 blaai al die pad af. Dit blyk dat hulle gebruik maak van hierdie spesiale waarde genoem EOF. 776 01:05:05,000 --> 01:05:09,640 Dit is 'n spesiale konstante as die terugkeer waarde van die fgetc funksie 777 01:05:09,640 --> 01:05:14,570 wanneer jy druk op die einde van die lêer of as jy 'n fout. 778 01:05:14,570 --> 01:05:18,170 En dit blyk dat hierdie vergelykings te doen met EOF behoorlik, 779 01:05:18,170 --> 01:05:24,060 jy wil daardie ekstra bedrag van die inligting wat jy in 'n int 780 01:05:24,060 --> 01:05:28,420 in teenstelling met die gebruik van 'n char veranderlike. 781 01:05:28,420 --> 01:05:32,130 Selfs al fgetc is effektief om 'n karakter uit 'n lêer, 782 01:05:32,130 --> 01:05:38,450 jy wil om te onthou dat dit iets wat van tipe int vir julle terugkeer. 783 01:05:38,450 --> 01:05:41,360 Dit gesê, dit is redelik maklik om te gebruik. 784 01:05:41,360 --> 01:05:44,960 Dit gaan ons 'n karakter te gee, sodat al wat ons hoef te doen, is hou om die lêer te vra, 785 01:05:44,960 --> 01:05:48,440 "Gee my die volgende karakter, gee my die volgende karakter, gee my die volgende karakter," 786 01:05:48,440 --> 01:05:51,400 totdat ons aan die einde van die lêer. 787 01:05:51,400 --> 01:05:54,730 En dit sal trek in een karakter op 'n tyd uit ons lêer, 788 01:05:54,730 --> 01:05:56,250 en dan sal ons kan doen wat ons wil met dit. 789 01:05:56,250 --> 01:06:00,160 Ons kan dit stoor, kan ons voeg dit na 'n string, kan ons druk dit uit. 790 01:06:00,160 --> 01:06:04,630 Het enige van daardie. 791 01:06:04,630 --> 01:06:09,600 >> Inzoomen terug en terug te gaan na ons cat.c program, 792 01:06:09,600 --> 01:06:16,170 as ons gaan te gebruik fgetc, 793 01:06:16,170 --> 01:06:21,710 hoe kan ons nader aan die volgende lyn van die kode? 794 01:06:21,710 --> 01:06:26,020 Ons gaan om te gebruik - fread sal iets anders doen. 795 01:06:26,020 --> 01:06:32,600 En hierdie keer, ons net gaan fgetc te gebruik om een ​​karakter te kry op 'n tyd. 796 01:06:32,600 --> 01:06:40,910 'N hele lêer te verwerk, kan dit wat ons het om te doen? 797 01:06:40,910 --> 01:06:44,030 Hoeveel karakters is daar in 'n lêer? 798 01:06:44,030 --> 01:06:47,390 Daar is 'n baie. So het jy waarskynlik wil om een ​​te kry 799 01:06:47,390 --> 01:06:49,860 en dan kry 'n ander en kry 'n ander en kry 'n ander. 800 01:06:49,860 --> 01:06:53,330 Watter soort van die algoritme dink jy ons kan hê om hier te gebruik? 801 01:06:53,330 --> 01:06:55,470 Watter tipe? [Alexander] A vir lus? >> Presies. 802 01:06:55,470 --> 01:06:57,500 'N soort van loop. 803 01:06:57,500 --> 01:07:03,380 'N lus is eintlik groot, in hierdie geval. 804 01:07:03,380 --> 01:07:08,620 En soos jy sê, dit klink asof jy wil 'n lus oor die hele lêer, 805 01:07:08,620 --> 01:07:11,820 om 'n karakter op 'n tyd. 806 01:07:11,820 --> 01:07:13,850 Enige voorstelle oor wat dit kan lyk? 807 01:07:13,850 --> 01:07:22,090 [Alexander, onverstaanbaar] 808 01:07:22,090 --> 01:07:30,050 >> Goed, vertel my net in Engels wat jy probeer om te doen? [Alexander, onverstaanbaar] 809 01:07:30,050 --> 01:07:36,270 Dus, in hierdie geval, dit klink asof ons net probeer om te loop oor die hele lêer. 810 01:07:36,270 --> 01:07:45,330 [Alexander] So i > Die grootte van? 811 01:07:45,330 --> 01:07:49,290 Ek dink dat die grootte van die lêer, reg? Die grootte - sal ons net skryf dit soos hierdie. 812 01:07:49,290 --> 01:07:57,470 Grootte van die lêer wat vir die oomblik, i + +. 813 01:07:57,470 --> 01:08:04,610 So dit blyk dat die manier waarop jy dit doen met fgetc, en dit is 'n nuwe, 814 01:08:04,610 --> 01:08:10,460 is dat daar is geen maklike manier om net die grootte van 'n lêer 815 01:08:10,460 --> 01:08:16,979 met hierdie "sizeof" tipe konstrueer wat jy nog nooit gesien. 816 01:08:16,979 --> 01:08:20,910 Wanneer gebruik ons ​​dat fgetc funksie, is ons die invoering van 'n soort van 817 01:08:20,910 --> 01:08:29,069 nuwe, funky sintaksis te lus, waar in plaas van die gebruik van net 'n basiese counter 818 01:08:29,069 --> 01:08:33,920 karakter deur karakter om te gaan, gaan ons een karakter op 'n tyd om te trek, 819 01:08:33,920 --> 01:08:37,120 een karakter op 'n tyd, en die manier waarop ons weet ons is aan die einde 820 01:08:37,120 --> 01:08:41,290 is nie wanneer het ons getel word om 'n sekere aantal van karakters, 821 01:08:41,290 --> 01:08:49,939 maar wanneer die karakter wat ons trek uit daardie spesiale einde van die lêer karakter. 822 01:08:49,939 --> 01:08:58,689 Sodat ons kan dit doen deur - ek noem dit ch, en ons gaan om dit te inisialiseer 823 01:08:58,689 --> 01:09:08,050 met ons eerste oproep om die eerste karakter te kry uit van die lêer. 824 01:09:08,050 --> 01:09:14,979 So hierdie gedeelte reg hier, dit gaan om 'n karakter te kry uit van die lêer 825 01:09:14,979 --> 01:09:20,840 en stoor dit in die veranderlike ch. 826 01:09:20,840 --> 01:09:25,420 Ons gaan om te hou om dit te doen totdat ons aan die einde van die lêer, 827 01:09:25,420 --> 01:09:41,170 wat ons doen deur te toets vir die karakter wat nie gelyk is aan daardie spesiale EOF karakter. 828 01:09:41,170 --> 01:09:48,750 En dan in plaas van doen ch + +, wil net wat inkrementeer die waarde, 829 01:09:48,750 --> 01:09:52,710 so as ons lees 'n A-out van die lêer, 'n hoofletter A, sê, 830 01:09:52,710 --> 01:09:56,810 ch + + sou gee ons b, en dan ons wil kry c en dan d. 831 01:09:56,810 --> 01:09:59,310 Dit is duidelik nie wat ons wil hê. Wat wil ons hier 832 01:09:59,310 --> 01:10:05,830 in hierdie laaste bietjie wil ons die volgende karakter te kry uit die lêer. 833 01:10:05,830 --> 01:10:09,500 >> So, hoe kan ons die volgende karakter van die lêer? 834 01:10:09,500 --> 01:10:13,470 Hoe kry ons die eerste karakter van die lêer? 835 01:10:13,470 --> 01:10:17,200 [Studente] fgetfile? >> Fgetc, of, jammer, jy is heeltemal reg. 836 01:10:17,200 --> 01:10:20,470 Ek verkeerd gespel dit reg daar. So ja. 837 01:10:20,470 --> 01:10:26,240 Hier in plaas van doen ch + +, 838 01:10:26,240 --> 01:10:29,560 ons net gaan fgetc (lêer) weer te noem 839 01:10:29,560 --> 01:10:39,180 en stoor die resultaat in ons dieselfde ch veranderlike. 840 01:10:39,180 --> 01:10:43,730 [Student vraag, onverstaanbaar] 841 01:10:43,730 --> 01:10:52,390 >> Dit is waar hierdie FILE * ouens is spesiaal. 842 01:10:52,390 --> 01:10:59,070 Die manier waarop hulle werk is hulle - wanneer jy die eerste keer oopmaak wanneer jy die eerste keer dat die fopen oproep maak, 843 01:10:59,070 --> 01:11:04,260 Die lêer * dien effektief as 'n wyser na die begin van die lêer. 844 01:11:04,260 --> 01:11:12,830 En dan elke keer as jy bel fgetc, is dit een karakter beweeg deur middel van die lêer. 845 01:11:12,830 --> 01:11:23,280 So wanneer jy noem dit, jy die verhoog van die lêer wyser deur een karakter. 846 01:11:23,280 --> 01:11:26,210 En wanneer jy weer fgetc, jy beweeg dit 'n ander karakter 847 01:11:26,210 --> 01:11:28,910 en 'n ander karakter en 'n ander karakter en 'n ander karakter. 848 01:11:28,910 --> 01:11:32,030 [Student vraag, onverstaanbaar] >> En that's - ja. 849 01:11:32,030 --> 01:11:34,810 Dit is soort van hierdie magie onder die kap. 850 01:11:34,810 --> 01:11:37,930 Jy hou net verhoog van deur. 851 01:11:37,930 --> 01:11:46,510 Op hierdie punt, is jy in staat om werklik te werk met 'n karakter. 852 01:11:46,510 --> 01:11:52,150 So, hoe kan ons print dit uit op die skerm, wat nou? 853 01:11:52,150 --> 01:11:58,340 Ons kan gebruik maak van die dieselfde printf ding wat ons gebruik voor. 854 01:11:58,340 --> 01:12:00,330 Wat ons het is die gebruik van al die semester. 855 01:12:00,330 --> 01:12:05,450 Ons kan printf noem, 856 01:12:05,450 --> 01:12:21,300 en ons kan net soos wat in die karakter. 857 01:12:21,300 --> 01:12:27,430 Nog 'n manier om dit te doen is eerder as die gebruik van printf en met hierdie formaat string te doen, 858 01:12:27,430 --> 01:12:29,490 Ons kan ook gebruik maak van een van die ander funksies. 859 01:12:29,490 --> 01:12:40,090 Ons kan gebruik fputc, wat 'n karakter op die skerm druk, 860 01:12:40,090 --> 01:12:52,580 behalwe as ons kyk by fputc - laat my 'n bietjie uit te zoem. 861 01:12:52,580 --> 01:12:56,430 Ons sien wat mooi is, is wat dit neem om in die karakter wat ons lees met behulp van fgetc, 862 01:12:56,430 --> 01:13:05,100 maar dan moet ons om te gee dit 'n stroom te druk. 863 01:13:05,100 --> 01:13:11,850 Ons kan ook gebruik maak van die putchar funksie, wat direk aan die standaard uit. 864 01:13:11,850 --> 01:13:16,070 So daar is 'n hele klomp van die verskillende opsies wat ons kan gebruik vir die druk. 865 01:13:16,070 --> 01:13:19,580 Hulle is almal in die standaard I / O-biblioteek. 866 01:13:19,580 --> 01:13:25,150 Wanneer jy wil uit te druk - so printf, by verstek, sal die spesiale standaard uit stroom druk, 867 01:13:25,150 --> 01:13:27,910 wat is dat stdout. 868 01:13:27,910 --> 01:13:41,300 Sodat ons kan net verwys na dit as soort van hierdie magic waarde, stdout hier. 869 01:13:41,300 --> 01:13:48,410 Oeps. Sit die kommapunt buite. 870 01:13:48,410 --> 01:13:52,790 >> Dit is 'n baie nuwe, funky inligting hier. 871 01:13:52,790 --> 01:13:58,600 Baie van hierdie is baie idiomatiese, in die sin dat dit is die kode 872 01:13:58,600 --> 01:14:05,700 wat geskryf is op hierdie manier net omdat dit skoon te lees, maklik om te lees. 873 01:14:05,700 --> 01:14:11,520 Daar is baie verskillende maniere om dit te doen, baie verskillende funksies wat jy kan gebruik, 874 01:14:11,520 --> 01:14:14,680 maar ons is geneig om net dieselfde patrone volg oor en oor. 875 01:14:14,680 --> 01:14:20,180 So moenie verbaas wees as jy sien kode soos hierdie kom weer en weer. 876 01:14:20,180 --> 01:14:25,690 Alles reg. Op hierdie punt, ons nodig het om te breek vir die dag. 877 01:14:25,690 --> 01:14:31,300 Dankie vir die komende. Dankie vir jou kyk as jy aanlyn is. En ons sal jou volgende week sien. 878 01:14:31,300 --> 01:14:33,890 [CS50.TV]