1 00:00:00,000 --> 00:00:02,730 [Powered by Google Translate] [DEEL 5: minder comfortabel] 2 00:00:02,730 --> 00:00:05,180 [Nate Hardison, Harvard University] 3 00:00:05,180 --> 00:00:08,260 [Dit is CS50.] [CS50.TV] 4 00:00:08,260 --> 00:00:11,690 Dus welkom terug, jongens. 5 00:00:11,690 --> 00:00:16,320 Welkom bij hoofdstuk 5. 6 00:00:16,320 --> 00:00:20,220 Op dit punt, hebben voltooid quiz 0 en hebben gezien hoe je dat gedaan hebt, 7 00:00:20,220 --> 00:00:25,770 hopelijk voel je echt goed, want ik was erg onder de indruk van de scores in deze sectie. 8 00:00:25,770 --> 00:00:28,050 Voor onze online kijkers, we hebben een paar vragen 9 00:00:28,050 --> 00:00:33,680 over de laatste twee problemen op het probleem set - of op de quiz, in plaats van. 10 00:00:33,680 --> 00:00:39,690 Dus we gaan om te gaan over die heel snel, zodat iedereen ziet wat er gebeurd is 11 00:00:39,690 --> 00:00:45,060 en hoe om te gaan door de werkelijke oplossing in plaats van alleen die de oplossing zelf. 12 00:00:45,060 --> 00:00:50,330 We gaan gaan over de laatste paar problemen heel snel, 32 en 33. 13 00:00:50,330 --> 00:00:53,240 Gewoon, weer, zodat dat de online kijkers zien. 14 00:00:53,240 --> 00:00:59,080 >> Als u om uw probleem op 32, dat op pagina 13, 15 00:00:59,080 --> 00:01:02,730 13 van de 16, probleem 32 is alles over swaps. 16 00:01:02,730 --> 00:01:05,010 Het was allemaal om te ruilen twee gehele getallen. 17 00:01:05,010 --> 00:01:08,740 Het is het probleem dat we gegaan over een paar keer in college. 18 00:01:08,740 --> 00:01:13,590 En hier, wat we vroegen u om te doen is een snelle herinnering spoor. 19 00:01:13,590 --> 00:01:17,000 Het invullen van de waarden van de variabelen zoals ze op de stapel 20 00:01:17,000 --> 00:01:20,250 als de code gaat door deze swap functie. 21 00:01:20,250 --> 00:01:24,500 In het bijzonder, wat we zoeken bij - Ik ga naar deze iPad neer te zetten - 22 00:01:24,500 --> 00:01:29,650 in het bijzonder, wat we zoeken naar is deze lijn genummerd hier 6 rechts. 23 00:01:29,650 --> 00:01:36,740 En het is genummerd 6 voor slechts contiguïteit met het vorige probleem. 24 00:01:36,740 --> 00:01:41,720 Wat wij willen doen is weer te geven of het etiket van de toestand van het geheugen 25 00:01:41,720 --> 00:01:46,090 omdat het op het moment dat we voeren deze lijn nummer 6, 26 00:01:46,090 --> 00:01:52,540 dat is in feite een terugkeer van onze swap functie hier. 27 00:01:52,540 --> 00:01:59,450 Als we naar beneden scrollen hier, zagen we dat de adressen van alles in het geheugen was beschikbaar voor ons. 28 00:01:59,450 --> 00:02:02,540 Dit is erg belangrijk, we komen terug om het in slechts een moment. 29 00:02:02,540 --> 00:02:09,240 En dan hier beneden op de bodem, we hadden een klein geheugen diagram dat we gaan om te verwijzen naar. 30 00:02:09,240 --> 00:02:12,490 Ik heb eigenlijk dit gedaan op mijn iPad. 31 00:02:12,490 --> 00:02:20,720 Dus ik ga heen en weer schakelen tussen de iPad en deze code alleen voor referentie. 32 00:02:20,720 --> 00:02:26,540 >> Laten we beginnen. Ten eerste, laten we focussen op de eerste paar regels van de belangrijkste hier. 33 00:02:26,540 --> 00:02:30,220 Om te beginnen, we gaan naar x te initialiseren op 1 en y 2. 34 00:02:30,220 --> 00:02:33,040 We hebben dus twee integer variabelen, ze beiden zullen worden geplaatst op de stapel. 35 00:02:33,040 --> 00:02:36,050 We gaan een 1 en een 2 in hen. 36 00:02:36,050 --> 00:02:43,150 Dus als ik meer dan flip naar mijn iPad, hopelijk, laten we eens kijken - 37 00:02:43,150 --> 00:02:48,660 Apple TV mirroring, en daar gaan we. Oke. 38 00:02:48,660 --> 00:02:51,670 Dus als ik meer dan flip op mijn iPad, 39 00:02:51,670 --> 00:02:56,220 Ik wil x initialiseren op 1 en y 2. 40 00:02:56,220 --> 00:03:00,580 Dat doen we gewoon door het schrijven van een 1 in het vak x 41 00:03:00,580 --> 00:03:07,730 en een 2 in het vak y. Vrij eenvoudig. 42 00:03:07,730 --> 00:03:11,620 Dus laten we nu terug gaan naar de laptop, zien wat er gebeurt. 43 00:03:11,620 --> 00:03:15,810 Dus dit volgende regel wordt het pas echt lastig. 44 00:03:15,810 --> 00:03:28,110 We passeren het adres van x en het adres van y als de parameters a en b om de swap-functie. 45 00:03:28,110 --> 00:03:32,380 Het adres van x en het adres van y zijn dingen die we niet kunnen berekenen 46 00:03:32,380 --> 00:03:36,360 zonder te verwijzen naar deze bullet points recht naar beneden hier. 47 00:03:36,360 --> 00:03:39,750 En gelukkig, de eerste twee bullet points ons precies vertellen wat de antwoorden zijn. 48 00:03:39,750 --> 00:03:44,740 Het adres van x in geheugen 10, en het adres van y in geheugen 14. 49 00:03:44,740 --> 00:03:51,870 Dus dat zijn de waarden die krijgen in doorgegeven als a en b tot boven in onze swap functie. 50 00:03:51,870 --> 00:04:00,760 Dus nogmaals, terugschakelen naar ons diagram, kan ik schrijf een 10 in een 51 00:04:00,760 --> 00:04:07,400 en 14 in b. 52 00:04:07,400 --> 00:04:11,610 Nu, dit is het punt waar we verder gaan met de swap. 53 00:04:11,610 --> 00:04:14,520 Dus flipping terug naar de laptop weer, 54 00:04:14,520 --> 00:04:21,079 zien we dat de manier waarop de swap werkt is ik voor het eerst dereference een en sla het resultaat op in tmp. 55 00:04:21,079 --> 00:04:27,650 Dus de dereference operator zegt: "He. Behandel de inhoud van variabele a als een adres. 56 00:04:27,650 --> 00:04:33,830 Ga naar wat er opgeslagen is op dat adres, en laad het. " 57 00:04:33,830 --> 00:04:41,720 Wat je uit te laden van de variabele zal worden opgeslagen in onze tmp variabele. 58 00:04:41,720 --> 00:04:45,150 Flipping terug naar de iPad. 59 00:04:45,150 --> 00:04:51,690 Als we naar 10 te pakken, weten we dat adres 10 is de varible x 60 00:04:51,690 --> 00:04:55,480 want we werden verteld door onze opsommingsteken dat het adres van x in het geheugen is 10. 61 00:04:55,480 --> 00:05:00,180 Dus we kunnen er naartoe te gaan, krijgen de waarde ervan, dat is 1, zoals we zien op onze iPad, 62 00:05:00,180 --> 00:05:06,300 en laden die in tmp. 63 00:05:06,300 --> 00:05:08,250 Ook dit is niet de uiteindelijke inhoud. 64 00:05:08,250 --> 00:05:14,350 We gaan wandelen door en wij zullen onze uiteindelijke toestand van het programma te krijgen aan het eind. 65 00:05:14,350 --> 00:05:17,210 Maar op dit moment hebben we de waarde 1 opgeslagen in tmp. 66 00:05:17,210 --> 00:05:19,210 >> En er is een snelle vraag hier. 67 00:05:19,210 --> 00:05:23,980 [Alexander] Is de dereference operator - dat is gewoon de ster vlak voor de variabele? 68 00:05:23,980 --> 00:05:27,600 >> Ja. Dus de dereference operator, zoals we back flip naar onze laptop weer, 69 00:05:27,600 --> 00:05:33,780 is deze ster recht tegenover. 70 00:05:33,780 --> 00:05:37,460 In die zin is het - je het contrasteren met de operator voor vermenigvuldigen 71 00:05:37,460 --> 00:05:42,400 die vereist dat twee dingen: de dereference operator is een unaire operator. 72 00:05:42,400 --> 00:05:46,130 Slechts toegepast op een waarde in plaats van een binaire operator, 73 00:05:46,130 --> 00:05:48,810 waar van toepassing op twee verschillende waarden. 74 00:05:48,810 --> 00:05:52,080 Dus dat is wat er gebeurt in deze lijn. 75 00:05:52,080 --> 00:05:58,390 We geladen de waarde 1 en opgeslagen in onze tijdelijke integer variabele. 76 00:05:58,390 --> 00:06:05,800 De volgende regel, slaan we de inhoud van B in - 77 00:06:05,800 --> 00:06:12,630 of beter gezegd, slaan we de inhoud die b wijst om in de plaats waar een wijst naar. 78 00:06:12,630 --> 00:06:17,690 Als we analyseren deze van rechts naar links, gaan we dereference b, 79 00:06:17,690 --> 00:06:23,580 gaan we tot en met 14 aan te pakken, gaan we het gehele getal dat er te grijpen, 80 00:06:23,580 --> 00:06:26,900 en dan gaan we naar het adres 10, 81 00:06:26,900 --> 00:06:34,240 en we gaan het resultaat van onze dereference van b te gooien in die ruimte. 82 00:06:34,240 --> 00:06:40,080 Flipping terug naar onze iPad, waar kunnen we dit een beetje meer concreet, 83 00:06:40,080 --> 00:06:44,070 het zou helpen als ik hier schrijf nummers op alle adressen. 84 00:06:44,070 --> 00:06:53,820 Dus we weten dat op y, we zijn op het adres 14, x is op het adres 10. 85 00:06:53,820 --> 00:07:00,180 Als we beginnen bij b, we dereference b, gaan we de waarde 2 te grijpen. 86 00:07:00,180 --> 00:07:08,320 We gaan deze waarde te grijpen, want dat is de waarde die woont op het adres 14. 87 00:07:08,320 --> 00:07:15,700 En we gaan om het in de variabele die woont op het adres 10, 88 00:07:15,700 --> 00:07:19,160 die is daar, overeenkomend met onze variabele x. 89 00:07:19,160 --> 00:07:21,810 Dus we kunnen doen een beetje overschrijven hier 90 00:07:21,810 --> 00:07:35,380 waar we ons bevrijden van onze 1 en in plaats daarvan schrijven we een 2. 91 00:07:35,380 --> 00:07:39,560 Dus is alles goed en wel in de wereld, ook al hebben we overschreven x nu heb. 92 00:07:39,560 --> 00:07:44,890 Wij hebben opgeslagen oude waarde x in onze tmp variabele. 93 00:07:44,890 --> 00:07:50,210 Dus we kunnen voltooien de swap met de volgende regel. 94 00:07:50,210 --> 00:07:53,030 Flipping terug naar onze laptop. 95 00:07:53,030 --> 00:07:58,150 Nu alles wat overblijft is om de inhoud te nemen uit onze tijdelijke integer variabele 96 00:07:58,150 --> 00:08:05,630 en bewaar ze in de variabele die woont op het adres dat b houdt. 97 00:08:05,630 --> 00:08:10,230 Dus we gaan om effectief dereference b om toegang te krijgen tot de variabele 98 00:08:10,230 --> 00:08:14,340 dat op het adres dat b houdt in, 99 00:08:14,340 --> 00:08:19,190 en we gaan naar de waarde die tmp houdt in dat spul. 100 00:08:19,190 --> 00:08:23,280 Flipping terug naar de iPad eens te meer. 101 00:08:23,280 --> 00:08:31,290 Ik kan wissen deze waarde hier, 2, 102 00:08:31,290 --> 00:08:41,010 en in plaats daarvan zullen we kopiëren de 1 erin. 103 00:08:41,010 --> 00:08:43,059 Dan is de volgende regel die wordt uitgevoerd, natuurlijk - 104 00:08:43,059 --> 00:08:47,150 Als we terug bladeren naar de laptop - is dit punt 6, 105 00:08:47,150 --> 00:08:52,500 dat is het punt waarop we wilden ons diagram volledig ingevuld. 106 00:08:52,500 --> 00:08:58,940 Dus flipping terug naar de iPad nog een keer, zodat je kunt zien dat de ingevulde diagram, 107 00:08:58,940 --> 00:09:06,610 kun je zien dat we een 10 in een, een 14 in b, een 1 op tmp, een 2 in x, en een 1 in y hebben. 108 00:09:06,610 --> 00:09:11,000 Zijn er nog vragen over? 109 00:09:11,000 --> 00:09:14,640 Betekent dit meer zin, die liep door het? 110 00:09:14,640 --> 00:09:24,850 Maken minder zin? Hopelijk niet. Oke. 111 00:09:24,850 --> 00:09:28,230 >> Pointers zijn een zeer lastig onderwerp. 112 00:09:28,230 --> 00:09:33,420 Een van de jongens werken we met een veel voorkomende gezegde: 113 00:09:33,420 --> 00:09:36,590 "Om pointers begrijpen, moet je eerst begrijpen pointers." 114 00:09:36,590 --> 00:09:40,530 Waarvan ik denk dat is zeer waar. Het vergt wel een tijdje om te wennen. 115 00:09:40,530 --> 00:09:45,360 Tekening veel foto's, zijn loting van het geheugen diagrammen zoals deze zeer behulpzaam, 116 00:09:45,360 --> 00:09:49,480 en na je wandeling door voorbeeld na voorbeeld na voorbeeld, 117 00:09:49,480 --> 00:09:54,450 het zal beginnen om een ​​beetje meer verstand en een beetje meer verstand en een beetje meer zin te maken. 118 00:09:54,450 --> 00:10:01,560 Tot slot, op een dag, dan heb je het al helemaal onder de knie. 119 00:10:01,560 --> 00:10:13,800 Hebt u vragen voordat we verder gaan naar het volgende probleem? Oke. 120 00:10:13,800 --> 00:10:18,840 Dus back flip naar de laptop. 121 00:10:18,840 --> 00:10:23,300 Het volgende probleem dat we hebben is probleem nummer 33 op file I / O. 122 00:10:23,300 --> 00:10:26,350 Zoom in op deze een beetje. 123 00:10:26,350 --> 00:10:28,710 Probleem 33 - Ja? 124 00:10:28,710 --> 00:10:32,110 >> [Daniel] Ik had net een snelle vraag. Deze ster, of het sterretje, 125 00:10:32,110 --> 00:10:35,590 het heet dereferentie wanneer u een sterretje voor. 126 00:10:35,590 --> 00:10:38,820 Hoe heet het als je de ampersand voor? 127 00:10:38,820 --> 00:10:43,140 >> De ampersand is voor de adres-van operator. 128 00:10:43,140 --> 00:10:45,880 Dus laten we naar boven terug. 129 00:10:45,880 --> 00:10:49,310 Oeps. Ik ben in de zoommodus, dus ik kan niet echt scroll. 130 00:10:49,310 --> 00:10:52,780 Als we kijken naar deze code heel snel hier, 131 00:10:52,780 --> 00:10:54,980 weer hetzelfde gebeuren. 132 00:10:54,980 --> 00:10:59,180 Als we kijken naar deze code hier, op deze lijn waar we de oproep om te ruilen, 133 00:10:59,180 --> 00:11:10,460 het en-teken is alleen maar te zeggen "get het adres waar de variabele x leven." 134 00:11:10,460 --> 00:11:14,460 Wanneer uw compiler compileren van de code, 135 00:11:14,460 --> 00:11:20,590 het moet fysiek markeren een plaats in het geheugen voor al uw variabelen te leven. 136 00:11:20,590 --> 00:11:24,910 En de compiler dus wat kan dan doen als het eenmaal is samengesteld alles, 137 00:11:24,910 --> 00:11:31,110 het weet, "Oh, ik x zet op het adres 10. Ik zet y op het adres 14." 138 00:11:31,110 --> 00:11:34,640 Het kan dan invullen van deze waarden voor u. 139 00:11:34,640 --> 00:11:44,740 Dus je kan dan - het kan dan gaan deze in en pas & y in ook. 140 00:11:44,740 --> 00:11:50,730 Deze jongens krijgen het adres, maar ook, wanneer je langs ze in de swap-functie, 141 00:11:50,730 --> 00:11:55,690 dit soort informatie, dit int * hier, vertelt de compiler, 142 00:11:55,690 --> 00:12:01,350 "Oke, we gaan te interpreteren dit adres als een adres van een integer variabele." 143 00:12:01,350 --> 00:12:05,900 Als adres van een int, die verschilt van het adres van een variabelenamen 144 00:12:05,900 --> 00:12:09,930 omdat een int neemt, op een 32-bits machine, neemt 4 bytes ruimte, 145 00:12:09,930 --> 00:12:13,310 terwijl een karakter neemt slechts 1 byte van de ruimte. 146 00:12:13,310 --> 00:12:17,310 Dus het is belangrijk om te weten ook wat er - wat er leeft, wat voor soort waarde 147 00:12:17,310 --> 00:12:20,340 woont op het adres dat werd doorgegeven inch 148 00:12:20,340 --> 00:12:22,020 Of het adres dat u te maken hebt. 149 00:12:22,020 --> 00:12:29,020 Op die manier weet je hoeveel bytes aan informatie om daadwerkelijk uit te laden van uw RAM-geheugen. 150 00:12:29,020 --> 00:12:31,780 En dan, ja, werden deze dereference operator, zoals u vraagt, 151 00:12:31,780 --> 00:12:37,200 gaat en toegang informatie op een bepaald adres. 152 00:12:37,200 --> 00:12:42,820 Dus staat hier deze variabele de inhoud van een behandeling als een adres, 153 00:12:42,820 --> 00:12:47,880 ga naar dat adres, en trek, te laden in de processor, lading in een register 154 00:12:47,880 --> 00:12:56,340 de werkelijke waarden of de inhoud die leven op dat adres. 155 00:12:56,340 --> 00:12:59,620 Nog meer vragen? Dit zijn goede vragen. 156 00:12:59,620 --> 00:13:01,650 Het is een hoop nieuwe terminologie ook. 157 00:13:01,650 --> 00:13:09,800 Het is ook een soort van funky, zien & en * op verschillende plaatsen. 158 00:13:09,800 --> 00:13:13,180 >> Oke. 159 00:13:13,180 --> 00:13:18,530 Dus terug naar probleem 33, file I / O. 160 00:13:18,530 --> 00:13:22,540 Dit was een van die problemen die ik denk dat een paar dingen gebeurd. 161 00:13:22,540 --> 00:13:25,400 Een, het is een vrij nieuw onderwerp. 162 00:13:25,400 --> 00:13:30,590 Het werd al snel voorgelegd aan de quiz, 163 00:13:30,590 --> 00:13:33,400 en dan denk ik het was een beetje als een van die woord problemen in de wiskunde 164 00:13:33,400 --> 00:13:39,720 waar ze geven je veel informatie, maar je eigenlijk niet eindigen met een ton van het te gebruiken. 165 00:13:39,720 --> 00:13:44,060 Het eerste deel van dit probleem is het beschrijven van wat een CSV-bestand is. 166 00:13:44,060 --> 00:13:50,620 Nu, een CSV-bestand, volgens de beschrijving, is een door komma's gescheiden waarden bestand. 167 00:13:50,620 --> 00:13:55,300 De reden dat deze zijn te allen interessant, en de reden waarom je ooit gebruiken, 168 00:13:55,300 --> 00:14:00,800 is, omdat, hoeveel van jullie ooit gebruikte spullen zoals Excel? 169 00:14:00,800 --> 00:14:03,240 Figuur meeste van jullie hebben, waarschijnlijk, of zullen gebruiken, op een bepaald punt in je leven. 170 00:14:03,240 --> 00:14:06,430 U gebruikt iets als Excel. 171 00:14:06,430 --> 00:14:10,940 Om de gegevens op te halen uit een Excel-spreadsheet of doe een soort van verwerking met het, 172 00:14:10,940 --> 00:14:17,240 als je wilde een C-programma of Python programma, Java-programma te schrijven, 173 00:14:17,240 --> 00:14:20,070 om te gaan met de gegevens die u hebt opgeslagen in daar, 174 00:14:20,070 --> 00:14:23,170 een van de meest voorkomende manieren om hem eruit te halen is in een CSV-bestand. 175 00:14:23,170 --> 00:14:26,850 En u kunt openen in Excel en als je naar de 'Opslaan als' dialoog, 176 00:14:26,850 --> 00:14:32,840 je kunt krijgen uit een echte CSV-bestand. 177 00:14:32,840 --> 00:14:35,890 >> Handig om te weten hoe om te gaan met deze dingen. 178 00:14:35,890 --> 00:14:42,010 De manier waarop het werkt is dat het lijkt op een - ik bedoel, het is in wezen het nabootsen van een spreadsheet, 179 00:14:42,010 --> 00:14:47,590 waar, zoals we hier zien, in het meest linkse stuk, 180 00:14:47,590 --> 00:14:49,910 hebben we alle laatste namen. 181 00:14:49,910 --> 00:14:54,670 Dus we hebben Malan, vervolgens Hardison, en dan Bowden, MacWilliam en Chan. 182 00:14:54,670 --> 00:14:59,470 Alle achternaam. En dan een komma scheidt de laatste namen van de eerste namen. 183 00:14:59,470 --> 00:15:02,970 David, Nate, Rob, Tommy, en Zamyla. 184 00:15:02,970 --> 00:15:06,850 Ik heb altijd mengen Robby en Tom. 185 00:15:06,850 --> 00:15:10,940 En dan, tot slot, de derde kolom is de e-mailadressen. 186 00:15:10,940 --> 00:15:18,500 Als je eenmaal begrijpt dat de rest van het programma is vrij eenvoudig te implementeren. 187 00:15:18,500 --> 00:15:23,850 Wat we hebben gedaan om deze dezelfde structuur na te bootsen in onze C-programma 188 00:15:23,850 --> 00:15:27,510 wordt hebben we gebruik gemaakt van een structuur. 189 00:15:27,510 --> 00:15:30,520 We beginnen te spelen met deze een beetje meer ook. 190 00:15:30,520 --> 00:15:35,790 We zagen ze voor het eerst iets in probleem set 3, toen we te maken hadden met de woordenboeken. 191 00:15:35,790 --> 00:15:40,290 Maar dit personeel struct slaat een achternaam, een voornaam en een e-mail. 192 00:15:40,290 --> 00:15:44,500 Net als onze CSV-bestand is op te slaan. 193 00:15:44,500 --> 00:15:47,950 Dus dit is gewoon omzetten van het ene formaat naar het andere. 194 00:15:47,950 --> 00:15:54,630 We moeten, omzetten in dit geval een personeelslid struct in een lijn, 195 00:15:54,630 --> 00:15:59,060 een door komma's gescheiden lijn, net als dat. 196 00:15:59,060 --> 00:16:01,500 Is dat logisch? Jullie hebben alle genomen quiz, 197 00:16:01,500 --> 00:16:07,680 dus ik me voorstellen dat je op zijn minst even de tijd om na te denken over deze had. 198 00:16:07,680 --> 00:16:16,410 >> In de huur-functie, het probleem vraagt ​​ons om te genieten van - we zullen inzoomen op deze een beetje - 199 00:16:16,410 --> 00:16:22,480 te nemen aan een staf structuur, een staf struct, met naam s, 200 00:16:22,480 --> 00:16:30,900 en voeg de inhoud van onze staff.csv bestand. 201 00:16:30,900 --> 00:16:34,230 Het blijkt dat dit vrij eenvoudig te gebruiken. 202 00:16:34,230 --> 00:16:37,430 We soort van spelen met deze functies een beetje meer vandaag. 203 00:16:37,430 --> 00:16:44,510 Maar in dit geval, de fprintf functie echt de sleutel. 204 00:16:44,510 --> 00:16:51,960 Dus met fprintf, kunnen we afdrukken, net zoals jullie zijn printf dit hele term gebruikt. 205 00:16:51,960 --> 00:16:55,050 U kunt printf een lijn naar een bestand. 206 00:16:55,050 --> 00:16:59,030 Dus in plaats van alleen het maken van de gebruikelijke printf aan te roepen waar je het de format string 207 00:16:59,030 --> 00:17:05,380 en dan het vervangen van alle variabelen met de volgende argumenten, 208 00:17:05,380 --> 00:17:11,290 met fprintf, je allereerste argument is in plaats daarvan het bestand dat u wilt schrijven. 209 00:17:11,290 --> 00:17:21,170 Als we op dit kijken in het apparaat, bijvoorbeeld, man fprintf, 210 00:17:21,170 --> 00:17:25,980 kunnen we het verschil zien tussen printf en fprintf. 211 00:17:25,980 --> 00:17:28,960 Ik zal inzoomen hier een beetje. 212 00:17:28,960 --> 00:17:33,140 Dus met printf, we geven het een format string, en dan de volgende argumenten 213 00:17:33,140 --> 00:17:37,580 zijn alle variabelen voor vervanging of substitutie in ons format string. 214 00:17:37,580 --> 00:17:47,310 Overwegende dat het met fprintf, het eerste argument is inderdaad dit bestand * heet een stroom. 215 00:17:47,310 --> 00:17:51,800 >> Moving terug naar hier om onze huur, 216 00:17:51,800 --> 00:17:54,550 We hebben al onze bestanden * stroom voor ons geopend. 217 00:17:54,550 --> 00:17:57,810 Dat is wat deze eerste regel doet, het opent de staff.csv bestand, 218 00:17:57,810 --> 00:18:01,690 het opent het in append mode, en alles wat over is voor ons om te doen is 219 00:18:01,690 --> 00:18:08,640 schrijf de personele organisatie aan het bestand. 220 00:18:08,640 --> 00:18:10,870 En, laten we eens kijken, wil ik de iPad gebruiken? 221 00:18:10,870 --> 00:18:17,900 Ik zal gebruik maken van de iPad. We hebben leegte - laten we dit op tafel te zetten, dus ik kan een beetje beter schrijven - 222 00:18:17,900 --> 00:18:33,680 vervallen huur en het duurt in een argument, een staf structuur genaamd s. 223 00:18:33,680 --> 00:18:44,120 Heb je onze bretels, hebben we ons bestand * de naam bestand, 224 00:18:44,120 --> 00:18:48,380 we hebben onze fopen lijn aan ons gegeven, 225 00:18:48,380 --> 00:18:51,890 en Ik zal gewoon schrijf het uit als puntjes omdat het al in de pedia. 226 00:18:51,890 --> 00:19:00,530 En dan op onze volgende regel, we gaan om te bellen naar fprintf 227 00:19:00,530 --> 00:19:03,700 en we gaan door te geven in het bestand dat we willen afdrukken, 228 00:19:03,700 --> 00:19:10,290 en dan onze format string, die - 229 00:19:10,290 --> 00:19:14,300 Ik laat jullie me vertellen hoe het eruit ziet. 230 00:19:14,300 --> 00:19:20,500 En jij, Stella? Weet je wat het eerste deel van de format string eruit ziet? 231 00:19:20,500 --> 00:19:24,270 [Stella] Ik weet het niet zeker. >> Voel je vrij om Jimmy te vragen. 232 00:19:24,270 --> 00:19:27,690 Weet je, Jimmy? 233 00:19:27,690 --> 00:19:31,000 [Jimmy] Zou het gewoon mee? Ik weet het niet. Ik ben niet helemaal zeker. 234 00:19:31,000 --> 00:19:39,020 >> Oke. Wat dacht je van, heeft iemand je dit juist op het examen? 235 00:19:39,020 --> 00:19:41,770 Nee, Oke. 236 00:19:41,770 --> 00:19:47,920 Het blijkt dat hier alles wat we hoeven te doen is willen we elk deel van ons personeel structuur 237 00:19:47,920 --> 00:19:53,290 worden afgedrukt als een string in ons bestand. 238 00:19:53,290 --> 00:19:59,900 We gebruiken de string substitutie karakter drie verschillende tijden, want we hebben een achternaam 239 00:19:59,900 --> 00:20:07,160 gevolgd door een komma, dan is een voornaam gevolgd door een komma, 240 00:20:07,160 --> 00:20:12,430 en tenslotte het emailadres wordt gevolgd - die niet 241 00:20:12,430 --> 00:20:15,140 monteren op mijn scherm - maar het is gevolgd door een newline karakter. 242 00:20:15,140 --> 00:20:20,060 Dus ik ga het schrijven gewoon daar beneden. 243 00:20:20,060 --> 00:20:23,560 En dan na onze format string, 244 00:20:23,560 --> 00:20:27,880 hoeven we alleen maar de substituties, die we toegang krijgen tot het gebruik van de dot-notatie 245 00:20:27,880 --> 00:20:31,370 dat we zagen in probleem set 3. 246 00:20:31,370 --> 00:20:48,820 We kunnen gebruik maken s.last, s.first, en s.email 247 00:20:48,820 --> 00:20:58,990 te vervangen in die drie waarden in onze format string. 248 00:20:58,990 --> 00:21:06,190 Dus hoe ging dat? Logisch? 249 00:21:06,190 --> 00:21:09,700 Ja? Nee? Mogelijk? Oke. 250 00:21:09,700 --> 00:21:14,180 >> Het laatste ding dat we doen nadat we gedrukt en nadat we openden we onze file: 251 00:21:14,180 --> 00:21:17,370 wanneer we een bestand geopend, we hebben altijd aan te denken om te sluiten. 252 00:21:17,370 --> 00:21:19,430 Want anders zullen we uiteindelijk lekt het geheugen, 253 00:21:19,430 --> 00:21:22,500 met maximaal file descriptors. 254 00:21:22,500 --> 00:21:25,950 Dus om te sluiten, welke functie gebruiken we? Daniel? 255 00:21:25,950 --> 00:21:30,120 [Daniel] fclose? >> Fclose, precies. 256 00:21:30,120 --> 00:21:37,520 Het laatste deel van dit probleem was goed sluit het bestand met de fclose functie 257 00:21:37,520 --> 00:21:40,370 die ziet er net als dat. 258 00:21:40,370 --> 00:21:43,880 Niet te gek. 259 00:21:43,880 --> 00:21:46,990 Cool. 260 00:21:46,990 --> 00:21:49,520 Dus dat is probleem 33 op de quiz. 261 00:21:49,520 --> 00:21:52,480 We zullen zeker meer file I / O komen. 262 00:21:52,480 --> 00:21:55,130 We zullen een beetje meer te doen in lezing vandaag, of in artikel vandaag, 263 00:21:55,130 --> 00:22:01,710 want dat is wat er gaat het grootste deel van deze aankomende PSET vormen. 264 00:22:01,710 --> 00:22:05,020 Laten doorstromen van de quiz op dit punt. Ja? 265 00:22:05,020 --> 00:22:10,880 >> [Charlotte]] Waarom fclose (bestand) in plaats van fclose (staff.csv)? 266 00:22:10,880 --> 00:22:19,100 >> Ah. Omdat blijkt dat - dus de vraag, dat is een grote, 267 00:22:19,100 --> 00:22:27,800 is de reden waarom, als we fclose schrijven, schrijven we fclose (bestand) ster variabele 268 00:22:27,800 --> 00:22:33,680 in tegenstelling tot de bestandsnaam, staff.csv? Is dat juist? Ja. 269 00:22:33,680 --> 00:22:39,570 Dus laten we eens een kijkje nemen. Als ik overschakel naar mijn laptop, 270 00:22:39,570 --> 00:22:45,040 en laten we kijken naar de fclose functie. 271 00:22:45,040 --> 00:22:51,460 Dus de fclose functie sluit een beek en het duurt in de pointer naar de stroom die we willen sluiten, 272 00:22:51,460 --> 00:22:57,010 in tegenstelling tot de werkelijke bestandsnaam die we willen sluiten. 273 00:22:57,010 --> 00:23:01,620 En dit is omdat achter de schermen, wanneer u een oproep wil doen aan fopen, 274 00:23:01,620 --> 00:23:12,020 bij het openen van een bestand, bent u eigenlijk het toewijzen van geheugen aan informatie over het bestand op te slaan. 275 00:23:12,020 --> 00:23:16,380 Dus je hebt bestands pointer met informatie over het bestand, 276 00:23:16,380 --> 00:23:23,080 zoals het is geopend, de grootte, waar u op dit moment in het bestand, 277 00:23:23,080 --> 00:23:29,100 zodat u kunt lezen en schrijven oproepen naar die bepaalde plaats in het bestand. 278 00:23:29,100 --> 00:23:38,060 Je uiteindelijk het sluiten van de wijzer in plaats van het sluiten van de bestandsnaam. 279 00:23:38,060 --> 00:23:48,990 >> Ja? [Daniel] Dus om huren te gebruiken, zou je zeggen - hoe het te krijgen van de input van de gebruiker? 280 00:23:48,990 --> 00:23:53,830 Heeft fprintf handelen als GetString in de zin dat het gewoon wacht op de invoer van de gebruiker 281 00:23:53,830 --> 00:23:57,180 en wordt u gevraagd dit type - of wachten tot je deze drie dingen typen? 282 00:23:57,180 --> 00:24:00,480 Of heb je nodig om iets te gebruiken om huren te implementeren? 283 00:24:00,480 --> 00:24:04,100 >> Ja. Dus we zijn niet - de vraag is, hoe krijgen we de input van de gebruiker 284 00:24:04,100 --> 00:24:09,220 met het oog op verhuur implementeren? En wat we hier hebben is de beller van huur, 285 00:24:09,220 --> 00:24:17,690 doorgegeven in dit personeel struct met alle gegevens die zijn opgeslagen in de struct reeds. 286 00:24:17,690 --> 00:24:22,990 Dus fprintf is in staat om gewoon rechtstreeks schrijven dat de gegevens naar het bestand. 287 00:24:22,990 --> 00:24:25,690 Er is geen wachttijd voor invoer van de gebruiker. 288 00:24:25,690 --> 00:24:32,110 De gebruiker is al gegeven de input door goed om het in dit personeel struct. 289 00:24:32,110 --> 00:24:36,510 En dingen, natuurlijk, zou breken als een van deze pointers waren null, 290 00:24:36,510 --> 00:24:40,370 dus we schuiven een back-up hier en we kijken naar onze struct. 291 00:24:40,370 --> 00:24:43,640 We hebben snaar laatste, string first, string e-mail. 292 00:24:43,640 --> 00:24:48,530 We weten nu dat al die echt, onder de motorkap, zijn char * variabelen. 293 00:24:48,530 --> 00:24:53,470 Die al dan niet wijzen naar nul. 294 00:24:53,470 --> 00:24:55,800 Zij kunnen verwijzen naar geheugen op de heap, 295 00:24:55,800 --> 00:24:59,650 misschien geheugen op de stack. 296 00:24:59,650 --> 00:25:04,580 We weten niet echt, maar als een van deze pointers zijn null, of ongeldig, 297 00:25:04,580 --> 00:25:08,120 dat die zeker zullen crashen onze verhuur functie. 298 00:25:08,120 --> 00:25:11,050 Dat was iets dat soort was buiten het bereik van het examen. 299 00:25:11,050 --> 00:25:16,440 We zijn niet zorgen te maken over dat. 300 00:25:16,440 --> 00:25:22,170 Geweldig. Oke. Dus bewegen op uit de quiz. 301 00:25:22,170 --> 00:25:25,760 >> Laten we sluiten deze man, en we gaan kijken naar PSET 4. 302 00:25:25,760 --> 00:25:34,700 Dus als jullie kijken naar de PSET spec, zodra u het kunt openen, cs50.net/quizzes, 303 00:25:34,700 --> 00:25:42,730 we gaan om te gaan door een paar van de sectie problemen van vandaag. 304 00:25:42,730 --> 00:25:52,240 Ik ben naar beneden te scrollen - sectie van vragen begint op de derde pagina van de PSET spec. 305 00:25:52,240 --> 00:25:57,800 En het eerste deel wordt u gevraagd om te gaan en de korte bekijken op heroriëntatie en leidingen. 306 00:25:57,800 --> 00:26:02,820 Dat was een beetje een koele korte, toont u een aantal nieuwe, coole opdrachtregel trucs die u kunt gebruiken. 307 00:26:02,820 --> 00:26:06,050 En dan hebben we een paar vragen voor u als goed. 308 00:26:06,050 --> 00:26:10,860 Deze eerste vraag over stromen, waarop printf schrijft standaard, 309 00:26:10,860 --> 00:26:15,920 we soort van aangeroerd gewoon een beetje een moment geleden. 310 00:26:15,920 --> 00:26:22,380 Dit fprintf dat we gewoon hadden het over gaat in een bestand * stroom als argument. 311 00:26:22,380 --> 00:26:26,580 fclose neemt in een bestand * stroom als goed, 312 00:26:26,580 --> 00:26:32,660 en de return waarde van fopen geeft u een bestand * stroom ook. 313 00:26:32,660 --> 00:26:36,060 De reden dat we niet hebben gezien degenen, die vóór als we behandeld printf 314 00:26:36,060 --> 00:26:39,450 komt omdat printf heeft een standaard stroom. 315 00:26:39,450 --> 00:26:41,810 En de standaard stroom waaraan zij schrijft 316 00:26:41,810 --> 00:26:45,190 u zult te weten komen over de korte. 317 00:26:45,190 --> 00:26:50,080 Dus zeker een kijkje nemen op het. 318 00:26:50,080 --> 00:26:53,010 >> In paragraaf van vandaag, gaan we een beetje praten over GDB, 319 00:26:53,010 --> 00:26:57,720 want hoe meer vertrouwd bent met het, de meer oefening krijg je met het, 320 00:26:57,720 --> 00:27:01,390 hoe beter je zult daadwerkelijk jagen bugs in uw eigen code. 321 00:27:01,390 --> 00:27:05,540 Dit versnelt het proces van het debuggen up enorm. 322 00:27:05,540 --> 00:27:09,230 Dus met behulp van printf, elke keer dat je dat doet moet je je code opnieuw compileren, 323 00:27:09,230 --> 00:27:13,000 je moet opnieuw opstarten, soms moet je de printf oproep verplaatsen, 324 00:27:13,000 --> 00:27:17,100 commentaar uit code, het duurt slechts een tijdje. 325 00:27:17,100 --> 00:27:20,850 Ons doel is om te proberen en u te overtuigen dat met GDB, je in wezen kan 326 00:27:20,850 --> 00:27:26,810 printf iets op elk punt in je code en je nooit zorgen te hercompileren. 327 00:27:26,810 --> 00:27:35,120 Je hoeft nooit te starten en te raden waar te printf volgende te houden. 328 00:27:35,120 --> 00:27:40,910 Het eerste ding om te doen is om deze lijn te kopiëren en de programmadeel-aanduiding uitstappen van het web. 329 00:27:40,910 --> 00:27:47,530 Ik ben het kopiëren van deze regel code die zegt: "wget ​​http://cdn.cs50.net". 330 00:27:47,530 --> 00:27:49,510 Ik ga om het te kopiëren. 331 00:27:49,510 --> 00:27:55,950 Ik ga dan naar mijn toestel, uitzoomen zodat u kunt zien wat ik doe, 332 00:27:55,950 --> 00:28:01,890 plakken daar, en toen ik op Enter raakte, dit wget commando letterlijk is krijg je een web. 333 00:28:01,890 --> 00:28:06,210 Het gaat om pull-down dit bestand af van het internet, 334 00:28:06,210 --> 00:28:11,790 en het gaat om het op te slaan in de huidige directory. 335 00:28:11,790 --> 00:28:21,630 Nu, als ik toon mijn huidige directory kun je zien dat ik dit section5.zip bestand goed had daar. 336 00:28:21,630 --> 00:28:25,260 De manier om te gaan met die vent is unzip het, 337 00:28:25,260 --> 00:28:27,650 die u kunt doen in de command line, net als dit. 338 00:28:27,650 --> 00:28:31,880 Section5.zip. 339 00:28:31,880 --> 00:28:36,980 Dat zal het uit te pakken, maakt u de map voor mij, 340 00:28:36,980 --> 00:28:40,410 opblazen van de inhoud, leg ze in daar. 341 00:28:40,410 --> 00:28:47,410 Dus nu kan ik gaan in mijn sectie 5 directory met de opdracht cd. 342 00:28:47,410 --> 00:28:58,310 Wis het scherm met behulp van duidelijk. Dus het scherm op. 343 00:28:58,310 --> 00:29:02,280 Nu heb ik een mooie schone terminal om te gaan met. 344 00:29:02,280 --> 00:29:06,200 >> Nu als ik een lijst van alle bestanden die ik zie in deze map, 345 00:29:06,200 --> 00:29:12,270 zie je dat ik vier bestanden hebt: buggy1, buggy2, buggy3, en buggy4. 346 00:29:12,270 --> 00:29:16,180 Ik heb ook de bijbehorende. C bestanden. 347 00:29:16,180 --> 00:29:20,400 We gaan niet naar de. C-bestanden zien er voor nu. 348 00:29:20,400 --> 00:29:24,140 In plaats daarvan, we gaan om ze te gebruiken wanneer we open GDB. 349 00:29:24,140 --> 00:29:28,220 We hebben hielden ze rond, zodat we toegang tot de eigenlijke broncode wanneer we gebruik van GDB, 350 00:29:28,220 --> 00:29:32,740 maar het doel van dit deel van de sectie is om te knutselen rond met GDB 351 00:29:32,740 --> 00:29:40,370 en zie hoe we het kunnen gebruiken om erachter te komen wat er mis gaat met elk van deze vier buggy's. 352 00:29:40,370 --> 00:29:43,380 Dus we gaan gewoon door de kamer heel snel, 353 00:29:43,380 --> 00:29:47,000 en ik ga iemand vragen om een ​​van de buggy programma's te draaien, 354 00:29:47,000 --> 00:29:54,730 en dan gaan we als groep door middel van GDB, en we zullen zien wat we kunnen doen om deze programma's vast te stellen, 355 00:29:54,730 --> 00:29:58,460 of ten minste te bepalen wat er mis kan gaan in elk van hen. 356 00:29:58,460 --> 00:30:04,760 Laten we hier beginnen met Daniel. Zal je buggy1? Laten we eens kijken wat er gebeurt. 357 00:30:04,760 --> 00:30:09,470 [Daniel] Het zegt dat er een applicatie fout. >> Ja. Precies. 358 00:30:09,470 --> 00:30:12,460 Dus als ik zonder buggy1, krijg ik een seg fout. 359 00:30:12,460 --> 00:30:16,210 Op dit punt, ik kon gaan en open te stellen buggy1.c, 360 00:30:16,210 --> 00:30:19,450 proberen erachter te komen wat er mis kan gaan, 361 00:30:19,450 --> 00:30:22,000 maar een van de meest onaangename dingen over dit segment fout fout 362 00:30:22,000 --> 00:30:27,610 is dat het je niet vertellen op welke lijn van het programma dingen eigenlijk ging het mis en brak. 363 00:30:27,610 --> 00:30:29,880 Je soort moet kijken naar de code 364 00:30:29,880 --> 00:30:33,990 en erachter te komen met behulp van gok en controleer of printf om te zien wat er fout gaat. 365 00:30:33,990 --> 00:30:37,840 Een van de coolste dingen over GDB is dat het echt, echt gemakkelijk 366 00:30:37,840 --> 00:30:42,170 te achterhalen van de lijn waarop uw programma crasht. 367 00:30:42,170 --> 00:30:46,160 Het is absoluut de moeite waard om het te gebruiken, al was het maar voor. 368 00:30:46,160 --> 00:30:56,190 Dus om op te starten GDB, typ ik GDB, en dan geef ik het het pad naar het uitvoerbare bestand dat ik wil uitvoeren. 369 00:30:56,190 --> 00:31:01,960 Hier ben ik het typen gdb ./buggy1. 370 00:31:01,960 --> 00:31:06,600 Druk op Enter. Geeft me al deze copyright informatie, 371 00:31:06,600 --> 00:31:13,000 en hier beneden zie je deze lijn die zegt: "Het lezen van symbolen van / home / 372 00:31:13,000 --> 00:31:17,680 jharvard/section5/buggy1. " 373 00:31:17,680 --> 00:31:22,060 En als alles goed gaat, dan zie je het afdrukken van een bericht dat er als volgt uitziet. 374 00:31:22,060 --> 00:31:25,500 Het zal legenda, het zal zeggen: "Ik ben symbolen lezen van uw uitvoerbaar bestand," 375 00:31:25,500 --> 00:31:29,900 en dan zal het over deze "done" bericht hier. 376 00:31:29,900 --> 00:31:35,410 Als je ziet wat andere variant van deze, of zie je het niet kon vinden de symbolen 377 00:31:35,410 --> 00:31:41,460 of iets dergelijks, wat dat betekent is dat je gewoon niet hebt uitvoerbare gecompileerd goed. 378 00:31:41,460 --> 00:31:49,980 Als we programma's voor gebruik met GDB samen te stellen, moeten we die speciale-markering g te gebruiken, 379 00:31:49,980 --> 00:31:54,540 en dat is gedaan door standaard als het samenstellen van je programma's, gewoon door te typen maken 380 00:31:54,540 --> 00:31:59,320 of maak buggy of maak herstellen mag elk van deze. 381 00:31:59,320 --> 00:32:07,800 Maar als je handmatig het compileren bent met Clang, dan zul je moeten gaan en dat-markering g bevatten. 382 00:32:07,800 --> 00:32:10,310 >> Op dit punt, nu hebben we onze GDB prompt, 383 00:32:10,310 --> 00:32:12,310 het is vrij eenvoudig om te draaien van het programma. 384 00:32:12,310 --> 00:32:19,740 We kunnen ofwel typen lopen, of we kunnen gewoon typen r. 385 00:32:19,740 --> 00:32:22,820 De meeste GDB commando's kunnen worden afgekort. 386 00:32:22,820 --> 00:32:25,940 Meestal tot slechts een of een paar letters, dat is erg mooi. 387 00:32:25,940 --> 00:32:30,980 Dus Saad, als je Type R en druk op Enter, wat gebeurt er? 388 00:32:30,980 --> 00:32:39,390 [Saad] Ik heb SIGSEGV, segmentatie fout, en dan al die onwaarheden. 389 00:32:39,390 --> 00:32:43,650 >> Ja. 390 00:32:43,650 --> 00:32:47,990 Zoals we zien op het scherm op dit moment, en zoals Saad zei: 391 00:32:47,990 --> 00:32:53,430 wanneer we run of r typen en druk op Enter, we nog steeds dezelfde seg fout. 392 00:32:53,430 --> 00:32:55,830 Dus met behulp van GDB niet oplost ons probleem. 393 00:32:55,830 --> 00:32:59,120 Maar het geeft ons wat abracadabra, en het blijkt dat dit gobbledygook 394 00:32:59,120 --> 00:33:03,080 eigenlijk vertelt ons waar het gebeurt. 395 00:33:03,080 --> 00:33:10,680 Om ontleden dit een beetje, dit eerste bit is de functie waarin alles gaat verkeerd. 396 00:33:10,680 --> 00:33:20,270 Er is een __ strcmp_sse4_2, en het vertelt ons dat het er in dit bestand 397 00:33:20,270 --> 00:33:29,450 riep sysdeps/i386, dit alles, weer, soort van een puinhoop - maar lijn 254. 398 00:33:29,450 --> 00:33:31,670 Dat is een beetje moeilijk te ontleden aan. Meestal als je dit soort dingen, 399 00:33:31,670 --> 00:33:38,770 dat betekent dat het is seg vastgelopen in een van de systeem bibliotheken. 400 00:33:38,770 --> 00:33:43,220 Dus iets te maken met strcmp. Jullie hebben gezien strcmp eerder. 401 00:33:43,220 --> 00:33:52,730 Niet te gek, maar betekent dit dat strcmp kapot is of dat er een probleem is met strcmp? 402 00:33:52,730 --> 00:33:57,110 Wat denk je, Alexander? 403 00:33:57,110 --> 00:34:04,890 [Alexander] Is dat - is 254 de lijn? En de - niet de binaire, maar het is niet hun plafonds, 404 00:34:04,890 --> 00:34:10,590 en dan is er nog een andere taal voor elke functie. Is dat 254 in die functie, of -? 405 00:34:10,590 --> 00:34:21,460 >> Het is lijn 254. Het lijkt erop dat in deze. S bestand, dus het is de montage-code waarschijnlijk. 406 00:34:21,460 --> 00:34:25,949 >> Maar, ik denk dat het meer dringende zaak is, want we hebben gekregen een segment fout, 407 00:34:25,949 --> 00:34:29,960 en het lijkt alsof het komt van de strcmp functie, 408 00:34:29,960 --> 00:34:38,030 betekent dit, dan is dat strcmp gebroken? 409 00:34:38,030 --> 00:34:42,290 Het moet niet, hopelijk. Dus alleen maar omdat je een segmentation fault 410 00:34:42,290 --> 00:34:49,480 in een van de systeemfuncties, kenmerkend dat betekent dat je gewoon niet hebt genoemd correct. 411 00:34:49,480 --> 00:34:52,440 De snelste ding om te doen om erachter te komen wat er eigenlijk aan de hand 412 00:34:52,440 --> 00:34:55,500 als je iets geks als dit, te zien wanneer u een segment fout, 413 00:34:55,500 --> 00:34:59,800 vooral als je een programma dat met behulp van meer dan alleen de belangrijkste, 414 00:34:59,800 --> 00:35:03,570 is het gebruik van een backtrace. 415 00:35:03,570 --> 00:35:13,080 I afkorting backtrace door het schrijven bt, in tegenstelling tot de volledige backtrace woord. 416 00:35:13,080 --> 00:35:16,510 Maar Charlotte, wat gebeurt er als u typt bt en druk op Enter? 417 00:35:16,510 --> 00:35:23,200 [Charlotte] Het laat me twee lijnen, lijn 0 en lijn 1. 418 00:35:23,200 --> 00:35:26,150 >> Ja. Dus lijn 0 en lijn 1. 419 00:35:26,150 --> 00:35:34,560 Dit zijn de werkelijke stack frames die op dat moment waren in het spel wanneer je programma crashte. 420 00:35:34,560 --> 00:35:42,230 Vanaf het bovenste frame, frame 0, en naar de onderste, dat frame 1. 421 00:35:42,230 --> 00:35:45,140 Onze bovenste frame is de strcmp frame. 422 00:35:45,140 --> 00:35:50,080 U kunt denken aan dit als vergelijkbaar met dat probleem waar we waren gewoon te doen op de quiz met de wijzers, 423 00:35:50,080 --> 00:35:54,890 waar we ruilen stack frame op de top van de belangrijkste stack frame, 424 00:35:54,890 --> 00:35:59,700 en we hadden de variabelen die swap werd met behulp van op de top van de variabelen die centraal werd gebruikt. 425 00:35:59,700 --> 00:36:08,440 Hier onze crash gebeurde in onze strcmp functie, die werd genoemd door onze belangrijkste functie, 426 00:36:08,440 --> 00:36:14,370 en backtrace geeft ons niet alleen de functies waarin de dingen niet, 427 00:36:14,370 --> 00:36:16,440 maar het is ook ons ​​te vertellen waar alles werd aangeroepen. 428 00:36:16,440 --> 00:36:18,830 Dus als ik ga dan een beetje meer naar rechts, 429 00:36:18,830 --> 00:36:26,110 kunnen we zien dat ja, we waren op lijn 254 van deze strcmp-sse4.s bestand. 430 00:36:26,110 --> 00:36:32,540 Maar de oproep werd gedaan op buggy1.c, lijn 6. 431 00:36:32,540 --> 00:36:35,960 Dus dat betekent dat we kunnen doen - is dat we kunnen gewoon gaan controleren en te zien wat er gaande was 432 00:36:35,960 --> 00:36:39,930 op buggy1.c, lijn 6. 433 00:36:39,930 --> 00:36:43,780 Nogmaals, er zijn een paar manieren om dit te doen. Een daarvan is om uit te sluiten van de GDB 434 00:36:43,780 --> 00:36:49,460 of uw code te openen in een ander venster en kruisverwijzingen. 435 00:36:49,460 --> 00:36:54,740 Dat is in en van zichzelf, is erg handig want nu als je op kantooruren 436 00:36:54,740 --> 00:36:57,220 en je hebt een seg fout en uw TF vraagt ​​zich af waar alles brak, 437 00:36:57,220 --> 00:36:59,710 kun je gewoon zeggen: "O, lijn 6. Ik weet niet wat er gaande is, 438 00:36:59,710 --> 00:37:03,670 maar iets over lijn 6 wordt veroorzaakt door mijn programma te breken. " 439 00:37:03,670 --> 00:37:10,430 De andere manier om het te doen is dat je kunt deze opdracht genaamd lijst in GDB. 440 00:37:10,430 --> 00:37:13,650 U kunt ook afkorten met l. 441 00:37:13,650 --> 00:37:18,910 Dus als we raken l, wij wat hier te krijgen? 442 00:37:18,910 --> 00:37:21,160 We krijgen een hele hoop rare dingen. 443 00:37:21,160 --> 00:37:26,030 Dit is de eigenlijke montage-code 444 00:37:26,030 --> 00:37:29,860 dat in strcmp_sse4_2. 445 00:37:29,860 --> 00:37:32,440 Dit ziet er soort van funky, 446 00:37:32,440 --> 00:37:36,520 en de reden waarom we krijgen dit is omdat op dit moment, 447 00:37:36,520 --> 00:37:40,160 GDB heeft ons in frame 0. 448 00:37:40,160 --> 00:37:43,070 >> Dus wanneer we kijken naar variabelen, elke keer als we kijken naar de broncode, 449 00:37:43,070 --> 00:37:50,530 zijn we op zoek naar de bron code die betrekking heeft op de stack frame we op dit moment zijn binnen 450 00:37:50,530 --> 00:37:53,200 Dus om iets zinnigs te krijgen, moeten we 451 00:37:53,200 --> 00:37:57,070 verhuizen naar een stack frame dat meer zin heeft. 452 00:37:57,070 --> 00:38:00,180 In dit geval zou de belangrijkste stackframe een beetje meer zin 453 00:38:00,180 --> 00:38:02,680 want dat was eigenlijk de code die we schreven. 454 00:38:02,680 --> 00:38:05,330 Niet de strcmp code. 455 00:38:05,330 --> 00:38:08,650 De manier waarop je kunt verplaatsen tussen de frames, in dit geval, want we hebben twee, 456 00:38:08,650 --> 00:38:10,430 Er zijn 0 en 1, 457 00:38:10,430 --> 00:38:13,650 je dat doet met de op en neer commando's. 458 00:38:13,650 --> 00:38:18,480 Als ik omhoog een frame, 459 00:38:18,480 --> 00:38:21,770 nu ben ik in de belangrijkste stack frame. 460 00:38:21,770 --> 00:38:24,330 Ik kan naar beneden om terug te gaan naar waar ik was, 461 00:38:24,330 --> 00:38:32,830 weer omhoog, weer naar beneden, en weer omhoog. 462 00:38:32,830 --> 00:38:39,750 Als je ooit doen uw programma in GDB, je een crash krijgt, krijg je de backtrace, 463 00:38:39,750 --> 00:38:42,380 en je ziet dat het in sommige bestand dat je niet weet wat er gaande is. 464 00:38:42,380 --> 00:38:45,460 Je probeert lijst, is de code niet u bekend voorkomen, 465 00:38:45,460 --> 00:38:48,150 een kijkje nemen op uw frames en erachter te komen waar je bent. 466 00:38:48,150 --> 00:38:51,010 Je bent waarschijnlijk in de verkeerde stapel frame. 467 00:38:51,010 --> 00:38:58,760 Of op zijn minst dat je in een stapel frame dat niet is er een die je echt kunt debuggen. 468 00:38:58,760 --> 00:39:03,110 Nu we in de juiste stack frame, we zijn in de belangrijkste, 469 00:39:03,110 --> 00:39:08,100 nu kunnen we gebruik maken van de lijst met commando om erachter te komen wat de lijn was. 470 00:39:08,100 --> 00:39:13,590 En je ziet het, het drukken het voor ons hier. 471 00:39:13,590 --> 00:39:19,470 Maar we kunnen hitlijst allemaal hetzelfde, en de lijst geeft ons deze mooie afdruk 472 00:39:19,470 --> 00:39:23,920 van de werkelijke broncode die is aan de gang hier. 473 00:39:23,920 --> 00:39:26,420 >> In het bijzonder, kunnen we kijken naar lijn 6. 474 00:39:26,420 --> 00:39:29,330 We kunnen zien wat er aan de hand is. 475 00:39:29,330 --> 00:39:31,250 En het lijkt erop dat we het maken van een string vergelijking 476 00:39:31,250 --> 00:39:41,050 tussen de string "CS50 rocks" en argv [1]. 477 00:39:41,050 --> 00:39:45,700 Iets over dit werd crashen. 478 00:39:45,700 --> 00:39:54,120 Dus Missy, heb je een mening over wat kan worden hier aan de hand? 479 00:39:54,120 --> 00:39:59,400 [Missy] Ik weet niet waarom het crashen. >> Je weet niet waarom het crashen? 480 00:39:59,400 --> 00:40:02,700 Jimmy, alle gedachten? 481 00:40:02,700 --> 00:40:06,240 [Jimmy] Ik ben niet helemaal zeker, maar de laatste keer dat we gebruikten snaar te vergelijken, 482 00:40:06,240 --> 00:40:10,260 of strcmp, hadden we net als drie verschillende gevallen onder. 483 00:40:10,260 --> 00:40:12,800 We hadden geen ==, denk ik niet, denk dat goed in die eerste lijn. 484 00:40:12,800 --> 00:40:16,700 In plaats daarvan werd gescheiden in drie en was == 0, 485 00:40:16,700 --> 00:40:19,910 was <0, denk ik, en was> 0. 486 00:40:19,910 --> 00:40:22,590 Dus misschien zoiets? >> Ja. Dus er is dit probleem 487 00:40:22,590 --> 00:40:27,200 van doen we de vergelijking correct? 488 00:40:27,200 --> 00:40:31,660 Stella? Elke gedachten? 489 00:40:31,660 --> 00:40:38,110 [Stella] Ik weet het niet zeker. >> Niet zeker. Daniel? Gedachten? Oke. 490 00:40:38,110 --> 00:40:44,770 Het blijkt wat er hier gebeurt is wanneer we liepen het programma 491 00:40:44,770 --> 00:40:48,370 en we kregen het segment fout, toen u het programma voor de eerste keer, Daniel, 492 00:40:48,370 --> 00:40:50,800 gaf je het dan command line argumenten? 493 00:40:50,800 --> 00:40:58,420 [Daniel] Nee. >> Nee. In dat geval, wat is de waarde van argv [1]? 494 00:40:58,420 --> 00:41:00,920 >> Er is geen waarde. >> Juist. 495 00:41:00,920 --> 00:41:06,120 Nou, er is geen geschikt tekenreekswaarde. 496 00:41:06,120 --> 00:41:10,780 Maar er is een bepaalde waarde. Wat is de waarde die wordt opgeslagen in? 497 00:41:10,780 --> 00:41:15,130 >> Een vuilnis waarde? >> Het is ofwel een vuilnis waarde of, in dit geval, 498 00:41:15,130 --> 00:41:19,930 het einde van de argv array wordt altijd beëindigd met null. 499 00:41:19,930 --> 00:41:26,050 Dus wat er werkelijk werd opgeslagen in is null. 500 00:41:26,050 --> 00:41:30,810 De andere manier om dit op te lossen, in plaats van denken dat het door middel van, 501 00:41:30,810 --> 00:41:33,420 is om te proberen af ​​te drukken uit. 502 00:41:33,420 --> 00:41:35,880 Dit is waar ik zei dat het gebruik van GDB groot is, 503 00:41:35,880 --> 00:41:40,640 want je kunt uitprinten alle variabelen, alle waarden die u wilt 504 00:41:40,640 --> 00:41:43,230 met behulp van deze handige dandy-p commando. 505 00:41:43,230 --> 00:41:48,520 Dus als ik typ p en dan typ ik de waarde van een variabele of de naam van een variabele, 506 00:41:48,520 --> 00:41:55,320 zeggen, argc, zie ik dat argc is 1. 507 00:41:55,320 --> 00:42:01,830 Als ik wil afdrukken argv [0], kan ik dat doen, net als dat. 508 00:42:01,830 --> 00:42:04,840 En, zoals we zagen, argv [0] is altijd de naam van uw programma, 509 00:42:04,840 --> 00:42:06,910 altijd de naam van het uitvoerbare. 510 00:42:06,910 --> 00:42:09,740 Hier zie je het is het volledige pad naam kreeg. 511 00:42:09,740 --> 00:42:15,920 Ik kan ook uitprinten argv [1] en zie wat er gebeurt. 512 00:42:15,920 --> 00:42:20,890 >> Hier kregen we dit soort mystieke waarde. 513 00:42:20,890 --> 00:42:23,890 We hebben dit 0x0. 514 00:42:23,890 --> 00:42:27,850 Vergeet niet bij het begin van de term toen we spraken over hexadecimale getallen? 515 00:42:27,850 --> 00:42:34,680 Of dat kleine vraag aan het eind van PSET 0 over hoe tot 50 vertegenwoordigen in hex? 516 00:42:34,680 --> 00:42:39,410 De manier waarop we schrijven hexadecimale getallen in CS, alleen maar om niet verwarren onszelf 517 00:42:39,410 --> 00:42:46,080 met decimale getallen, is dat we hen altijd voorafgaan door 0x. 518 00:42:46,080 --> 00:42:51,420 Dus dit voorvoegsel 0x altijd gewoon betekent interpreteren het volgende nummer als een hexadecimaal getal, 519 00:42:51,420 --> 00:42:57,400 niet als een string, niet als een decimaal getal, niet als een binair getal. 520 00:42:57,400 --> 00:43:02,820 Omdat het aantal 5-0 is een geldig nummer in hexadecimaal. 521 00:43:02,820 --> 00:43:06,240 En het is een getal in decimale, 50. 522 00:43:06,240 --> 00:43:10,050 Dus dit is gewoon hoe disambiguate we. 523 00:43:10,050 --> 00:43:14,860 Dus 0x0 middelen hexadecimale 0, die ook decimaal 0, binaire 0. 524 00:43:14,860 --> 00:43:17,030 Het is gewoon de waarde 0. 525 00:43:17,030 --> 00:43:22,630 Het blijkt dat dit het null is eigenlijk, in het geheugen. 526 00:43:22,630 --> 00:43:25,940 Null is gewoon 0. 527 00:43:25,940 --> 00:43:37,010 Hier, het element opgeslagen bij argv [1] is null. 528 00:43:37,010 --> 00:43:45,220 Dus we proberen om onze "CS50 rocks" string te vergelijken met een null-string. 529 00:43:45,220 --> 00:43:48,130 Dus dereferentie null, proberen om dingen te openen op nul, 530 00:43:48,130 --> 00:43:55,050 die zijn meestal gaan om een ​​soort van segmentatie fout of andere slechte dingen gebeuren veroorzaken. 531 00:43:55,050 --> 00:43:59,350 En het blijkt dat strcmp niet controleert om te zien 532 00:43:59,350 --> 00:44:04,340 of u bent geslaagd in een waarde die is null. 533 00:44:04,340 --> 00:44:06,370 Integendeel, het gewoon doorgaat, probeert zijn ding doen, 534 00:44:06,370 --> 00:44:14,640 en als het seg fouten, het seg fouten, en het is jouw probleem. Je moet naar het te repareren. 535 00:44:14,640 --> 00:44:19,730 Heel snel, we zouden hoe dit probleem te verhelpen? Charlotte? 536 00:44:19,730 --> 00:44:23,540 [Charlotte] U kunt controleren met behulp van of. 537 00:44:23,540 --> 00:44:32,240 Dus als argv [1] null is, == 0, dan terug 1, of iets [onverstaanbaar]. 538 00:44:32,240 --> 00:44:34,590 >> Ja. Dus dat is een geweldige manier om het te doen, zoals we kunnen nagaan, 539 00:44:34,590 --> 00:44:39,230 de waarde die we staan ​​op het punt om te gaan in strcmp, argv [1], is het null? 540 00:44:39,230 --> 00:44:45,830 Als het null, dan kunnen we zeggen oke, af te breken. 541 00:44:45,830 --> 00:44:49,450 >> Een meer voorkomende manier om dit te doen is het gebruik van de argc waarde. 542 00:44:49,450 --> 00:44:52,040 U kunt hier zien in het begin van de belangrijkste, 543 00:44:52,040 --> 00:44:58,040 we weggelaten die eerste test die we meestal doen als we gebruik maken van command line argumenten, 544 00:44:58,040 --> 00:45:05,240 dat is om te testen of onze argc waarde is wat we verwachten. 545 00:45:05,240 --> 00:45:10,290 In dit geval, we verwachten op zijn minst twee argumenten, 546 00:45:10,290 --> 00:45:13,660 de naam van het programma plus een andere. 547 00:45:13,660 --> 00:45:17,140 Omdat we op het punt om het tweede argument gebruiken hier. 548 00:45:17,140 --> 00:45:21,350 Dus met een soort van test op voorhand, voor onze strcmp oproep 549 00:45:21,350 --> 00:45:37,390 dat de tests al dan niet argv ten minste 2, zou ook hetzelfde doen soort dingen. 550 00:45:37,390 --> 00:45:40,620 We kunnen zien of dat werkt door het uitvoeren van het programma opnieuw. 551 00:45:40,620 --> 00:45:45,610 U kunt uw programma altijd opnieuw op te starten binnen GDB, dat is erg leuk. 552 00:45:45,610 --> 00:45:49,310 U kunt lopen, en als je pas in argumenten aan uw programma, 553 00:45:49,310 --> 00:45:53,060 passeert u ze in als u belt loopt, niet wanneer je opstart GDB. 554 00:45:53,060 --> 00:45:57,120 Op die manier houdt u een beroep op uw programma met verschillende argumenten iedere keer. 555 00:45:57,120 --> 00:46:08,080 Dus lopen, of weer, ik kan typen r, en laten we zien wat er gebeurt als we typen "hallo". 556 00:46:08,080 --> 00:46:11,140 Het zal altijd vragen of u wilt opnieuw beginnen vanaf het begin. 557 00:46:11,140 --> 00:46:17,490 Meestal wil je het weer vanaf het begin. 558 00:46:17,490 --> 00:46:25,010 En op dit punt, het opnieuw opstarten het weer, Het drukt 559 00:46:25,010 --> 00:46:28,920 het programma dat we lopen, buggy1, met het argument hello, 560 00:46:28,920 --> 00:46:32,720 en het drukt deze standaard uit, het zegt: "Je hebt een D te krijgen, 'verdrietig gezicht. 561 00:46:32,720 --> 00:46:37,610 Maar we hebben niet seg fout. Het zei dat proces verlaten normaal. 562 00:46:37,610 --> 00:46:39,900 Dus dat ziet er goed uit. 563 00:46:39,900 --> 00:46:43,050 Nooit meer seg fout, we hebben het verleden, 564 00:46:43,050 --> 00:46:48,190 zodat het lijkt alsof dat was inderdaad het segment fout bug die we kregen. 565 00:46:48,190 --> 00:46:51,540 Helaas, het vertelt ons dat we een D. krijgt 566 00:46:51,540 --> 00:46:54,090 >> We kunnen terug gaan en kijken naar de code en zien wat er gaande was er 567 00:46:54,090 --> 00:46:57,980 om erachter te komen wat er was - waarom het ons te vertellen dat we een D. kregen 568 00:46:57,980 --> 00:47:03,690 Laten we eens kijken, hier werd deze printf zeggen dat je een D. kreeg 569 00:47:03,690 --> 00:47:08,540 Als we typen lijst, zoals u blijven typen lijst, het houdt itereren naar beneden door uw programma, 570 00:47:08,540 --> 00:47:10,940 dus het zal u tonen de eerste paar regels van uw programma. 571 00:47:10,940 --> 00:47:15,450 Dan zal je de volgende paar regels, en de volgende stuk en het volgende stuk. 572 00:47:15,450 --> 00:47:18,240 En het zal blijven proberen naar beneden te gaan. 573 00:47:18,240 --> 00:47:21,180 En nu we krijgen aan "regelnummer 16 is buiten het bereik." 574 00:47:21,180 --> 00:47:23,940 Omdat het slechts 15 regels. 575 00:47:23,940 --> 00:47:30,310 Als je op dit punt en je af te vragen: "Wat moet ik doen?" kunt u gebruik maken van de opdracht help. 576 00:47:30,310 --> 00:47:34,340 Gebruik dan helpen en het de naam van een commando te geven. 577 00:47:34,340 --> 00:47:36,460 En je ziet het GDB geeft ons al dit soort dingen. 578 00:47:36,460 --> 00:47:43,870 Het zegt: "Met geen argument, tien meer lijnen na of rond de vorige lijst staan. 579 00:47:43,870 --> 00:47:47,920 Lijst - bevat de tien regels voor - " 580 00:47:47,920 --> 00:47:52,960 Dus laten we proberen met behulp van de lijst minus. 581 00:47:52,960 --> 00:47:57,000 En dat geeft de 10 regels vorige, je kunt spelen met de lijst een beetje. 582 00:47:57,000 --> 00:48:02,330 U kunt de lijst, lijst te doen -, kunt u zelfs geven de lijst een nummer, zoals lijst 8, 583 00:48:02,330 --> 00:48:07,500 en het zal een lijst van de 10 regels rond regel 8. 584 00:48:07,500 --> 00:48:10,290 En je kunt zien wat er hier aan de hand is heb je een eenvoudig als anders. 585 00:48:10,290 --> 00:48:13,980 Als u typt in CS50 rotsen, Het drukt "Je een A. te krijgen" 586 00:48:13,980 --> 00:48:16,530 Anders drukt "Je hebt een D. te krijgen" 587 00:48:16,530 --> 00:48:23,770 Bummer stad. Oke. Ja? 588 00:48:23,770 --> 00:48:26,730 >> [Daniel] Dus toen ik probeerde te doen CS50 rotsen zonder de aanhalingstekens, 589 00:48:26,730 --> 00:48:29,290 het zegt "Je hebt een D. te krijgen" 590 00:48:29,290 --> 00:48:32,560 Ik moest de citaten te krijgen om te werken, waarom is dat? 591 00:48:32,560 --> 00:48:38,490 >> Ja. Het blijkt dat wanneer - dit is een andere leuke kleine versnapering - 592 00:48:38,490 --> 00:48:47,900 wanneer u het programma uit te voeren, als we lopen en we typen CS50 rotsen, 593 00:48:47,900 --> 00:48:50,800 net zoals Daniël zei hij dat deed, en je druk op Enter, 594 00:48:50,800 --> 00:48:52,870 er staat nog steeds krijgen we een D. 595 00:48:52,870 --> 00:48:55,580 En de vraag is, waarom is dit? 596 00:48:55,580 --> 00:49:02,120 En het blijkt dat zowel onze terminal en GDB ontleden ze als twee gescheiden argumenten. 597 00:49:02,120 --> 00:49:04,800 Want als er een ruimte, dat is impliciet als 598 00:49:04,800 --> 00:49:08,730 het eerste argument beëindigd; het volgende argument gaat beginnen. 599 00:49:08,730 --> 00:49:13,260 De manier om die te combineren tot twee, of sorry, tot een argument, 600 00:49:13,260 --> 00:49:18,510 is het gebruik van de aanhalingstekens. 601 00:49:18,510 --> 00:49:29,560 Dus nu, als we het in citaten en opnieuw opstarten, krijgen we een A. 602 00:49:29,560 --> 00:49:38,780 Dus gewoon om samen te vatten, worden er geen aanhalingstekens, CS50 en rotsen geparsed als twee afzonderlijke argumenten. 603 00:49:38,780 --> 00:49:45,320 Met citaten, het is geparsed als een argument zijn. 604 00:49:45,320 --> 00:49:53,070 >> We zien dit met een breekpunt. 605 00:49:53,070 --> 00:49:54,920 Tot nu toe hebben we gelopen ons programma, en het is gelopen 606 00:49:54,920 --> 00:49:58,230 totdat het met seg gebreken of hits een fout 607 00:49:58,230 --> 00:50:05,930 of totdat het verlaten en alle was helemaal goed. 608 00:50:05,930 --> 00:50:08,360 Dit is niet per se de meest behulpzame ding, want soms 609 00:50:08,360 --> 00:50:11,840 je hebt een fout in het programma, maar het is niet het veroorzaken van een segmentation fault. 610 00:50:11,840 --> 00:50:16,950 Het is niet het veroorzaken van uw programma te stoppen of iets dergelijks. 611 00:50:16,950 --> 00:50:20,730 De manier om GDB te krijgen om te pauzeren uw programma op een bepaald punt 612 00:50:20,730 --> 00:50:23,260 is het instellen van een breekpunt. 613 00:50:23,260 --> 00:50:26,520 U kunt dit doen door het instellen van een breekpunt op een functienaam 614 00:50:26,520 --> 00:50:30,770 of u kunt een breekpunt op een bepaalde regel code. 615 00:50:30,770 --> 00:50:34,450 Ik wil breekpunten op functienamen te stellen, omdat - gemakkelijk te onthouden, 616 00:50:34,450 --> 00:50:37,700 en als je echt naar binnen en je broncode een beetje te veranderen, 617 00:50:37,700 --> 00:50:42,020 dan is uw breekpunt daadwerkelijk zal blijven op dezelfde plaats in de code. 618 00:50:42,020 --> 00:50:44,760 Overwegende dat, indien u gebruik maakt van regelnummers en de regelnummers te wijzigen 619 00:50:44,760 --> 00:50:51,740 omdat je toevoegen of verwijderen of andere code, dan is uw breekpunten zijn allemaal helemaal verpest. 620 00:50:51,740 --> 00:50:58,590 Een van de meest voorkomende dingen die ik doe is ingesteld een breekpunt op de belangrijkste functie. 621 00:50:58,590 --> 00:51:05,300 Vaak zal ik starten GDB, ik typ b main, druk op Enter, en dat zal een breekpunt 622 00:51:05,300 --> 00:51:10,630 op de belangrijkste functie die gewoon zegt: "Pauzeer het programma zodra u begint te lopen," 623 00:51:10,630 --> 00:51:17,960 en op die manier, als ik mijn programma uit te voeren met, zeg, CS50 rotsen als twee argumenten 624 00:51:17,960 --> 00:51:24,830 en druk op Enter, het wordt de belangrijkste functie en deze stopt namelijk direct bij de eerste lijn, 625 00:51:24,830 --> 00:51:30,620 vlak voor het evalueert de strcmp functie. 626 00:51:30,620 --> 00:51:34,940 >> Omdat ik gepauzeerd, nu kan ik beginnen met uitmesten rond en zien wat er aan de hand 627 00:51:34,940 --> 00:51:40,250 met alle verschillende variabelen die worden doorgegeven in mijn programma. 628 00:51:40,250 --> 00:51:43,670 Hier kan ik printen argc en zie wat er gebeurt. 629 00:51:43,670 --> 00:51:50,030 Zie dat argc is 3, omdat het 3 verschillende waarden in zit. 630 00:51:50,030 --> 00:51:54,060 Het is de naam van het programma kreeg, het heeft het eerste argument en het tweede argument. 631 00:51:54,060 --> 00:52:09,330 Wij kunnen die uit door te kijken naar argv [0], argv [1], en argv [2]. 632 00:52:09,330 --> 00:52:12,030 Dus nu zie je ook waarom dit strcmp oproep gaat mislukken, 633 00:52:12,030 --> 00:52:21,650 omdat je ziet dat het was opgesplitst de CS50 en de rotsen in twee afzonderlijke argumenten. 634 00:52:21,650 --> 00:52:27,250 Op dit punt, als je eenmaal hebt raakte een breekpunt, kunt u doorgaan om door uw programma 635 00:52:27,250 --> 00:52:32,920 regel voor regel, in tegenstelling tot het starten van een programma opnieuw. 636 00:52:32,920 --> 00:52:35,520 Dus als je niet wilt dat uw programma opnieuw te starten en gewoon door te gaan van hier, 637 00:52:35,520 --> 00:52:41,970 kunt u gebruik maken van de continue commando en verder zal het programma uit te voeren tot het einde. 638 00:52:41,970 --> 00:52:45,010 Net als zij heeft gedaan hier. 639 00:52:45,010 --> 00:52:54,880 Echter, als ik het programma opnieuw starten, CS50 rotsen, het raakt mijn breekpunt weer, 640 00:52:54,880 --> 00:52:59,670 en deze keer, als ik niet wil helemaal ga je gewoon door de rest van het programma, 641 00:52:59,670 --> 00:53:08,040 Ik kan gebruik maken van de volgende opdracht, die ik ook afkorten met n. 642 00:53:08,040 --> 00:53:12,960 En dit zal u door het programma regel voor regel. 643 00:53:12,960 --> 00:53:17,530 Zodat u kunt kijken als dingen uit te voeren, als variabelen veranderen, als dingen bijgewerkt. 644 00:53:17,530 --> 00:53:21,550 En dat is erg leuk. 645 00:53:21,550 --> 00:53:26,570 Het andere koele ding is in plaats van het herhalen van dezelfde commando over en over en weer, 646 00:53:26,570 --> 00:53:30,670 als je gewoon op Enter - dus even je ziet heb ik niet getypt in iets - 647 00:53:30,670 --> 00:53:33,780 als ik gewoon op Enter drukt, wordt het te herhalen het vorige commando, 648 00:53:33,780 --> 00:53:36,900 of de vorige GDB opdracht die ik net binnen 649 00:53:36,900 --> 00:53:56,000 Ik kan blijven raken op Enter en het zal blijven doorlopen mijn code regel voor regel. 650 00:53:56,000 --> 00:53:59,310 Ik roep jullie om uit te gaan bekijken van de andere buggy's ook. 651 00:53:59,310 --> 00:54:01,330 We hebben geen tijd om door alle van hen vandaag in paragraaf. 652 00:54:01,330 --> 00:54:05,890 De broncode is er, dus je kunt soort te zien wat er aan de hand 653 00:54:05,890 --> 00:54:07,730 achter de schermen als je echt vast komt te zitten, 654 00:54:07,730 --> 00:54:11,940 maar op zijn minst, maar de praktijk opstarten GDB, 655 00:54:11,940 --> 00:54:13,940 het uitvoeren van het programma tot het breekt op u, 656 00:54:13,940 --> 00:54:18,260 het verkrijgen van de backtrace, uitzoeken welke functie de crash was in, 657 00:54:18,260 --> 00:54:24,450 welke lijn het was op, het afdrukken van een aantal variabele waarden, 658 00:54:24,450 --> 00:54:30,140 maar dat je een gevoel te krijgen voor het, want dat zal je echt helpen voor de toekomst. 659 00:54:30,140 --> 00:54:36,340 Op dit punt, gaan we hierna uit GDB, waarvan je gebruik te stoppen of gewoon q. 660 00:54:36,340 --> 00:54:40,460 Als uw programma is in het midden van het runnen van nog, en het is niet verlaten, 661 00:54:40,460 --> 00:54:43,510 het zal altijd vragen: "Ben je zeker dat je echt wilt stoppen?" 662 00:54:43,510 --> 00:54:48,770 U kunt gewoon op ja. 663 00:54:48,770 --> 00:54:55,250 >> Nu gaan we kijken naar de volgende probleem dat we hebben, dat is de kat programma. 664 00:54:55,250 --> 00:54:59,880 Als je de korte op heroriëntatie en pijpen, zul je zien dat Tommy dit programma gebruikt 665 00:54:59,880 --> 00:55:07,540 die wordt afgedrukt in principe de gehele output van een bestand naar het scherm. 666 00:55:07,540 --> 00:55:12,660 Dus als ik kat lopen, dit is eigenlijk een ingebouwd programma om het apparaat, 667 00:55:12,660 --> 00:55:16,860 en als je Macs kunt u dit ook doen op je Mac, als je open te stellen terminal. 668 00:55:16,860 --> 00:55:25,630 En wij - kat, laten we zeggen, cp.c, en druk op Enter. 669 00:55:25,630 --> 00:55:29,640 Wat dit deed, als we omhoog een beetje en zien waar we liepen de lijn, 670 00:55:29,640 --> 00:55:40,440 of waar we de opdracht cat liep, het letterlijk net uitgeprint de inhoud van cp.c naar ons scherm. 671 00:55:40,440 --> 00:55:44,140 We kunnen opnieuw opstarten en je kunt samen te stellen in meerdere bestanden. 672 00:55:44,140 --> 00:55:49,880 Dus u kunt doen kat cp.c, en dan kunnen we ook samenvoegen van de Cat.C bestand, 673 00:55:49,880 --> 00:55:53,250 dat is het programma dat we gaan schrijven, 674 00:55:53,250 --> 00:55:58,140 en het zal terug print beide bestanden om terug te gaan naar ons scherm. 675 00:55:58,140 --> 00:56:05,490 Dus als we naar boven een klein beetje, dan zien we dat als we liepen deze kat cp.c, Cat.C, 676 00:56:05,490 --> 00:56:17,110 eerst afgedrukt van de cp-bestand, en dan eronder, het uitgeprint het Cat.C bestand recht naar beneden hier. 677 00:56:17,110 --> 00:56:19,650 We gaan dit gebruiken om gewoon onze voeten nat. 678 00:56:19,650 --> 00:56:25,930 Speel met eenvoudige afdruktaken naar de terminal, zien hoe dat werkt. 679 00:56:25,930 --> 00:56:39,170 Als jullie openen met gedit Cat.C, druk op Enter, 680 00:56:39,170 --> 00:56:43,760 zie je het programma dat we gaan schrijven. 681 00:56:43,760 --> 00:56:48,980 We hebben deze mooie boiler plate inbegrepen, dus we hebben geen tijd te besteden typen dat alles uit. 682 00:56:48,980 --> 00:56:52,310 We controleren ook het aantal doorgegeven argumenten inch 683 00:56:52,310 --> 00:56:56,910 We printen een mooie gebruiksbericht. 684 00:56:56,910 --> 00:57:00,950 >> Dit is het soort ding dat, opnieuw, alsof we het over, 685 00:57:00,950 --> 00:57:04,490 het is bijna als spiergeheugen. 686 00:57:04,490 --> 00:57:07,190 Vergeet niet om te blijven doen hetzelfde soort dingen 687 00:57:07,190 --> 00:57:11,310 en altijd afdrukken van een soort van nuttige bericht 688 00:57:11,310 --> 00:57:17,670 zodat mensen weten hoe je je programma uit te voeren. 689 00:57:17,670 --> 00:57:21,630 Met kat, het is vrij eenvoudig, we gaan gewoon om te gaan door alle van de verschillende argumenten 690 00:57:21,630 --> 00:57:24,300 die werden doorgegeven aan ons programma, en we gaan om af te drukken 691 00:57:24,300 --> 00:57:29,950 de inhoud van het scherm een ​​voor een. 692 00:57:29,950 --> 00:57:35,670 Om bestanden af ​​te drukken op het scherm, we gaan iets vergelijkbaars te doen 693 00:57:35,670 --> 00:57:38,120 naar wat we deden op het einde van de quiz. 694 00:57:38,120 --> 00:57:45,350 Aan het einde van de quiz, dat programma te huren, moesten we het openen van een bestand, 695 00:57:45,350 --> 00:57:48,490 en dan moesten we afdrukken. 696 00:57:48,490 --> 00:57:54,660 In dit geval gaan we het openen van een bestand, en we gaan in plaats daarvan lezen van. 697 00:57:54,660 --> 00:58:00,630 Dan gaan we, af te drukken in plaats van naar een bestand, we gaan om af te drukken op het scherm. 698 00:58:00,630 --> 00:58:05,830 Dus het afdrukken naar het scherm dat u alle eerder hebt gedaan met printf. 699 00:58:05,830 --> 00:58:08,290 Dus dat is niet al te gek. 700 00:58:08,290 --> 00:58:12,190 Maar het lezen van een bestand is een beetje raar. 701 00:58:12,190 --> 00:58:17,300 We gaan door dat een beetje op een moment. 702 00:58:17,300 --> 00:58:20,560 Als jullie terug gaan naar dat laatste probleem op uw quiz, probleem 33, 703 00:58:20,560 --> 00:58:27,280 de eerste lijn die we gaan doen hier, het openen van het bestand, is zeer vergelijkbaar met wat we hebben gedaan daar. 704 00:58:27,280 --> 00:58:36,370 Dus Stella, wat doet die lijn eruit, wanneer we een bestand te openen? 705 00:58:36,370 --> 00:58:47,510 [Stella] Hoofdstad FILE *, bestand - >> Oke. >> - Is gelijk aan fopen. >> Yup. 706 00:58:47,510 --> 00:58:55,980 Die in dit geval is? Het is in het commentaar. 707 00:58:55,980 --> 00:59:06,930 >> Het is in de reactie achterlaten? argv [i] en r? 708 00:59:06,930 --> 00:59:11,300 >> Precies. Goed zo. Dus Stella is helemaal goed. 709 00:59:11,300 --> 00:59:13,720 Dit is wat de lijn eruit ziet. 710 00:59:13,720 --> 00:59:19,670 We gaan naar een bestand stroom variabele te krijgen, op te slaan in een FILE *, dus alle kappen, 711 00:59:19,670 --> 00:59:25,720 FILE, *, en de naam van deze variabele zal zijn dossier. 712 00:59:25,720 --> 00:59:32,250 We kunnen noemen wat we willen. We kunnen noemen first_file of file_i, wat we zouden willen. 713 00:59:32,250 --> 00:59:37,590 En dan de naam van het bestand werd in op de opdrachtregel naar dit programma. 714 00:59:37,590 --> 00:59:44,450 Dus het is opgeslagen in argv [i,] en dan gaan we naar dit bestand te openen in de leesmodus. 715 00:59:44,450 --> 00:59:48,100 Nu we het bestand geopend, wat is het ding dat we altijd aan te denken om te doen 716 00:59:48,100 --> 00:59:52,230 wanneer we hebben een dossier geopend? Sluiten. 717 00:59:52,230 --> 00:59:57,220 Dus Missy, hoe sluiten we een bestand? 718 00:59:57,220 --> 01:00:01,020 [Missy] fclose (bestand) >> fclose (bestand). Precies. 719 01:00:01,020 --> 01:00:05,340 Geweldig. Oke. Als we kijken naar dit commentaar doen hier, 720 01:00:05,340 --> 01:00:11,940 het zegt, "Open argv [i] en print de inhoud naar stdout." 721 01:00:11,940 --> 01:00:15,460 >> Standaard out is een rare naam. Stdout is gewoon onze manier om te zeggen 722 01:00:15,460 --> 01:00:22,880 we willen het afdrukken naar de terminal, we willen het afdrukken naar de standaard uitvoer stroom. 723 01:00:22,880 --> 01:00:26,450 We kunnen eigenlijk te ontdoen van deze opmerking hier. 724 01:00:26,450 --> 01:00:36,480 Ik ga om het te kopiëren en te plakken want dat is wat we deden. 725 01:00:36,480 --> 01:00:41,290 Op dit punt, nu moeten we het bestand wat te lezen bij beetje. 726 01:00:41,290 --> 01:00:46,300 We hebben gesproken over een aantal manieren om het lezen van bestanden. 727 01:00:46,300 --> 01:00:51,830 Welke zijn je favorieten tot nu toe? 728 01:00:51,830 --> 01:00:57,960 Welke manieren heb je gezien of weet je nog, om bestanden te lezen? 729 01:00:57,960 --> 01:01:04,870 [Daniel] fread? >> Fread? Dus fread is een. Jimmy, weet u nog meer? 730 01:01:04,870 --> 01:01:12,150 [Jimmy] Nee. >> Oke. Nope. Charlotte? Alexander? Elke anderen? Oke. 731 01:01:12,150 --> 01:01:20,740 Dus de anderen zijn fgetc, is er een die we veel gebruiken. 732 01:01:20,740 --> 01:01:26,410 Er is ook fscanf; jullie te zien een patroon hier? 733 01:01:26,410 --> 01:01:29,170 Ze beginnen allemaal met f. Alles wat te maken heeft met een bestand. 734 01:01:29,170 --> 01:01:35,260 Er is fread, fgetc, fscanf. Dit zijn alle functies lezen. 735 01:01:35,260 --> 01:01:49,120 Voor het schrijven hebben we fwrite, we hebben fputc in plaats van fgetc. 736 01:01:49,120 --> 01:01:58,250 We hebben ook fprintf zoals we zagen aan de quiz. 737 01:01:58,250 --> 01:02:01,680 Aangezien dit een probleem betreft het lezen van een bestand, 738 01:02:01,680 --> 01:02:04,940 we gaan naar een van deze drie functies te gebruiken. 739 01:02:04,940 --> 01:02:10,890 We gaan niet om deze functies te gebruiken hier beneden. 740 01:02:10,890 --> 01:02:14,880 Deze functies zijn allemaal te vinden in de standaard I / O library. 741 01:02:14,880 --> 01:02:17,510 Dus als je kijkt naar de top van dit programma, 742 01:02:17,510 --> 01:02:24,110 kun je zien dat we al de header-bestand voor de standaard I / O library inbegrepen. 743 01:02:24,110 --> 01:02:27,120 Willen we erachter te komen welke we willen gebruiken, 744 01:02:27,120 --> 01:02:29,690 kunnen we altijd het openstellen van de man-pagina's. 745 01:02:29,690 --> 01:02:34,350 Dus we kunnen typen man stdio 746 01:02:34,350 --> 01:02:43,180 en lees alles over de stdio input en output functies in C. 747 01:02:43,180 --> 01:02:49,870 En we kunnen nu al zien oh, kijk. Het is fgetc vermelden, is het vermelden fputc. 748 01:02:49,870 --> 01:02:57,220 Zo kunt u doorklikken een beetje en kijk naar, laten we zeggen, fgetc 749 01:02:57,220 --> 01:03:00,060 en kijk naar de man pagina. 750 01:03:00,060 --> 01:03:03,430 Je kunt zien dat het gaat samen met een hele hoop andere functies: 751 01:03:03,430 --> 01:03:12,640 fgetc, fgets, getc, getchar, krijgt, ungetc, en de input van characters en strings. 752 01:03:12,640 --> 01:03:19,180 Dus dit is hoe lezen we in characters en strings van bestanden van standaard invoer, 753 01:03:19,180 --> 01:03:21,990 die hoofdzakelijk uit de gebruiker. 754 01:03:21,990 --> 01:03:24,780 En dit is hoe we het doen in de werkelijke C. 755 01:03:24,780 --> 01:03:30,850 Dus dit is niet met behulp van de GetString en getchar functies 756 01:03:30,850 --> 01:03:36,840 die we hebben gebruikt uit de CS50 bibliotheek. 757 01:03:36,840 --> 01:03:39,710 We gaan dit probleem te doen in een paar manieren 758 01:03:39,710 --> 01:03:43,430 zodat u kunt zien twee verschillende manieren om het te doen. 759 01:03:43,430 --> 01:03:48,490 Zowel de fread functie die Daniel genoemd en fgetc zijn goede manieren om het te doen. 760 01:03:48,490 --> 01:03:53,790 Ik denk dat fgetc is een beetje makkelijker, omdat het alleen heeft, zoals je ziet, 761 01:03:53,790 --> 01:03:59,660 een argument, de FILE * dat we proberen om het karakter lezen, 762 01:03:59,660 --> 01:04:02,740 en de geretourneerde waarde is een int. 763 01:04:02,740 --> 01:04:05,610 En dit is een beetje verwarrend, toch? 764 01:04:05,610 --> 01:04:11,450 >> Omdat we het krijgen van een personage, dus waarom niet deze terugkeer een char? 765 01:04:11,450 --> 01:04:18,700 Jullie enig idee over waarom dit misschien niet terug een char? 766 01:04:18,700 --> 01:04:25,510 [Missy antwoorden, onverstaanbaar] >> Ja. Dus Missy is helemaal goed. 767 01:04:25,510 --> 01:04:31,570 Als het ASCII, dan integer, worden toegewezen aan een effectief char. 768 01:04:31,570 --> 01:04:33,520 Kan een ASCII-teken zijn, en dat klopt. 769 01:04:33,520 --> 01:04:36,220 Dat is precies wat er gebeurt. 770 01:04:36,220 --> 01:04:39,190 We gebruiken een int simpelweg omdat er meer bits. 771 01:04:39,190 --> 01:04:44,750 Het is groter dan een char; onze char alleen 8 bits, dat 1 byte op onze 32-bit machines. 772 01:04:44,750 --> 01:04:48,520 En een int heeft alle 4 bytes ter waarde van de ruimte. 773 01:04:48,520 --> 01:04:50,940 Het blijkt dat de manier fgetc werkt, 774 01:04:50,940 --> 01:04:53,940 Als we naar beneden scrollen in onze samenvatting in deze man pagina een beetje, 775 01:04:53,940 --> 01:05:05,000 scroll helemaal naar beneden. Het blijkt dat ze deze speciale waarde genaamd EOF te gebruiken. 776 01:05:05,000 --> 01:05:09,640 Het is een speciale constante als de geretourneerde waarde van de functie fgetc 777 01:05:09,640 --> 01:05:14,570 wanneer je de einde van het bestand, of als u een foutmelding krijgen. 778 01:05:14,570 --> 01:05:18,170 En het blijkt dat om goed deze vergelijkingen maken met EOF, 779 01:05:18,170 --> 01:05:24,060 u wilt dat de extra hoeveelheid informatie die je hebt hebben in een int 780 01:05:24,060 --> 01:05:28,420 in tegenstelling tot het gebruik van een char variabele. 781 01:05:28,420 --> 01:05:32,130 Hoewel fgetc wordt effectief het krijgen van een personage uit een bestand, 782 01:05:32,130 --> 01:05:38,450 je wilt onthouden, dat het iets is dat van het type int is aan u terug. 783 01:05:38,450 --> 01:05:41,360 Dat gezegd hebbende, het is vrij gemakkelijk te gebruiken. 784 01:05:41,360 --> 01:05:44,960 Het zal ons een teken, dus alles wat we moeten doen is blijven vragen het bestand, 785 01:05:44,960 --> 01:05:48,440 "Geef mij het volgende teken, geef me het volgende teken, geef me het volgende teken," 786 01:05:48,440 --> 01:05:51,400 tot we bij het einde van het bestand. 787 01:05:51,400 --> 01:05:54,730 En dat zal trekken in een karakter per keer uit ons bestand, 788 01:05:54,730 --> 01:05:56,250 en dan kunnen we doen wat we willen met het. 789 01:05:56,250 --> 01:06:00,160 We kunnen het op te slaan, kunnen we toevoegen aan een string, kunnen we uitprinten. 790 01:06:00,160 --> 01:06:04,630 Heeft een van die. 791 01:06:04,630 --> 01:06:09,600 >> Zoomen weer uit en gaan terug naar onze Cat.C programma, 792 01:06:09,600 --> 01:06:16,170 Als we gaan fgetc te gebruiken, 793 01:06:16,170 --> 01:06:21,710 hoe kunnen wij dit volgende regel code? 794 01:06:21,710 --> 01:06:26,020 We gaan in het gebruik - fread zal iets anders te doen. 795 01:06:26,020 --> 01:06:32,600 En deze keer, we gewoon gaan fgetc te gebruiken om een ​​teken te krijgen op een moment. 796 01:06:32,600 --> 01:06:40,910 Als u een volledige bestand te verwerken, kan wat we moeten doen? 797 01:06:40,910 --> 01:06:44,030 Hoeveel tekens zijn er in een bestand? 798 01:06:44,030 --> 01:06:47,390 Er zijn een heleboel. Dus wilt u waarschijnlijk een te krijgen 799 01:06:47,390 --> 01:06:49,860 en krijgen dan nog een keer en ontvang een keer en ontvang een. 800 01:06:49,860 --> 01:06:53,330 Wat voor soort algoritme denk je dat we zou kunnen hebben om hier te gebruiken? 801 01:06:53,330 --> 01:06:55,470 Welk type -? [Alexander] Een for-lus? >> Precies. 802 01:06:55,470 --> 01:06:57,500 Een soort van lus. 803 01:06:57,500 --> 01:07:03,380 Een lus daadwerkelijk groot is in dit geval. 804 01:07:03,380 --> 01:07:08,620 En zoals je zei, het klinkt alsof je een lus over het hele bestand, 805 01:07:08,620 --> 01:07:11,820 om een ​​teken tegelijk. 806 01:07:11,820 --> 01:07:13,850 Eventuele suggesties over hoe dat eruit zou kunnen zien? 807 01:07:13,850 --> 01:07:22,090 [Alexander, onverstaanbaar] 808 01:07:22,090 --> 01:07:30,050 >> Ok, vertel me in het Engels wat je probeert te doen? [Alexander, onverstaanbaar] 809 01:07:30,050 --> 01:07:36,270 Dus in dit geval, het klinkt alsof we gewoon proberen om lus over het hele bestand. 810 01:07:36,270 --> 01:07:45,330 [Alexander] Dus ik > De omvang van -? 811 01:07:45,330 --> 01:07:49,290 Ik denk dat de grootte van het bestand, toch? De grootte - we zullen gewoon schrijven het zo. 812 01:07:49,290 --> 01:07:57,470 Bestandsgrootte voorlopig, i + +. 813 01:07:57,470 --> 01:08:04,610 Zo blijkt dat de manier waarop u dit doet met behulp van fgetc, en dit is nieuw, 814 01:08:04,610 --> 01:08:10,460 is dat er geen gemakkelijke manier om gewoon de grootte van een bestand 815 01:08:10,460 --> 01:08:16,979 met deze "sizeof" type constructie dat u eerder hebt gezien. 816 01:08:16,979 --> 01:08:20,910 Als we dat fgetc functie te gebruiken, introduceren we een soort van 817 01:08:20,910 --> 01:08:29,069 nieuwe, funky syntaxis van deze for-lus, waar in plaats van met slechts een basis teller 818 01:08:29,069 --> 01:08:33,920 om teken voor teken te gaan, we gaan om een ​​teken te trekken op een moment, 819 01:08:33,920 --> 01:08:37,120 een teken per keer, en de manier waarop we weten dat we aan het eind 820 01:08:37,120 --> 01:08:41,290 wordt niet als we telden een bepaald aantal tekens, 821 01:08:41,290 --> 01:08:49,939 maar als het personage dat we trek, is dat bijzonder einde van het bestand karakter. 822 01:08:49,939 --> 01:08:58,689 Dus we kunnen dit doen door - ik noem dit l, en we gaan het initialiseren 823 01:08:58,689 --> 01:09:08,050 met onze eerste oproep om het eerste teken te halen uit het bestand. 824 01:09:08,050 --> 01:09:14,979 Dus dit deel hier, dit gaat om een ​​teken te krijgen uit het bestand 825 01:09:14,979 --> 01:09:20,840 en opslaan in de variabele ch. 826 01:09:20,840 --> 01:09:25,420 We gaan dit blijven doen tot we bij het einde van het bestand, 827 01:09:25,420 --> 01:09:41,170 Dat doen we door het testen voor het karakter niet gelijk is aan die speciale EOF karakter. 828 01:09:41,170 --> 01:09:48,750 En dan in plaats van het doen van l + +, zou dat net verhogen de waarde, 829 01:09:48,750 --> 01:09:52,710 dus als we lezen een A uit het bestand, een hoofdletter A, zeg, 830 01:09:52,710 --> 01:09:56,810 ch + + zou ons b, en dan zouden we krijgen c en daarna d. 831 01:09:56,810 --> 01:09:59,310 Dat is duidelijk niet wat we willen. Wat we willen hier 832 01:09:59,310 --> 01:10:05,830 in dit laatste stukje is willen we naar het volgende teken te krijgen uit het bestand. 833 01:10:05,830 --> 01:10:09,500 >> Dus hoe kunnen we het volgende teken uit het bestand? 834 01:10:09,500 --> 01:10:13,470 Hoe we het eerste teken te krijgen van het dossier? 835 01:10:13,470 --> 01:10:17,200 [Student] fgetfile? >> Fgetc, of, sorry, je was helemaal gelijk. 836 01:10:17,200 --> 01:10:20,470 Ik verkeerd gespeld het daar. Dus ja. 837 01:10:20,470 --> 01:10:26,240 Hier in plaats van het doen van l + +, 838 01:10:26,240 --> 01:10:29,560 We gaan gewoon naar fgetc (bestand) weer bellen 839 01:10:29,560 --> 01:10:39,180 en sla het resultaat op in onze dezelfde l variabele. 840 01:10:39,180 --> 01:10:43,730 [Student vraag, onverstaanbaar] 841 01:10:43,730 --> 01:10:52,390 >> Dit is waar deze FILE * jongens zijn speciaal. 842 01:10:52,390 --> 01:10:59,070 De manier waarop ze werken is dat ze - wanneer u voor het eerst opent - wanneer u voor het eerst maken dat fopen oproep, 843 01:10:59,070 --> 01:11:04,260 de FILE * fungeert effectief als een pointer naar het begin van het bestand. 844 01:11:04,260 --> 01:11:12,830 En dan elke keer als je belt fgetc, het beweegt een teken door het bestand. 845 01:11:12,830 --> 01:11:23,280 Dus wanneer je dit noemen, je bent het verhogen van de bestands pointer met een teken. 846 01:11:23,280 --> 01:11:26,210 En als je weer fgetc, je verplaatst een ander karakter 847 01:11:26,210 --> 01:11:28,910 en een karakter en een ander karakter en een ander karakter. 848 01:11:28,910 --> 01:11:32,030 [Student vraag, onverstaanbaar] >> En Dat is - ja. 849 01:11:32,030 --> 01:11:34,810 Het is een soort van deze magische onder de motorkap. 850 01:11:34,810 --> 01:11:37,930 Je gewoon blijven verhogen door. 851 01:11:37,930 --> 01:11:46,510 Op dit punt, ben je in staat om daadwerkelijk te werken met een karakter. 852 01:11:46,510 --> 01:11:52,150 Dus hoe kunnen we dit af te drukken op het scherm, nu? 853 01:11:52,150 --> 01:11:58,340 We kunnen gebruik maken van dezelfde printf ding dat we eerder gebruikt. 854 01:11:58,340 --> 01:12:00,330 Dat hebben we gebruik gemaakt van hele semester. 855 01:12:00,330 --> 01:12:05,450 We kunnen printf bellen, 856 01:12:05,450 --> 01:12:21,300 en we kunnen passeren in het teken net als dat. 857 01:12:21,300 --> 01:12:27,430 Een andere manier om het te doen is in plaats van printf en met dit format string te doen, 858 01:12:27,430 --> 01:12:29,490 kunnen we ook gebruik maken van een van de andere functies. 859 01:12:29,490 --> 01:12:40,090 We kunnen gebruik maken fputc, die een karakter u op het scherm, 860 01:12:40,090 --> 01:12:52,580 behalve als we kijken naar fputc - laat me uit te zoomen een beetje. 861 01:12:52,580 --> 01:12:56,430 We zien wat er mooi is duurt het in het karakter dat we lezen met behulp van fgetc, 862 01:12:56,430 --> 01:13:05,100 maar dan moeten we het eens stroom af te drukken op. 863 01:13:05,100 --> 01:13:11,850 We kunnen ook gebruik maken van de putchar functie, die direct te maken aan standaard uit. 864 01:13:11,850 --> 01:13:16,070 Dus er zijn een hele hoop verschillende opties die we kunnen gebruiken voor het afdrukken. 865 01:13:16,070 --> 01:13:19,580 Ze zijn allemaal in de standaard I / O library. 866 01:13:19,580 --> 01:13:25,150 Wanneer u wilt afdrukken - zo printf, standaard, zal afdrukken naar de speciale standaard uit beek, 867 01:13:25,150 --> 01:13:27,910 en dat is dat stdout. 868 01:13:27,910 --> 01:13:41,300 Dus we kunnen alleen maar verwijzen naar het als soort van deze magische waarde, stdout hier. 869 01:13:41,300 --> 01:13:48,410 Oeps. Zet de puntkomma buiten. 870 01:13:48,410 --> 01:13:52,790 >> Dit is een heleboel nieuwe, funky informatie hier. 871 01:13:52,790 --> 01:13:58,600 Veel van deze zeer idiomatisch, in die zin dat dit code 872 01:13:58,600 --> 01:14:05,700 dat is geschreven op deze manier alleen maar omdat het is schoon om te lezen, makkelijk te lezen. 873 01:14:05,700 --> 01:14:11,520 Er zijn veel verschillende manieren om dit te doen, veel verschillende functies die u kunt gebruiken, 874 01:14:11,520 --> 01:14:14,680 maar we hebben de neiging om gewoon dezelfde patronen volgen over en voorbij. 875 01:14:14,680 --> 01:14:20,180 Wees dus niet verbaasd als je ziet code zoals deze komen opnieuw en opnieuw. 876 01:14:20,180 --> 01:14:25,690 Oke. Op dit punt moeten we breken voor de dag. 877 01:14:25,690 --> 01:14:31,300 Bedankt voor het komen. Bedankt voor het kijken als je online bent. En we zien jullie volgende week. 878 01:14:31,300 --> 01:14:33,890 [CS50.TV]