1 00:00:00,000 --> 00:00:02,730 [Powered by Google Translate] [SECȚIUNEA 5: mai puțin confortabilă] 2 00:00:02,730 --> 00:00:05,180 [Nate Hardison, Universitatea Harvard] 3 00:00:05,180 --> 00:00:08,260 [Acest lucru este CS50.] [CS50.TV] 4 00:00:08,260 --> 00:00:11,690 Deci bun venit înapoi, băieți. 5 00:00:11,690 --> 00:00:16,320 Bine ați venit la secțiunea 5. 6 00:00:16,320 --> 00:00:20,220 În acest moment, au absolvit Quiz 0 si ce am vazut cum ai făcut, 7 00:00:20,220 --> 00:00:25,770 sperăm că te simți cu adevărat bine pentru că am fost foarte impresionat de rezultatele din această secțiune. 8 00:00:25,770 --> 00:00:28,050 Pentru telespectatorii noștri on-line, am avut o serie de întrebări 9 00:00:28,050 --> 00:00:33,680 despre ultimele două probleme pe set de probleme - sau pe test, mai degrabă. 10 00:00:33,680 --> 00:00:39,690 Deci, vom trece peste cele foarte repede, astfel încât toată lumea vede ceea ce sa întâmplat 11 00:00:39,690 --> 00:00:45,060 și cum să treacă prin soluția reală, mai degrabă decât vizionează doar soluția în sine. 12 00:00:45,060 --> 00:00:50,330 Vom trece peste ultimele doua probleme foarte repede, 32 și 33. 13 00:00:50,330 --> 00:00:53,240 Doar, din nou, astfel încât telespectatorii pot vedea on-line asta. 14 00:00:53,240 --> 00:00:59,080 >> Dacă îți vei opri la problema ta 32, care se află pe pagina 13, 15 00:00:59,080 --> 00:01:02,730 13 din 16, problema 32 este totul despre swap-urilor. 16 00:01:02,730 --> 00:01:05,010 A fost vorba de pompare două numere întregi. 17 00:01:05,010 --> 00:01:08,740 Este problema cu care ne-am uitat peste de câteva ori în curs. 18 00:01:08,740 --> 00:01:13,590 Și aici, ceea ce ne-au cerut să faci este o urmă de memorie rapidă. 19 00:01:13,590 --> 00:01:17,000 Pentru a completa valorile variabilelor, acestea sunt pe stiva 20 00:01:17,000 --> 00:01:20,250 ca codul trece prin această funcție de swap. 21 00:01:20,250 --> 00:01:24,500 În special, ceea ce ne uitam la - Mă duc să afișezi această iPad jos - 22 00:01:24,500 --> 00:01:29,650 în special, ceea ce căutăm la această linie este numerotată 6 chiar aici. 23 00:01:29,650 --> 00:01:36,740 Și este numerotat 6 pentru doar contiguitate cu problema precedentă. 24 00:01:36,740 --> 00:01:41,720 Ceea ce vrem să facem este afișa sau etichetează starea de memorie 25 00:01:41,720 --> 00:01:46,090 cum este la momentul când am executa acest numar linia 6, 26 00:01:46,090 --> 00:01:52,540 care este efectiv o întoarcere de la funcția de swap nostru chiar aici. 27 00:01:52,540 --> 00:01:59,450 Dacă vom defila în jos aici, am văzut că adresele de tot în memorie au fost furnizate de pentru noi. 28 00:01:59,450 --> 00:02:02,540 Acest lucru este foarte cheie, vom reveni la ea într-o clipă. 29 00:02:02,540 --> 00:02:09,240 Și apoi aici, la partea de jos, am avut o diagramă de memorie mic care vom referi la. 30 00:02:09,240 --> 00:02:12,490 Am făcut de fapt acest lucru pe iPad meu. 31 00:02:12,490 --> 00:02:20,720 Așa că am de gând să alterneze înainte și înapoi între iPad și acest cod doar pentru referință. 32 00:02:20,720 --> 00:02:26,540 >> Să începem. În primul rând, să ne concentrăm asupra primele linii ale principal de aici. 33 00:02:26,540 --> 00:02:30,220 Pentru a începe, vom inițializa x și y la 1 la 2. 34 00:02:30,220 --> 00:02:33,040 Deci avem doua variabile intregi, ei amândoi vor fi plasate pe stiva. 35 00:02:33,040 --> 00:02:36,050 Vom pune un 1 și un 2 în ele. 36 00:02:36,050 --> 00:02:43,150 Deci, dacă am inlocuit cu iPad meu, sper, să vedem - 37 00:02:43,150 --> 00:02:48,660 Apple TV oglindire, și acolo vom merge. Bine. 38 00:02:48,660 --> 00:02:51,670 Deci, dacă am inlocuit cu iPad meu, 39 00:02:51,670 --> 00:02:56,220 Vreau să inițializeze x și y la 1 la 2. 40 00:02:56,220 --> 00:03:00,580 Noi facem asta, pur și simplu de scris un 1 în caseta marcată x 41 00:03:00,580 --> 00:03:07,730 și un 2 în caseta marcată y. Destul de simplu. 42 00:03:07,730 --> 00:03:11,620 Deci, acum să ne întoarcem la laptop, să vedem ce se întâmplă în continuare. 43 00:03:11,620 --> 00:03:15,810 Deci, această linie următor este în cazul în care lucrurile devin complicate. 44 00:03:15,810 --> 00:03:28,110 Trecem adresa lui x și y adresa ca parametrii a și b pentru funcția de swap. 45 00:03:28,110 --> 00:03:32,380 Adresa lui x și y adresa sunt lucruri pe care nu le putem calcula 46 00:03:32,380 --> 00:03:36,360 fără a face referire la acestea glonț arată chiar aici. 47 00:03:36,360 --> 00:03:39,750 Și din fericire, primele două puncte bullet ne spună exact ce răspunsurile sunt. 48 00:03:39,750 --> 00:03:44,740 Adresa lui x în memoria este de 10, iar adresa de y în memoria este de 14. 49 00:03:44,740 --> 00:03:51,870 Deci, acestea sunt valorile care se trecut în cât a și b până sus, în funcție de swap nostru. 50 00:03:51,870 --> 00:04:00,760 Deci, din nou, trecerea inapoi la diagrama noastră, pot scrie un 10 într-un 51 00:04:00,760 --> 00:04:07,400 și un 14 în B. 52 00:04:07,400 --> 00:04:11,610 Acum, acest punct este în cazul în care vom continua cu swap. 53 00:04:11,610 --> 00:04:14,520 Deci, flipping înapoi la laptop nou, 54 00:04:14,520 --> 00:04:21,079 vedem că modul de swap de lucrări este că dereference mai întâi un magazin și rezultatul în tmp. 55 00:04:21,079 --> 00:04:27,650 Deci, operatorul dereference spune, "Hei. Tratați conținutul variabilei o ca o adresă. 56 00:04:27,650 --> 00:04:33,830 Du-te la tot ce este stocat la acea adresa, și încărcați-l. " 57 00:04:33,830 --> 00:04:41,720 Ce poți încărca din variabila va fi stocat în variabila tmp nostru. 58 00:04:41,720 --> 00:04:45,150 Răsturnarea înapoi la iPad. 59 00:04:45,150 --> 00:04:51,690 Dacă mergem la adresa 10, știm că adresa 10 este x varible 60 00:04:51,690 --> 00:04:55,480 pentru că ne-au spus de la punctul nostru de bullet că adresa lui x în memoria este de 10. 61 00:04:55,480 --> 00:05:00,180 Deci putem merge acolo, pentru a primi valoarea de ea, care este de 1, așa cum vom vedea pe iPad nostru, 62 00:05:00,180 --> 00:05:06,300 și încărcați că în tmp. 63 00:05:06,300 --> 00:05:08,250 Din nou, acest lucru nu este conținutul finale. 64 00:05:08,250 --> 00:05:14,350 Vom merge prin și vom ajunge la starea noastră finală a programului de la sfârșitul anului. 65 00:05:14,350 --> 00:05:17,210 Dar acum, avem valoarea 1 stocată în tmp. 66 00:05:17,210 --> 00:05:19,210 >> Și există o întrebare rapidă aici. 67 00:05:19,210 --> 00:05:23,980 [Alexander] este operatorul dereference - asta e doar dreptul de stea în fața variabilei? 68 00:05:23,980 --> 00:05:27,600 Da >>. Deci, operatorul dereference, așa cum ne întoarce la laptop-ul nostru din nou, 69 00:05:27,600 --> 00:05:33,780 este această stea chiar în fața. 70 00:05:33,780 --> 00:05:37,460 În acest sens, este - îl contrasteze cu operatorul de înmulțire 71 00:05:37,460 --> 00:05:42,400 care necesită două lucruri; operatorul dereference este un operator unar. 72 00:05:42,400 --> 00:05:46,130 Doar aplicată la o valoare, spre deosebire de un operator binar, 73 00:05:46,130 --> 00:05:48,810 în cazul în care ați aplica pentru două valori diferite. 74 00:05:48,810 --> 00:05:52,080 Deci, asta e ceea ce se întâmplă în această linie. 75 00:05:52,080 --> 00:05:58,390 Am încărcat valoarea 1 și stocate în ea noastră variabila integer temporară. 76 00:05:58,390 --> 00:06:05,800 Linia următoare, vom păstra conținutul de b în - 77 00:06:05,800 --> 00:06:12,630 sau, mai degrabă, am stoca conținutul pe care b este în care indică locul în care se indică spre o. 78 00:06:12,630 --> 00:06:17,690 Dacă analizăm acest lucru de la dreapta la stânga, vom b dereference, 79 00:06:17,690 --> 00:06:23,580 vom aborda 14, vom apuca întreg care este acolo, 80 00:06:23,580 --> 00:06:26,900 și apoi vom merge la adresa 10, 81 00:06:26,900 --> 00:06:34,240 și am de gând să arunce rezultatul dereference nostru de b în acel spațiu. 82 00:06:34,240 --> 00:06:40,080 Flipping înapoi la iPad nostru, unde putem face acest lucru un pic mai concret, 83 00:06:40,080 --> 00:06:44,070 s-ar putea ajuta dacă am scrie numerele de pe toate adresele de aici. 84 00:06:44,070 --> 00:06:53,820 Deci știm că la y, suntem la adresa 14, x este la adresa 10. 85 00:06:53,820 --> 00:07:00,180 Când vom începe de la b, am dereference b, vom apuca valoarea 2. 86 00:07:00,180 --> 00:07:08,320 Vom apuca această valoare pentru că este valoarea pe care o trăiește, la adresa 14. 87 00:07:08,320 --> 00:07:15,700 Și vom pune în variabila care locuiește la adresa 10, 88 00:07:15,700 --> 00:07:19,160 care este chiar acolo, corespondente x noastre variabile. 89 00:07:19,160 --> 00:07:21,810 Astfel încât să putem face un pic de suprascrierea aici 90 00:07:21,810 --> 00:07:35,380 în cazul în care vom scăpa de 1 noastră și în loc să ne scrie un 2. 91 00:07:35,380 --> 00:07:39,560 Deci, totul e bine și frumos în lume, chiar dacă ne-am x adăugiri acum. 92 00:07:39,560 --> 00:07:44,890 Ne-am păstrat vechea valoare x în variabila tmp nostru. 93 00:07:44,890 --> 00:07:50,210 Deci, putem finaliza swap cu linia următoare. 94 00:07:50,210 --> 00:07:53,030 Flipping înapoi la laptop-ul nostru. 95 00:07:53,030 --> 00:07:58,150 Acum, tot ce rămâne de făcut este să ia conținutul din nostru variabila integer temporară 96 00:07:58,150 --> 00:08:05,630 și le păstrează în variabila care locuiește la adresa pe care b este exploatație. 97 00:08:05,630 --> 00:08:10,230 Deci, vom b dereference în mod eficient pentru a avea acces la variabila 98 00:08:10,230 --> 00:08:14,340 că se află la adresa pe care b deține în ea, 99 00:08:14,340 --> 00:08:19,190 și am de gând să umple valoarea pe care tmp ține în ea. 100 00:08:19,190 --> 00:08:23,280 Răsturnarea înapoi la iPad o dată mai mult. 101 00:08:23,280 --> 00:08:31,290 Eu pot șterge această valoare aici, 2, 102 00:08:31,290 --> 00:08:41,010 și în loc vom copia dreapta 1 în ea. 103 00:08:41,010 --> 00:08:43,059 Apoi următoarea linie care execută, desigur - 104 00:08:43,059 --> 00:08:47,150 dacă ne întoarce la laptop - este asta punctul 6, 105 00:08:47,150 --> 00:08:52,500 care este punctul de la care ne-am dorit să avem diagrama noastră complet completate. 106 00:08:52,500 --> 00:08:58,940 Deci, flipping înapoi la iPad o dată mai mult, doar astfel încât să puteți vedea diagrama de completat, 107 00:08:58,940 --> 00:09:06,610 puteți vedea că avem o 10 într-un, un tanar de 14 de b, 1 la tmp, un 2 în x, și un 1 în y. 108 00:09:06,610 --> 00:09:11,000 Există întrebări despre acest lucru? 109 00:09:11,000 --> 00:09:14,640 Are acest lucru face mai mult sens, după ce a umblat prin el? 110 00:09:14,640 --> 00:09:24,850 Sens mai puțin? Să sperăm că nu. Bine. 111 00:09:24,850 --> 00:09:28,230 >> Pointeri sunt un subiect foarte complicat. 112 00:09:28,230 --> 00:09:33,420 Unul dintre tipii cu care lucrăm are un proverb foarte frecvente: 113 00:09:33,420 --> 00:09:36,590 "Pentru a înțelege indicații, trebuie să înțelegem mai întâi indicii." 114 00:09:36,590 --> 00:09:40,530 Care cred că este foarte adevărat. Ea nu ia un timp să se obișnuiască cu ea. 115 00:09:40,530 --> 00:09:45,360 Tragere la sorți de imagini, tragerea la sorți de diagrame de memorie ca aceasta sunt foarte utile, 116 00:09:45,360 --> 00:09:49,480 și după ce te plimbi prin exemplu, după exemplul după exemplu, 117 00:09:49,480 --> 00:09:54,450 acesta va începe să aibă sens un pic mai mult și simt un pic mai mult și un pic mai mult sens. 118 00:09:54,450 --> 00:10:01,560 În cele din urmă, într-o zi vei avea pe toate complet stăpânit. 119 00:10:01,560 --> 00:10:13,800 Orice întrebări înainte de a trece la urmatoarea problema? Bine. 120 00:10:13,800 --> 00:10:18,840 Deci, vă întoarce la laptop. 121 00:10:18,840 --> 00:10:23,300 Următoarea problemă care o avem este problema numărul 33 pe fisierul I / O. 122 00:10:23,300 --> 00:10:26,350 Mări pe acest bit un pic. 123 00:10:26,350 --> 00:10:28,710 Problema 33 - Da? 124 00:10:28,710 --> 00:10:32,110 >> [Daniel] Tocmai am avut o întrebare rapidă. Aceasta stea, sau asterisc, 125 00:10:32,110 --> 00:10:35,590 se numește dereferencing atunci când utilizați un asterisc înainte. 126 00:10:35,590 --> 00:10:38,820 Cum se numește atunci când utilizați ampersand înainte? 127 00:10:38,820 --> 00:10:43,140 >> Ampersand înainte de a se adresa-de operator. 128 00:10:43,140 --> 00:10:45,880 Deci, haideți să derulați înapoi. 129 00:10:45,880 --> 00:10:49,310 Hopa. Sunt în modul zoom, asa ca nu pot cu adevărat de parcurgere. 130 00:10:49,310 --> 00:10:52,780 Dacă ne uităm la acest cod foarte repede chiar aici, 131 00:10:52,780 --> 00:10:54,980 din nou, același lucru se întâmplă. 132 00:10:54,980 --> 00:10:59,180 Dacă ne uităm la acest cod chiar aici, pe această linie în cazul în care vom face apel la schimb, 133 00:10:59,180 --> 00:11:10,460 ampersand spune doar "să se adresa la care trăiește variabile x." 134 00:11:10,460 --> 00:11:14,460 Atunci când compilatorul compilează codul, 135 00:11:14,460 --> 00:11:20,590 de fapt, trebuie să marcheze un loc fizic în memorie pentru toate variabilele dvs. pentru a trăi. 136 00:11:20,590 --> 00:11:24,910 Și deci ce compilatorul poate face apoi după ce a fost compilat totul, 137 00:11:24,910 --> 00:11:31,110 știe, "Oh, am pus x la adresa 10 mi-am pus y la adresa 14.". 138 00:11:31,110 --> 00:11:34,640 Se poate umple apoi în aceste valori pentru tine. 139 00:11:34,640 --> 00:11:44,740 Astfel încât să puteți apoi - se poate trece apoi acest lucru în trecere și & Y, precum și în. 140 00:11:44,740 --> 00:11:50,730 Tipii ăștia obține adresa, dar ele, de asemenea, atunci când le trece în funcția de swap, 141 00:11:50,730 --> 00:11:55,690 acest tip de informații, aceasta * int chiar aici, spune compilator, 142 00:11:55,690 --> 00:12:01,350 "Bine, vom fi interpretarea această adresă ca adresă a unei variabile integer." 143 00:12:01,350 --> 00:12:05,900 Ca o adresă a unui int, care este diferită de adresa unei variabile caracter 144 00:12:05,900 --> 00:12:09,930 deoarece un int preia, pe o mașină de 32-biți, ocupă 4 octeți de spațiu, 145 00:12:09,930 --> 00:12:13,310 întrucât un personaj doar preia 1 octet de spațiu. 146 00:12:13,310 --> 00:12:17,310 Deci, este important să știți, de asemenea, ceea ce este - ceea ce trăiește, ce tip de valoare 147 00:12:17,310 --> 00:12:20,340 locuiește la adresa care a fost trecut inch 148 00:12:20,340 --> 00:12:22,020 Sau adresa pe care ai de a face cu. 149 00:12:22,020 --> 00:12:29,020 În acest fel, știi câți octeți de informații pentru a încărca de fapt din RAM-ul. 150 00:12:29,020 --> 00:12:31,780 Și apoi, da, acest operator dereference, ca tine au cerut, 151 00:12:31,780 --> 00:12:37,200 merge și accesează informații la o anumită adresă. 152 00:12:37,200 --> 00:12:42,820 Deci se spune, cu această variabilă o aici, să trateze conținutul unui drept o adresă, 153 00:12:42,820 --> 00:12:47,880 du-te la acea adresă, și trageți afară, încărcați în procesor, sarcina într-un registru 154 00:12:47,880 --> 00:12:56,340 valorile reale sau conținutul care locuiesc la acea adresă. 155 00:12:56,340 --> 00:12:59,620 Orice mai multe întrebări? Acestea sunt întrebări bune. 156 00:12:59,620 --> 00:13:01,650 E o mulțime de noi terminologii prea. 157 00:13:01,650 --> 00:13:09,800 Este, de asemenea, un fel de funky, văzând & * și în locuri diferite. 158 00:13:09,800 --> 00:13:13,180 >> Bine. 159 00:13:13,180 --> 00:13:18,530 Deci, înapoi la problema 33, dosar I / O. 160 00:13:18,530 --> 00:13:22,540 Aceasta a fost una dintre acele probleme pe care cred ca o pereche de lucruri sa întâmplat. 161 00:13:22,540 --> 00:13:25,400 Unul, este un subiect destul de nou. 162 00:13:25,400 --> 00:13:30,590 Acesta a fost prezentat destul de repede înainte de test, 163 00:13:30,590 --> 00:13:33,400 și apoi cred că a fost un fel de una dintre aceste probleme sugerate în matematică 164 00:13:33,400 --> 00:13:39,720 în cazul în care ei vă dau o mulțime de informații, dar de fapt nu se termina prin a avea de a utiliza o tona de ea. 165 00:13:39,720 --> 00:13:44,060 Prima parte a acestei probleme este ceea ce descrie un fișier CSV este. 166 00:13:44,060 --> 00:13:50,620 Acum, un fișier CSV, potrivit descrierii, este un valori separate prin virgulă dosar. 167 00:13:50,620 --> 00:13:55,300 Motivul acestea sunt deloc interesante, si motivul pentru care ai folosi vreodată, 168 00:13:55,300 --> 00:14:00,800 este, deoarece, câți dintre voi ați folosit vreodată chestii cum ar fi Excel? 169 00:14:00,800 --> 00:14:03,240 Figura cea mai mare dintre voi au, probabil, sau va folosi la un moment dat în viața dumneavoastră. 170 00:14:03,240 --> 00:14:06,430 Vei folosi ceva de genul Excel. 171 00:14:06,430 --> 00:14:10,940 În scopul de a obține datele dintr-o foaie de calcul Excel sau de a face orice fel de prelucrare cu ea, 172 00:14:10,940 --> 00:14:17,240 în cazul în care ai vrut să scrie un program C sau un program Python, Java programului, 173 00:14:17,240 --> 00:14:20,070 a face cu datele stocate acolo, 174 00:14:20,070 --> 00:14:23,170 una dintre cele mai comune modalități pentru a ieși este într-un fișier CSV. 175 00:14:23,170 --> 00:14:26,850 Și vă puteți deschide Excel și atunci când te duci la "Save As" dialog, 176 00:14:26,850 --> 00:14:32,840 poti scoate un fișier CSV real. 177 00:14:32,840 --> 00:14:35,890 >> La îndemână pentru a ști cum să se ocupe cu aceste lucruri. 178 00:14:35,890 --> 00:14:42,010 Modul în care funcționează este că e similar cu - Adică, e în esență imitandu-o foaie de calcul, 179 00:14:42,010 --> 00:14:47,590 în cazul în care, după cum vom vedea aici, în piesă foarte cea mai din stânga, 180 00:14:47,590 --> 00:14:49,910 avem toate numele de familie. 181 00:14:49,910 --> 00:14:54,670 Deci avem Malan, apoi Hardison, și apoi Bowden, MacWilliam, și apoi Chan. 182 00:14:54,670 --> 00:14:59,470 Toate numele de familie. Și apoi o virgulă separă numele de familie de la primele nume. 183 00:14:59,470 --> 00:15:02,970 David, Nate, Rob, Tommy, și Zamyla. 184 00:15:02,970 --> 00:15:06,850 Am amesteca mereu Robby și Tom. 185 00:15:06,850 --> 00:15:10,940 Și apoi, în cele din urmă, a treia coloană este adresele de e-mail. 186 00:15:10,940 --> 00:15:18,500 Odată ce ați înțeles că, restul programului este destul de simplu să pună în aplicare. 187 00:15:18,500 --> 00:15:23,850 Ceea ce am făcut în scopul de a imita această structură aceeași în programul nostru C 188 00:15:23,850 --> 00:15:27,510 este că am folosit o structură. 189 00:15:27,510 --> 00:15:30,520 Vom începe să joci cu acestea un pic mai mult, de asemenea. 190 00:15:30,520 --> 00:15:35,790 Noi le-am văzut pentru prima pic set de probleme 3, atunci când avem de-a face cu dicționare. 191 00:15:35,790 --> 00:15:40,290 Dar acest struct personalului stochează un nume de familie, un nume în primul rând, și un e-mail. 192 00:15:40,290 --> 00:15:44,500 La fel ca fișier CSV nostru a fost de depozitare. 193 00:15:44,500 --> 00:15:47,950 Deci, aceasta este doar conversia de la un format la altul. 194 00:15:47,950 --> 00:15:54,630 Avem de a converti, în acest caz, o struct personal într-o linie, 195 00:15:54,630 --> 00:15:59,060 o linie separate prin virgulă, la fel ca asta. 196 00:15:59,060 --> 00:16:01,500 Are vreun sens? Voi s-au luat toate test, 197 00:16:01,500 --> 00:16:07,680 așa îmi imaginez ați avut cel puțin un timp să se gândească la asta. 198 00:16:07,680 --> 00:16:16,410 >> În funcția de închiriere, problema ne cere să ne ia în - Vom mări pe acest bit un pic - 199 00:16:16,410 --> 00:16:22,480 ia într-o structură de personal, o struct personal, cu numele lui, 200 00:16:22,480 --> 00:16:30,900 și adăugați conținutul său la dosarul nostru staff.csv. 201 00:16:30,900 --> 00:16:34,230 Se pare că acest lucru este destul de simplu de folosit. 202 00:16:34,230 --> 00:16:37,430 Vom fel de joc cu aceste funcții un pic mai mult azi. 203 00:16:37,430 --> 00:16:44,510 Dar în acest caz, funcția fprintf este într-adevăr cheia. 204 00:16:44,510 --> 00:16:51,960 Deci, cu fprintf, putem imprima, la fel ca și voi ați fost folosind printf acest termen întreg. 205 00:16:51,960 --> 00:16:55,050 Aveți posibilitatea să printf o linie într-un fișier. 206 00:16:55,050 --> 00:16:59,030 Deci, în loc de a face doar în cazul în care apelul de obicei printf vă dau un format al șirului 207 00:16:59,030 --> 00:17:05,380 și apoi înlocuiți toate variabilele cu următoarele argumente, 208 00:17:05,380 --> 00:17:11,290 cu fprintf, argument prima ta este în locul fișierul pe care doriți să scrie. 209 00:17:11,290 --> 00:17:21,170 Dacă ar fi să se uite la acest lucru în aparat, de exemplu, omule fprintf, 210 00:17:21,170 --> 00:17:25,980 putem vedea diferența dintre printf și fprintf. 211 00:17:25,980 --> 00:17:28,960 Voi mări aici un pic. 212 00:17:28,960 --> 00:17:33,140 Deci, cu printf, ne dau un șir format, și apoi argumentele ulterioare 213 00:17:33,140 --> 00:17:37,580 sunt toate variabilele de înlocuire sau substituire în șir format noastră. 214 00:17:37,580 --> 00:17:47,310 Întrucât, cu fprintf, primul argument este într-adevăr acest fișier * numit un curs de apa. 215 00:17:47,310 --> 00:17:51,800 >> Mutarea înapoi aici pentru a ne închiriere, 216 00:17:51,800 --> 00:17:54,550 ne-am luat deja curs de apa noastră * dosarul deschis pentru noi. 217 00:17:54,550 --> 00:17:57,810 Asta e ceea ce face această prima linie, se deschide fișierul staff.csv, 218 00:17:57,810 --> 00:18:01,690 îl deschide în modul de adăugare, și tot ce a mai rămas pentru noi să facem este 219 00:18:01,690 --> 00:18:08,640 scrie structura de personal la dosar. 220 00:18:08,640 --> 00:18:10,870 Și, să vedem, nu vreau să folosesc iPad? 221 00:18:10,870 --> 00:18:17,900 Voi folosi iPad. Avem anulate - Să punem asta pe masă, așa că am să scriu un pic mai bine - 222 00:18:17,900 --> 00:18:33,680 anula închiriere și este nevoie de un singur argument în, o structura de personal numit uri. 223 00:18:33,680 --> 00:18:44,120 Ai bretele noastre, ne-am luat nostru * fișier numit fișier, 224 00:18:44,120 --> 00:18:48,380 avem linia noastra de fopen ne-a dat, 225 00:18:48,380 --> 00:18:51,890 și eu voi scrie doar ca puncte din moment ce este deja în Pedia. 226 00:18:51,890 --> 00:19:00,530 Și apoi pe linia următoarea noastră, vom face un apel la fprintf 227 00:19:00,530 --> 00:19:03,700 și vom trece în fișierul pe care dorim să imprimați, 228 00:19:03,700 --> 00:19:10,290 și apoi șirul formatului nostru, care - 229 00:19:10,290 --> 00:19:14,300 Te las să-mi spuneți voi cum arată. 230 00:19:14,300 --> 00:19:20,500 Cum despre tine, Stella? Știi ce prima parte a format-șir arata ca? 231 00:19:20,500 --> 00:19:24,270 [Stella] Eu nu sunt sigur. >> Nu ezitați să întrebați pe Jimmy. 232 00:19:24,270 --> 00:19:27,690 Știi, Jimmy? 233 00:19:27,690 --> 00:19:31,000 [Jimmy] Ar fi doar ultima? Nu știu. Eu nu sunt în totalitate sigur. 234 00:19:31,000 --> 00:19:39,020 Bine >>. Ce zici, a spus nimeni obține acest corecta asupra examen? 235 00:19:39,020 --> 00:19:41,770 Nu regulă. 236 00:19:41,770 --> 00:19:47,920 Se pare că aici tot ce trebuie să faceți este să ne dorim fiecare parte a structurii personalului nostru 237 00:19:47,920 --> 00:19:53,290 care urmează să fie imprimate ca un șir de caractere în fișier nostru. 238 00:19:53,290 --> 00:19:59,900 Noi folosim doar substituirea de caractere aleatoare de trei ori diferite, pentru că avem un nume de familie 239 00:19:59,900 --> 00:20:07,160 urmat de virgulă, apoi un nume urmat de o virgulă, 240 00:20:07,160 --> 00:20:12,430 și apoi în cele din urmă adresa de email care este urmat - care nu este 241 00:20:12,430 --> 00:20:15,140 montarea pe ecranul meu - dar este urmat de un caracter linie noua. 242 00:20:15,140 --> 00:20:20,060 Așa că am de gând să-l scrie doar acolo. 243 00:20:20,060 --> 00:20:23,560 Și în urma apoi șirul formatului nostru, 244 00:20:23,560 --> 00:20:27,880 avem doar inlocuiri, pe care le accesați folosind notația punct 245 00:20:27,880 --> 00:20:31,370 pe care am văzut-o în setul de probleme 3. 246 00:20:31,370 --> 00:20:48,820 Putem folosi s.last, s.first, și s.email 247 00:20:48,820 --> 00:20:58,990 să substituie în aceste trei valori în șir formatul nostru. 248 00:20:58,990 --> 00:21:06,190 Deci, cum a mers? Asigurați-simț? 249 00:21:06,190 --> 00:21:09,700 Da? Nu? Posibil? Bine. 250 00:21:09,700 --> 00:21:14,180 >> Ultimul lucru pe care o facem după ce ne-am imprimat și după ce am deschis fișierul nostru: 251 00:21:14,180 --> 00:21:17,370 ori de câte ori am deschis un fișier, noi întotdeauna trebuie să vă amintiți să-l închidă. 252 00:21:17,370 --> 00:21:19,430 Pentru că altfel vom ajunge scurgeri de memorie, 253 00:21:19,430 --> 00:21:22,500 folosind până descriptori de fișiere. 254 00:21:22,500 --> 00:21:25,950 Deci, pentru a se închide, pe care funcția nu folosim? Daniel? 255 00:21:25,950 --> 00:21:30,120 [Daniel] fclose? Fclose >>, exact. 256 00:21:30,120 --> 00:21:37,520 Deci, ultima parte a acestei probleme a fost în mod corespunzător închide fișierul, folosind funcția fclose, 257 00:21:37,520 --> 00:21:40,370 care arată ca asta. 258 00:21:40,370 --> 00:21:43,880 Nu prea nebun. 259 00:21:43,880 --> 00:21:46,990 Mișto. 260 00:21:46,990 --> 00:21:49,520 Deci, asta e problema 33 privind testul. 261 00:21:49,520 --> 00:21:52,480 Vom avea cu siguranta mai mult fisier I / O, vine. 262 00:21:52,480 --> 00:21:55,130 Vom face un pic mai mult în curs de astăzi, sau în secțiunea de astăzi, 263 00:21:55,130 --> 00:22:01,710 pentru că asta e ceea ce se întâmplă pentru a forma cea mai mare parte a acestei PSET viitoare. 264 00:22:01,710 --> 00:22:05,020 Să trecem de la testul de la acest punct. Da? 265 00:22:05,020 --> 00:22:10,880 >> [Charlotte]] De ce fclose (fișier) în loc de fclose (staff.csv)? 266 00:22:10,880 --> 00:22:19,100 Ah >>. Pentru că se pare că - așa întrebare, care este unul mare, 267 00:22:19,100 --> 00:22:27,800 de aceea, atunci când scriem fclose, suntem scris fclose (fisier) este variabilă Stele 268 00:22:27,800 --> 00:22:33,680 spre deosebire de numele de fișier, staff.csv? Este corect? Da. 269 00:22:33,680 --> 00:22:39,570 Deci, haideți să aruncăm o privire. Dacă aș reveni la laptop-ul meu, 270 00:22:39,570 --> 00:22:45,040 și să ne uităm la funcția fclose. 271 00:22:45,040 --> 00:22:51,460 Deci, funcția fclose închide un curs de apa si-l ia în pointer la fluxul pe care ne-o dorim pentru a închide, 272 00:22:51,460 --> 00:22:57,010 spre deosebire de numele de fișier real pe care ne-o dorim pentru a închide. 273 00:22:57,010 --> 00:23:01,620 Și aceasta se datorează faptului că în spatele scenei, atunci când face un apel la fopen, 274 00:23:01,620 --> 00:23:12,020 atunci când deschideți un fișier, sunteți de fapt, alocarea de memorie pentru a stoca informații despre fișier. 275 00:23:12,020 --> 00:23:16,380 Deci, aveți indicatorul fișier care conține informații despre fișier, 276 00:23:16,380 --> 00:23:23,080 cum ar fi e deschis, dimensiunea acesteia, în cazul în care vă aflați în prezent în dosar, 277 00:23:23,080 --> 00:23:29,100 astfel încât să puteți face citirea si scrierea apeluri la acel loc special în fișierul. 278 00:23:29,100 --> 00:23:38,060 Ajungi închiderea indicatorul în loc de închiderea numele fișierului. 279 00:23:38,060 --> 00:23:48,990 >> Da? [Daniel] Deci, în scopul de a utiliza închiriere, ați spune - cum se obține datele introduse de utilizator? 280 00:23:48,990 --> 00:23:53,830 Acționează ca fprintf getString în sensul că va aștepta doar pentru datele introduse de utilizator 281 00:23:53,830 --> 00:23:57,180 și vă rog să introduceți acest lucru - sau să așteptați pentru tine de a introduce aceste trei lucruri în? 282 00:23:57,180 --> 00:24:00,480 Sau aveți nevoie pentru a folosi ceva pentru a pune în aplicare închiriat? 283 00:24:00,480 --> 00:24:04,100 Da >>. Deci nu suntem - întrebarea a fost, cum ajungem introduse de utilizator 284 00:24:04,100 --> 00:24:09,220 , în scopul de a pune în aplicare închiriat? Și ceea ce avem aici este apelantului de închiriere, 285 00:24:09,220 --> 00:24:17,690 a trecut în acest struct personal cu toate datele stocate în struct deja. 286 00:24:17,690 --> 00:24:22,990 Deci, fprintf este capabil de a scrie doar că datele direct la fișierul. 287 00:24:22,990 --> 00:24:25,690 Nu e nici o așteptare pentru introduse de utilizator. 288 00:24:25,690 --> 00:24:32,110 Utilizatorul a dat deja introduse de către acesta în mod corespunzător punerea în acest struct personal. 289 00:24:32,110 --> 00:24:36,510 Și lucrurile, bineînțeles, s-ar rupe dacă oricare dintre aceste indicii au fost nule, 290 00:24:36,510 --> 00:24:40,370 asa ca am derula înapoi aici și ne uităm la struct nostru. 291 00:24:40,370 --> 00:24:43,640 Avem șir șir trecut, în primul rând, e-mail șir. 292 00:24:43,640 --> 00:24:48,530 Acum știm că toți cei care într-adevăr, sub capota, sunt variabile char *. 293 00:24:48,530 --> 00:24:53,470 Care poate sau nu poate fi îndreptată la zero. 294 00:24:53,470 --> 00:24:55,800 Ele pot fi zone de memorie pe heap, 295 00:24:55,800 --> 00:24:59,650 Poate că de memorie pe stiva. 296 00:24:59,650 --> 00:25:04,580 Noi nu știm cu adevărat, dar în cazul în care oricare dintre aceste indicii sunt nule, sau nevalabile, 297 00:25:04,580 --> 00:25:08,120 că va prăbuși cu siguranță funcția noastră de închiriere. 298 00:25:08,120 --> 00:25:11,050 Asta a fost ceva care a fost un fel de dincolo de domeniul de aplicare al examenului. 299 00:25:11,050 --> 00:25:16,440 Noi nu suntem griji despre asta. 300 00:25:16,440 --> 00:25:22,170 Mare. Bine. Deci, trecerea de la testul. 301 00:25:22,170 --> 00:25:25,760 >> Să închidem acest tip, și ne vom uita la PSET 4. 302 00:25:25,760 --> 00:25:34,700 Deci, dacă voi uita la spec. PSET, odată ce îl puteți accesa, cs50.net/quizzes, 303 00:25:34,700 --> 00:25:42,730 am de gând să treacă printr-o câteva dintre problemele actuale secțiunea. 304 00:25:42,730 --> 00:25:52,240 Mă derulând în jos - secțiunea de întrebări începe la pagina a treia a spec. PSET. 305 00:25:52,240 --> 00:25:57,800 Și prima parte vă solicită să meargă și să urmăriți scurt reorientare și conducte. 306 00:25:57,800 --> 00:26:02,820 Care a fost un fel de scurtă rece, prezinta cateva trucuri noi, interesante din linia de comandă pe care le puteți utiliza. 307 00:26:02,820 --> 00:26:06,050 Și apoi avem câteva întrebări pentru tine, de asemenea. 308 00:26:06,050 --> 00:26:10,860 Această primă întrebare despre fluxuri, la care printf scrie în mod implicit, 309 00:26:10,860 --> 00:26:15,920 am un fel de atins pe doar un pic acum un moment. 310 00:26:15,920 --> 00:26:22,380 Acest fprintf că am fost doar discutăm ia într-o curs de apa * fișier ca argument. 311 00:26:22,380 --> 00:26:26,580 fclose ia într-o curs de apa * fișier, precum și, 312 00:26:26,580 --> 00:26:32,660 și valoarea returnată de funcția fopen vă oferă un flux de fișier *, de asemenea. 313 00:26:32,660 --> 00:26:36,060 Motivul pentru care nu am văzut pe cei înainte atunci când ne-am ocupat cu printf 314 00:26:36,060 --> 00:26:39,450 se datorează faptului că are printf un flux prestabilit. 315 00:26:39,450 --> 00:26:41,810 Și implicit fluxul de la care se scrie 316 00:26:41,810 --> 00:26:45,190 veți afla despre în scurt. 317 00:26:45,190 --> 00:26:50,080 Deci, să ia cu siguranta o privire la ea. 318 00:26:50,080 --> 00:26:53,010 >> În secțiunea de astăzi, vom vorbi un pic despre GDB, 319 00:26:53,010 --> 00:26:57,720 deoarece mai familiar ești cu ea, practica mai mult te cu ea, 320 00:26:57,720 --> 00:27:01,390 mai în măsură veți fi de fapt în jos pentru a vâna bug-uri din propriul cod. 321 00:27:01,390 --> 00:27:05,540 Acest proces accelereaza de depanare la extrem. 322 00:27:05,540 --> 00:27:09,230 Deci, prin utilizarea printf, de fiecare dată când face asta va trebui să recompilați codul, 323 00:27:09,230 --> 00:27:13,000 trebuie să-l rulați din nou, uneori, va trebui să mutați în jurul valorii de apel printf, 324 00:27:13,000 --> 00:27:17,100 comentați cod, este nevoie de doar un timp. 325 00:27:17,100 --> 00:27:20,850 Scopul nostru este de a încerca și vă convingă că cu GDB, în esență, puteți 326 00:27:20,850 --> 00:27:26,810 printf ceva în orice punct din codul dvs. și nu va mai trebui să-l recompilați. 327 00:27:26,810 --> 00:27:35,120 Niciodată nu trebuie să înceapă și să păstreze ghicitul unde să printf următoare. 328 00:27:35,120 --> 00:27:40,910 Primul lucru de făcut este de a copia această linie și să obțină codul sectiune off a web. 329 00:27:40,910 --> 00:27:47,530 Sunt copierea această linie de cod care spune, "http://cdn.cs50.net wget". 330 00:27:47,530 --> 00:27:49,510 Am de gând să-l copiați. 331 00:27:49,510 --> 00:27:55,950 Am de gând să merg pe la aparatul meu, zoom out astfel încât să puteți vedea ce fac, 332 00:27:55,950 --> 00:28:01,890 lipirea-l acolo, si cand l-am lovit Enter, aceasta comanda wget literalmente este un web obține. 333 00:28:01,890 --> 00:28:06,210 Se va trage în jos acest fișier de pe Internet, 334 00:28:06,210 --> 00:28:11,790 și o să-l salvați în directorul curent. 335 00:28:11,790 --> 00:28:21,630 Acum, dacă am lista mea de directorul curent, puteți vedea că am luat acest fișier section5.zip chiar acolo. 336 00:28:21,630 --> 00:28:25,260 Mod de a face cu tipul ăla este să-l dezarhivați, 337 00:28:25,260 --> 00:28:27,650 pe care le puteți face în linia de comandă, la fel ca asta. 338 00:28:27,650 --> 00:28:31,880 Section5.zip. 339 00:28:31,880 --> 00:28:36,980 Asta va dezarhivati, creați folderul pentru mine, 340 00:28:36,980 --> 00:28:40,410 umfla tot conținutul, le-a pus acolo. 341 00:28:40,410 --> 00:28:47,410 Asa ca acum pot merge în mea secțiunea 5 director folosind comanda cd. 342 00:28:47,410 --> 00:28:58,310 Goliți ecran utilizând clar. Deci, clar ecranul. 343 00:28:58,310 --> 00:29:02,280 Acum am luat un terminal de frumos curat pentru a face față. 344 00:29:02,280 --> 00:29:06,200 >> Acum, dacă am lista cu toate fișierele care văd în acest director, 345 00:29:06,200 --> 00:29:12,270 vezi ca am patru fișiere: buggy1, buggy2, buggy3, și buggy4. 346 00:29:12,270 --> 00:29:16,180 Am, de asemenea, fișierele lor corespunzătoare. C.. 347 00:29:16,180 --> 00:29:20,400 Noi nu te vom uita la fișierele. C timp de acum. 348 00:29:20,400 --> 00:29:24,140 În schimb, am de gând să le folosească atunci când ne deschidem GDB. 349 00:29:24,140 --> 00:29:28,220 Le-am păstrat în jurul valorii de astfel încât să avem acces la codul sursă reală atunci când suntem utilizați GDB, 350 00:29:28,220 --> 00:29:32,740 dar scopul acestei părți a secțiunii este să se joace în jurul valorii de cu GDB 351 00:29:32,740 --> 00:29:40,370 și să vedem cum putem folosi pentru a afla ce se întâmplă în neregulă cu fiecare dintre aceste programe buggy patru. 352 00:29:40,370 --> 00:29:43,380 Deci, suntem doar de gând să în jurul valorii de camera foarte repede, 353 00:29:43,380 --> 00:29:47,000 și am de gând să întreb pe cineva pentru a rula unul dintre programele buggy, 354 00:29:47,000 --> 00:29:54,730 și apoi vom merge ca un grup prin GDB, și vom vedea ce putem face pentru a remedia aceste programe, 355 00:29:54,730 --> 00:29:58,460 sau cel puțin a identifica ce se întâmplă greșit în fiecare dintre ele. 356 00:29:58,460 --> 00:30:04,760 Să începem aici cu Daniel. Va rula buggy1? Să vedem ce se întâmplă. 357 00:30:04,760 --> 00:30:09,470 [Daniel] Se spune că e un defect cerere. Da >>. Exact. 358 00:30:09,470 --> 00:30:12,460 Deci, dacă am alerga buggy1, I a lua o defecțiune seg. 359 00:30:12,460 --> 00:30:16,210 În acest moment, am putea merge și deschide buggy1.c, 360 00:30:16,210 --> 00:30:19,450 încercați și dau seama ce se întâmplă greșit, 361 00:30:19,450 --> 00:30:22,000 dar unul dintre lucrurile cele mai enervante despre această eroare vina seg 362 00:30:22,000 --> 00:30:27,610 este că nu-ți spun pe ce linie a programului de fapt, lucrurile au mers prost și rupt. 363 00:30:27,610 --> 00:30:29,880 Ai cam trebui să se uite la codul 364 00:30:29,880 --> 00:30:33,990 și dau seama de utilizarea presupunere și să verificați sau printf pentru a vedea ce se întâmplă greșit. 365 00:30:33,990 --> 00:30:37,840 Unul dintre cele mai cool lucruri despre GDB este că e foarte, foarte usor 366 00:30:37,840 --> 00:30:42,170 să dau seama linia de la care se blochează de program. 367 00:30:42,170 --> 00:30:46,160 E cu totul merită să-l folosească, chiar dacă doar pentru asta. 368 00:30:46,160 --> 00:30:56,190 Deci, pentru a boot-up GDB, tip I GDB, iar apoi am da drumul la executabil pe care vreau să fug. 369 00:30:56,190 --> 00:31:01,960 Aici am tastarea gdb ./buggy1. 370 00:31:01,960 --> 00:31:06,600 Apăsați Enter. Dă-mi toate aceste informații de copyright, 371 00:31:06,600 --> 00:31:13,000 și aici veți vedea această linie care spune, "simboluri citirea de pe / home / 372 00:31:13,000 --> 00:31:17,680 jharvard/section5/buggy1. " 373 00:31:17,680 --> 00:31:22,060 Și dacă totul merge bine, vei vedea imprima un mesaj care arata ca acest lucru. 374 00:31:22,060 --> 00:31:25,500 Va citi simboluri, acesta va spune "Eu citesc simboluri din fișierul executabil dumneavoastră," 375 00:31:25,500 --> 00:31:29,900 și apoi va avea această "făcut" mesajul aici. 376 00:31:29,900 --> 00:31:35,410 Dacă vedeți unele variații alte de acest lucru, sau dacă vezi că nu a putut găsi simbolurile 377 00:31:35,410 --> 00:31:41,460 sau ceva de genul asta, ceea ce înseamnă că este faptul că pur și simplu nu s-au compilat executabil dumneavoastră în mod corespunzător. 378 00:31:41,460 --> 00:31:49,980 Când ne-am compila programe pentru utilizarea cu GDB, trebuie să ne folosim de pavilion special care-g, 379 00:31:49,980 --> 00:31:54,540 și că a făcut în mod implicit, dacă compila programele, doar prin tastarea face 380 00:31:54,540 --> 00:31:59,320 sau de a face sau de a face buggy recupera, oricare dintre cele. 381 00:31:59,320 --> 00:32:07,800 Dar dacă sunteți compilați manual cu zăngănit, atunci va trebui să mergi și să includă faptul că-g pavilion. 382 00:32:07,800 --> 00:32:10,310 >> În acest moment, acum că ne-am nostru GDB prompte, 383 00:32:10,310 --> 00:32:12,310 e destul de simplu pentru a rula programul. 384 00:32:12,310 --> 00:32:19,740 Am posibilitatea să tastați, fie a alerga, sau putem chiar tip R. 385 00:32:19,740 --> 00:32:22,820 Cele mai multe comenzi GDB poate fi trunchiat. 386 00:32:22,820 --> 00:32:25,940 De obicei, la doar una sau câteva litere, care este destul de frumos. 387 00:32:25,940 --> 00:32:30,980 Deci Saad, dacă tastați r și apăsați Enter, ce se întâmplă? 388 00:32:30,980 --> 00:32:39,390 [Saad] Am SIGSEGV, eroare de segmentare, și apoi toată această bolboroseală. 389 00:32:39,390 --> 00:32:43,650 Da >>. 390 00:32:43,650 --> 00:32:47,990 Ca ne vedem pe ecran chiar acum, și la fel ca Saad a spus, 391 00:32:47,990 --> 00:32:53,430 atunci când am tip rula sau R și apăsați Enter, vom obține în continuare vina segmentul aceeași. 392 00:32:53,430 --> 00:32:55,830 Deci, folosind GDB nu rezolvă problema noastră. 393 00:32:55,830 --> 00:32:59,120 Dar ea ne dă ceva neinteligibil, și se pare că această bolboroseală 394 00:32:59,120 --> 00:33:03,080 de fapt, ne spune în cazul în care se întâmplă. 395 00:33:03,080 --> 00:33:10,680 Pentru a analiza acest bit un pic, acest bit este primul funcția în care totul se întâmplă greșit. 396 00:33:10,680 --> 00:33:20,270 Nu e __ strcmp_sse4_2, și ne spune că aceasta se întâmplă în acest fișier 397 00:33:20,270 --> 00:33:29,450 numit sysdeps/i386, toate acestea, din nou, un fel de mizerie - dar linia 254. 398 00:33:29,450 --> 00:33:31,670 Asta e un fel de greu de analizat. De obicei, când vezi chestii de genul asta, 399 00:33:31,670 --> 00:33:38,770 ceea ce înseamnă că este SEG Faulting într-una dintre bibliotecile de sistem. 400 00:33:38,770 --> 00:33:43,220 Deci, ceva de-a face cu strcmp. Voi ați văzut strcmp înainte. 401 00:33:43,220 --> 00:33:52,730 Nu prea nebun, dar acest lucru înseamnă că strcmp este rupt sau că există o problemă cu strcmp? 402 00:33:52,730 --> 00:33:57,110 Ce crezi, Alexander? 403 00:33:57,110 --> 00:34:04,890 [Alexander] E - 254 este linia? Și - nu binar, dar nu e plafoanele lor, 404 00:34:04,890 --> 00:34:10,590 și apoi există o altă limbă pentru fiecare funcție. Este faptul că 254 din această funcție, sau -? 405 00:34:10,590 --> 00:34:21,460 >> E linia 254. Se pare ca in acest dosar. Lui, așa că de cod de asamblare, probabil. 406 00:34:21,460 --> 00:34:25,949 >> Dar, cred că lucrul mult mai presant este, pentru că am ajuns o defecțiune seg, 407 00:34:25,949 --> 00:34:29,960 si se pare ca vine de la funcția strcmp, 408 00:34:29,960 --> 00:34:38,030 face acest lucru implică, atunci, că strcmp este spart? 409 00:34:38,030 --> 00:34:42,290 Acesta nu ar trebui, să sperăm. Deci, doar pentru că aveți o eroare de segmentare 410 00:34:42,290 --> 00:34:49,480 într-una din funcțiile de sistem, de obicei, asta înseamnă că tu nu l-au numit în mod corect. 411 00:34:49,480 --> 00:34:52,440 Cel mai rapid lucru de făcut pentru a descoperi ce se întâmplă de fapt pe 412 00:34:52,440 --> 00:34:55,500 când vezi ceva nebunesc ca asta, ori de câte ori veți vedea un defect seg, 413 00:34:55,500 --> 00:34:59,800 mai ales dacă aveți un program care folosește mai mult decât principal, 414 00:34:59,800 --> 00:35:03,570 este de a utiliza un backtrace. 415 00:35:03,570 --> 00:35:13,080 Am abrevierea backtrace de scris bt, spre deosebire de cuvântul backtrace completă. 416 00:35:13,080 --> 00:35:16,510 Dar Charlotte, ce se întâmplă când introduceți BT și apăsați Enter? 417 00:35:16,510 --> 00:35:23,200 [Charlotte] Ea îmi arată două linii, 0 linie și linia 1. 418 00:35:23,200 --> 00:35:26,150 Da >>. Deci, linia 0 si linia 1. 419 00:35:26,150 --> 00:35:34,560 Acestea sunt cadrele reale stivei, care au fost în prezent în joc, atunci când programul sa prăbușit. 420 00:35:34,560 --> 00:35:42,230 Pornind de la cel mai de sus rama, cadru 0, și merge la partea de jos mai-, care este cadrul 1. 421 00:35:42,230 --> 00:35:45,140 Cadru noastră cea mai de sus este cadru strcmp. 422 00:35:45,140 --> 00:35:50,080 Vă puteți gândi la acest lucru ca la această problemă similară am fost doar faci pe testul cu pointerii, 423 00:35:50,080 --> 00:35:54,890 în cazul în care ne-am schimba rama teancul în partea de sus a cadrului stivă principal, 424 00:35:54,890 --> 00:35:59,700 si am avut variabilele care a fost de swap utilizând pe partea de sus a variabilelor care principalul a fost folosind. 425 00:35:59,700 --> 00:36:08,440 Aici accident noastră sa întâmplat în funcția noastră strcmp, care a fost numit de către funcția nostru principal, 426 00:36:08,440 --> 00:36:14,370 și backtrace este oferindu-ne nu numai funcțiile în care lucrurile eșuat, 427 00:36:14,370 --> 00:36:16,440 dar este, de asemenea, ne spune în cazul în care totul a fost sunat din. 428 00:36:16,440 --> 00:36:18,830 Deci, dacă am parcurge peste un pic mai la dreapta, 429 00:36:18,830 --> 00:36:26,110 putem vedea că da, am fost pe linia 254 din acest fisier strcmp-sse4.s. 430 00:36:26,110 --> 00:36:32,540 Dar apelul a fost făcut la buggy1.c, linia 6. 431 00:36:32,540 --> 00:36:35,960 Asta înseamnă că putem face - este putem merge doar verifica afară și a vedea ce se întâmplă pe 432 00:36:35,960 --> 00:36:39,930 la buggy1.c, linia 6. 433 00:36:39,930 --> 00:36:43,780 Din nou, există două moduri de a face acest lucru. Una este de a ieși din GDB 434 00:36:43,780 --> 00:36:49,460 sau au codul deschide în altă fereastră și referință încrucișată. 435 00:36:49,460 --> 00:36:54,740 Faptul că, în sine, este destul de la îndemână pentru că acum, dacă ești la ore de birou 436 00:36:54,740 --> 00:36:57,220 și le-ați luat un defect segment si TF dumneavoastră se întreabă unde totul a fost de rupere, 437 00:36:57,220 --> 00:36:59,710 vă pot spune doar, "Oh, linia 6. Nu știu ce se întâmplă, 438 00:36:59,710 --> 00:37:03,670 dar ceva despre linia de 6 este cauza programul meu pentru a rupe. " 439 00:37:03,670 --> 00:37:10,430 Un alt mod de a face acest lucru este ca poti folosi aceasta comanda numita listă în GDB. 440 00:37:10,430 --> 00:37:13,650 Puteți, de asemenea, cu abrevierea L. 441 00:37:13,650 --> 00:37:18,910 Deci, dacă ne-am lovit eu, ce am ajuns aici? 442 00:37:18,910 --> 00:37:21,160 Avem o grămadă de chestii ciudate. 443 00:37:21,160 --> 00:37:26,030 Acesta este codul de asamblare real 444 00:37:26,030 --> 00:37:29,860 care este în strcmp_sse4_2. 445 00:37:29,860 --> 00:37:32,440 Acest lucru arată un fel de funky, 446 00:37:32,440 --> 00:37:36,520 și motivul pentru care suntem obtinerea acest lucru este pentru că acum, 447 00:37:36,520 --> 00:37:40,160 GDB noi are în cadru 0. 448 00:37:40,160 --> 00:37:43,070 >> Deci, oricând ne uităm la variabile, orice moment ne uităm la codul sursă, 449 00:37:43,070 --> 00:37:50,530 ne uitam la codul sursă care se referă la cadrul de stiva suntem în prezent inch 450 00:37:50,530 --> 00:37:53,200 Deci, în scopul de a obține ceva semnificativ, trebuie să ne 451 00:37:53,200 --> 00:37:57,070 a trece la un cadru stivă care face mai mult sens. 452 00:37:57,070 --> 00:38:00,180 În acest caz, cadrul principal de stivă ar avea sens un pic mai mult, 453 00:38:00,180 --> 00:38:02,680 pentru că a fost de fapt codul pe care am scris. 454 00:38:02,680 --> 00:38:05,330 Nu strcmp codul. 455 00:38:05,330 --> 00:38:08,650 Modul în care se pot deplasa între cadre, în acest caz, pentru că avem două, 456 00:38:08,650 --> 00:38:10,430 avem 0 și 1, 457 00:38:10,430 --> 00:38:13,650 faci asta cu sus și în jos comenzi. 458 00:38:13,650 --> 00:38:18,480 Dacă aș muta în sus un cadru, 459 00:38:18,480 --> 00:38:21,770 acum eu sunt în cadrul stivă principal. 460 00:38:21,770 --> 00:38:24,330 Pot să vă deplasa în jos pentru a merge înapoi de unde am fost, 461 00:38:24,330 --> 00:38:32,830 du-te din nou, du-te jos din nou, și du-te din nou. 462 00:38:32,830 --> 00:38:39,750 Dacă veți face vreodată programul dumneavoastră în GDB, veți obține un accident, te backtrace, 463 00:38:39,750 --> 00:38:42,380 și veți vedea că este în unele fișier pe care nu știi ce se întâmplă. 464 00:38:42,380 --> 00:38:45,460 Ai încercat listă, codul nu arata familiar pentru tine, 465 00:38:45,460 --> 00:38:48,150 să ia o privire la cadre de dvs. și dau seama unde te afli. 466 00:38:48,150 --> 00:38:51,010 Esti, probabil, în cadrul stivă greșit. 467 00:38:51,010 --> 00:38:58,760 Sau, cel puțin ești într-un cadru stivă care nu este una care se poate depana cu adevarat. 468 00:38:58,760 --> 00:39:03,110 Acum că suntem în cadrul stivă caz, suntem în principal, 469 00:39:03,110 --> 00:39:08,100 acum putem folosi comanda listă să dau seama ce a fost linia. 470 00:39:08,100 --> 00:39:13,590 Și puteți să-l vedeți, îl tipărite pentru noi chiar aici. 471 00:39:13,590 --> 00:39:19,470 Dar putem lovi lista toate la fel, și lista ne dă această imprimare frumos 472 00:39:19,470 --> 00:39:23,920 din codul sursă reală ce se intampla pe aici. 473 00:39:23,920 --> 00:39:26,420 >> În special, ne putem uita la linia 6. 474 00:39:26,420 --> 00:39:29,330 Putem vedea ce se întâmplă pe aici. 475 00:39:29,330 --> 00:39:31,250 Si se pare ca facem o comparație șir 476 00:39:31,250 --> 00:39:41,050 între șirul de caractere "CS50 roci" și argv [1]. 477 00:39:41,050 --> 00:39:45,700 Ceva despre acest lucru a fost crashing. 478 00:39:45,700 --> 00:39:54,120 Deci Missy, nu aveți gânduri cu privire la ce s-ar putea intampla aici? 479 00:39:54,120 --> 00:39:59,400 [Missy] Nu stiu de ce se crashing. Tu >> Nu stiu de ce e crashing? 480 00:39:59,400 --> 00:40:02,700 Jimmy, orice fel de gânduri? 481 00:40:02,700 --> 00:40:06,240 [Jimmy] Eu nu sunt în totalitate sigur, dar ultima dată când am folosit string compara, 482 00:40:06,240 --> 00:40:10,260 sau strcmp, am avut trei cazuri diferite, la fel ca în cadrul acestuia. 483 00:40:10,260 --> 00:40:12,800 Noi nu am avut un ==, nu cred că, chiar în acea prima linie. 484 00:40:12,800 --> 00:40:16,700 În schimb, a fost separat în trei, iar unul a fost == 0, 485 00:40:16,700 --> 00:40:19,910 unul a fost <0, cred, și unul a fost> 0. 486 00:40:19,910 --> 00:40:22,590 Deci, poate ceva de genul asta? Da >>. Deci, există această problemă 487 00:40:22,590 --> 00:40:27,200 din facem comparația corect? 488 00:40:27,200 --> 00:40:31,660 Stella? Orice gânduri? 489 00:40:31,660 --> 00:40:38,110 [Stella] Eu nu sunt sigur. >> Nu sunt sigur. Daniel? Gânduri? Bine. 490 00:40:38,110 --> 00:40:44,770 Se pare că ceea ce se întâmplă aici este atunci când am fugit programului 491 00:40:44,770 --> 00:40:48,370 și ne-am vina seg, atunci când a fugit programul pentru prima dată, Daniel, 492 00:40:48,370 --> 00:40:50,800 i-ai da orice argumente de linie de comandă? 493 00:40:50,800 --> 00:40:58,420 [Daniel] Nr >> Nr În acest caz, ceea ce este valoarea de argv [1]? 494 00:40:58,420 --> 00:41:00,920 >> Nu există nici o valoare. Corect >>. 495 00:41:00,920 --> 00:41:06,120 Ei bine, nu există nici o valoare șir corespunzătoare. 496 00:41:06,120 --> 00:41:10,780 Dar există o anumită valoare. Care este valoarea pe care se depoziteaza acolo? 497 00:41:10,780 --> 00:41:15,130 O valoare >> gunoi? >> E fie o valoare de gunoi sau, în acest caz, 498 00:41:15,130 --> 00:41:19,930 sfârșitul matrice argv este întotdeauna terminat cu null. 499 00:41:19,930 --> 00:41:26,050 Deci, ceea ce de fapt a fost stocat acolo este nulă. 500 00:41:26,050 --> 00:41:30,810 Alt mod de a rezolva acest lucru, mai degrabă decât gândindu-se că prin, 501 00:41:30,810 --> 00:41:33,420 este să încercați să-l imprimați. 502 00:41:33,420 --> 00:41:35,880 Acest lucru este în cazul în care spuneam că folosind GDB este mare, 503 00:41:35,880 --> 00:41:40,640 deoarece aveți posibilitatea să imprimați toate variabilele, toate valorile pe care doriți 504 00:41:40,640 --> 00:41:43,230 folosirea acestui îndemână dandy-comanda p. 505 00:41:43,230 --> 00:41:48,520 Deci, dacă am tastați p și apoi am tastați valoarea unei variabile sau numele unei variabile, 506 00:41:48,520 --> 00:41:55,320 spun, argc, văd că argc este 1. 507 00:41:55,320 --> 00:42:01,830 Dacă vreau să imprime argv [0], pot face acest lucru la fel ca asta. 508 00:42:01,830 --> 00:42:04,840 Și cum am văzut, argv [0] este întotdeauna numele programului, 509 00:42:04,840 --> 00:42:06,910 întotdeauna numele executabilului. 510 00:42:06,910 --> 00:42:09,740 Aici vei vedea că are numele calea completă. 511 00:42:09,740 --> 00:42:15,920 Eu pot imprima de asemenea, argv [1] și a vedea ce se întâmplă. 512 00:42:15,920 --> 00:42:20,890 >> Aici avem acest tip de valoare mistică. 513 00:42:20,890 --> 00:42:23,890 Avem această 0x0. 514 00:42:23,890 --> 00:42:27,850 Amintiți-vă de la începutul termenului atunci când am vorbit despre numere hexazecimale? 515 00:42:27,850 --> 00:42:34,680 Sau această întrebare puțin la sfârșitul PSET 0 despre cum să reprezinte 50 în hexazecimal? 516 00:42:34,680 --> 00:42:39,410 Modul în care ne scrie numere hex din CS, nu doar pentru a ne confunda 517 00:42:39,410 --> 00:42:46,080 cu numere zecimale, este că noi întotdeauna le prefixul 0x cu. 518 00:42:46,080 --> 00:42:51,420 Deci, acest prefix 0x întotdeauna doar înseamnă interpreteze următorul număr ca număr hexazecimal, 519 00:42:51,420 --> 00:42:57,400 nu ca un șir de caractere, nu ca un număr zecimal, nu ca un număr binar. 520 00:42:57,400 --> 00:43:02,820 Deoarece numărul 5-0 este un număr valid în hexazecimal. 521 00:43:02,820 --> 00:43:06,240 Și este un număr în zecimal, 50. 522 00:43:06,240 --> 00:43:10,050 Deci, aceasta este doar modul în care ambiguitatea. 523 00:43:10,050 --> 00:43:14,860 Deci, 0x0 mijloace hexazecimal 0, care este, de asemenea, zecimal 0, binare 0. 524 00:43:14,860 --> 00:43:17,030 E doar valoarea 0. 525 00:43:17,030 --> 00:43:22,630 Se pare că acest lucru este ceea ce este nul, de fapt, în memorie. 526 00:43:22,630 --> 00:43:25,940 Null este doar 0. 527 00:43:25,940 --> 00:43:37,010 Aici, elementul stocate la argv [1] este nul. 528 00:43:37,010 --> 00:43:45,220 Deci, noi încercăm să compare noastră "CS50 pietre" string într-un șir nul. 529 00:43:45,220 --> 00:43:48,130 Dereferencing Deci null, încercarea de a accesa lucruri de la zero, 530 00:43:48,130 --> 00:43:55,050 cei care sunt, de obicei va provoca un fel de eroare de segmentare sau de alte lucruri rele să se întâmple. 531 00:43:55,050 --> 00:43:59,350 Și se dovedește că nu strcmp verificați pentru a vedea 532 00:43:59,350 --> 00:44:04,340 indiferent dacă sunt sau nu ați trecut intr-o valoare care este nulă. 533 00:44:04,340 --> 00:44:06,370 Mai degrabă, doar merge mai departe, incearca sa-si faca treaba, 534 00:44:06,370 --> 00:44:14,640 și în cazul în care SEG defecte, aceasta SEG defecte, si e problema ta. Trebuie să te duci repara. 535 00:44:14,640 --> 00:44:19,730 Foarte repede, cum am putea rezolva această problemă? Charlotte? 536 00:44:19,730 --> 00:44:23,540 [Charlotte] Puteți verifica dacă ajutorul. 537 00:44:23,540 --> 00:44:32,240 Deci, dacă argv [1] este nul, == 0, atunci intoarce 1, sau ceva de genul [neinteligibil]. 538 00:44:32,240 --> 00:44:34,590 Da >>. Așa că e un mod grozav de a face acest lucru, după cum putem verifica pentru a vedea, 539 00:44:34,590 --> 00:44:39,230 valoarea suntem pe cale de a trece în strcmp, argv [1], este nul? 540 00:44:39,230 --> 00:44:45,830 Dacă e nul, atunci putem spune regulă, anulează. 541 00:44:45,830 --> 00:44:49,450 >> O modalitate mai comună de a face acest lucru este de a utiliza valoarea argc. 542 00:44:49,450 --> 00:44:52,040 Puteți vedea chiar aici, la începutul anului principal, 543 00:44:52,040 --> 00:44:58,040 am omis faptul că primul test pe care le facem de obicei, atunci când vom folosi argumente din linia de comandă, 544 00:44:58,040 --> 00:45:05,240 care este de a testa dacă este sau nu o valoare nostru argc este ceea ce ne așteptăm. 545 00:45:05,240 --> 00:45:10,290 În acest caz, ne asteptam cel puțin două argumente, 546 00:45:10,290 --> 00:45:13,660 numele programului plus celălalt. 547 00:45:13,660 --> 00:45:17,140 Pentru ca suntem pe cale de a utiliza al doilea argument chiar aici. 548 00:45:17,140 --> 00:45:21,350 Având în așa un fel de test în prealabil, înainte de apelul nostru strcmp 549 00:45:21,350 --> 00:45:37,390 că testele sau nu argv este de cel puțin 2, ar face, de asemenea, același tip de lucru. 550 00:45:37,390 --> 00:45:40,620 Putem vedea în cazul în care acționează prin rularea programului din nou. 551 00:45:40,620 --> 00:45:45,610 Puteți reporni oricând programul în cadrul GDB, ceea ce este foarte frumos. 552 00:45:45,610 --> 00:45:49,310 Puteți rula, și atunci când treci în argumente la programul dvs., 553 00:45:49,310 --> 00:45:53,060 le treci în când sunați fugi, nu atunci când cizme sus GDB. 554 00:45:53,060 --> 00:45:57,120 În acest fel puteți să vă păstrați invocând programul dvs. cu argumente diferite de fiecare dată. 555 00:45:57,120 --> 00:46:08,080 Deci alerga, sau din nou, pot Type R, și să vedem ce se întâmplă dacă am scrie "hello". 556 00:46:08,080 --> 00:46:11,140 Se va cere întotdeauna dacă doriți să-l porniți din nou de la început. 557 00:46:11,140 --> 00:46:17,490 De obicei, tu vrei să-l înceapă de la început din nou. 558 00:46:17,490 --> 00:46:25,010 Și la acest punct, se repornește din nou, se imprimă 559 00:46:25,010 --> 00:46:28,920 programul care nu mai avem, buggy1, cu argumentul salut, 560 00:46:28,920 --> 00:46:32,720 și se imprimă asta de iarnă, se spune, "Ai un D," fata trista. 561 00:46:32,720 --> 00:46:37,610 Dar noi nu am SEG vina. Acesta a spus că procesul de ieșit în mod normal. 562 00:46:37,610 --> 00:46:39,900 Deci, care arata destul de bine. 563 00:46:39,900 --> 00:46:43,050 Nu mai vina segment, am facut-o din trecut, 564 00:46:43,050 --> 00:46:48,190 astfel încât se pare că a fost într-adevăr bug vina segmentul pe care am fost obtinerea. 565 00:46:48,190 --> 00:46:51,540 Din păcate, ne spune că vom obține un D. 566 00:46:51,540 --> 00:46:54,090 >> Putem merge înapoi și uita-te la codul și să vedem ce se întâmplă pe acolo 567 00:46:54,090 --> 00:46:57,980 să dau seama ce a fost - de ce ne-a spus că avem un D. 568 00:46:57,980 --> 00:47:03,690 Să vedem, aici a fost acest printf spune că ai un D. 569 00:47:03,690 --> 00:47:08,540 Dacă ne tip listă, după cum vă păstrați lista tastați, se păstrează în jos, prin iterarea programul tău, 570 00:47:08,540 --> 00:47:10,940 asa ca voi arata primele linii ale programului. 571 00:47:10,940 --> 00:47:15,450 Apoi, vom arăta următoarele câteva rânduri, și bucată următoare și următoare bucată. 572 00:47:15,450 --> 00:47:18,240 Și o să încercăm în continuare să meargă în jos. 573 00:47:18,240 --> 00:47:21,180 Și acum vom ajunge la "linia numărul 16 se află în afara razei de acțiune." 574 00:47:21,180 --> 00:47:23,940 Pentru că are doar 15 de linii. 575 00:47:23,940 --> 00:47:30,310 Dacă ajungi la acest punct și întrebându-te, "Ce trebuie să fac?" aveți posibilitatea să utilizați comanda de ajutor. 576 00:47:30,310 --> 00:47:34,340 Utilizați ajutor și apoi să-l numele unei comenzi. 577 00:47:34,340 --> 00:47:36,460 Și veți vedea GDB ne dă tot acest fel de lucruri. 578 00:47:36,460 --> 00:47:43,870 Se spune, "Cu nici un argument, enumeră zece linii mai mult după sau în jurul lista anterioară. 579 00:47:43,870 --> 00:47:47,920 Listă - afișează cele zece linii înainte - " 580 00:47:47,920 --> 00:47:52,960 Deci, haideți să încercați să utilizați lista de minus. 581 00:47:52,960 --> 00:47:57,000 Și care enumeră cele 10 linii precedent; poți să te joci în jurul valorii de cu lista un pic. 582 00:47:57,000 --> 00:48:02,330 Puteți face o listă, lista -, vă pot da chiar un număr de lista, cum ar fi lista de 8, 583 00:48:02,330 --> 00:48:07,500 și-l vom enumera cele 10 de linii în jurul valorii de linia 8. 584 00:48:07,500 --> 00:48:10,290 Și puteți vedea ce se întâmplă aici este că ai o simplă dacă altcineva. 585 00:48:10,290 --> 00:48:13,980 Dacă tastați în CS50 roci, se imprimă "Veți obține un A." 586 00:48:13,980 --> 00:48:16,530 În caz contrar, se imprimă "Veți obține un D." 587 00:48:16,530 --> 00:48:23,770 Păcat oraș. Bine. Da? 588 00:48:23,770 --> 00:48:26,730 >> [Daniel] Așa că atunci când am încercat faci CS50 pietre fără ghilimele, 589 00:48:26,730 --> 00:48:29,290 se spune "Veți obține un D." 590 00:48:29,290 --> 00:48:32,560 Am avea nevoie de citate pentru a face să funcționeze, de ce este asta? 591 00:48:32,560 --> 00:48:38,490 Da >>. Se pare că, atunci când - acesta este un alt tidbit pic de distracție - 592 00:48:38,490 --> 00:48:47,900 cand rulezi programul, în cazul în care l-am rula și am tastați CS50 roci, 593 00:48:47,900 --> 00:48:50,800 la fel ca Daniel a fost spunând că a făcut, și te-a lovit Enter, 594 00:48:50,800 --> 00:48:52,870 încă spune că obține un D. 595 00:48:52,870 --> 00:48:55,580 Și întrebarea este, de ce este asta? 596 00:48:55,580 --> 00:49:02,120 Și se dovedește că ambele noastre terminal și GDB analizare a acestor două argumente ca separate. 597 00:49:02,120 --> 00:49:04,800 Pentru că atunci când există un spațiu, care este implicat în calitate de 598 00:49:04,800 --> 00:49:08,730 primul argument sa încheiat, următorul argument este pe cale să înceapă. 599 00:49:08,730 --> 00:49:13,260 Modalitate de a combina cele în două, sau rău, într-un argument, 600 00:49:13,260 --> 00:49:18,510 este de a utiliza citate. 601 00:49:18,510 --> 00:49:29,560 Deci, acum, dacă l-am pus în ghilimele și rulați-l din nou, vom obține o A. 602 00:49:29,560 --> 00:49:38,780 Deci, doar pentru a recapitula, fără citate, CS50 și roci sunt analizate ca două argumente distincte. 603 00:49:38,780 --> 00:49:45,320 Cu citate, este analizat ca un argument cu totul. 604 00:49:45,320 --> 00:49:53,070 >> Putem vedea acest lucru cu un punct de întrerupere. 605 00:49:53,070 --> 00:49:54,920 Până acum am fost difuzate programul nostru, și a fost difuzate 606 00:49:54,920 --> 00:49:58,230 până când fie se SEG defecte sau afisari o eroare 607 00:49:58,230 --> 00:50:05,930 sau până când aceasta a ieșit și tot a fost total bine. 608 00:50:05,930 --> 00:50:08,360 Acest lucru nu este neapărat cel mai util, deoarece, uneori, 609 00:50:08,360 --> 00:50:11,840 aveți o eroare în programul tău, dar nu cauzează o eroare de segmentare. 610 00:50:11,840 --> 00:50:16,950 Ea nu cauzează programul tău pentru a opri sau ceva de genul asta. 611 00:50:16,950 --> 00:50:20,730 Mod de a ajunge GDB pentru a întrerupe programul tau la un anumit punct 612 00:50:20,730 --> 00:50:23,260 este de a stabili un punct de întrerupere. 613 00:50:23,260 --> 00:50:26,520 Puteți face acest lucru prin stabilirea fie un punct de întrerupere pe un nume de funcție 614 00:50:26,520 --> 00:50:30,770 sau puteți seta un punct de întrerupere pe o anumită linie de cod. 615 00:50:30,770 --> 00:50:34,450 Îmi place pentru a seta puncte de întrerupere pe numele de funcții, pentru că - usor de retinut, 616 00:50:34,450 --> 00:50:37,700 și dacă te duci de fapt, și să vă schimbați codul sursă un pic, 617 00:50:37,700 --> 00:50:42,020 atunci punct de oprire va rămâne, de fapt, la același loc în cadrul codului. 618 00:50:42,020 --> 00:50:44,760 Întrucât dacă utilizați numere de linie, precum și numerele de linie se schimba 619 00:50:44,760 --> 00:50:51,740 pentru că ce adăugați sau ștergeți un cod, apoi puncte de întrerupere, toți vă sunt complet greșit. 620 00:50:51,740 --> 00:50:58,590 Unul dintre lucrurile cele mai comune pe care le fac este setat un punct de întrerupere pe funcția principală. 621 00:50:58,590 --> 00:51:05,300 De multe ori am să boot GDB, voi principal de tip B, apăsați Enter, și că vom stabili un punct de întrerupere 622 00:51:05,300 --> 00:51:10,630 privind funcția principală care spune doar, "Pauza programului de îndată ce începe să ruleze," 623 00:51:10,630 --> 00:51:17,960 și în acest fel, atunci când am rula programul meu cu, să zicem, CS50 roci ca două argumente 624 00:51:17,960 --> 00:51:24,830 și apăsați Enter, se ajunge la funcția de principal și se oprește chiar în linie foarte în primul rând, 625 00:51:24,830 --> 00:51:30,620 chiar înainte de a evaluează funcția strcmp. 626 00:51:30,620 --> 00:51:34,940 >> Din moment ce am oprit, acum pot începe mucking în jurul valorii de și de a vedea ce se întâmplă 627 00:51:34,940 --> 00:51:40,250 cu toate variabilele diferite care sunt trecute în programul meu. 628 00:51:40,250 --> 00:51:43,670 Aici pot imprima argc și să vedem ce se întâmplă. 629 00:51:43,670 --> 00:51:50,030 Vezi ca argc este 3, deoarece are 3 valori diferite în ea. 630 00:51:50,030 --> 00:51:54,060 Are numele programului, acesta are primul argument și al doilea argument. 631 00:51:54,060 --> 00:52:09,330 Ne poate imprima cele de se uită la argv [0], argv [1], și argv [2]. 632 00:52:09,330 --> 00:52:12,030 Deci, acum puteți vedea, de asemenea, de ce acest apel strcmp va eșua, 633 00:52:12,030 --> 00:52:21,650 pentru că vedea că acesta a împărțit CS50 și stâncile în două argumente distincte. 634 00:52:21,650 --> 00:52:27,250 În acest moment, după ce ați lovit un punct de întrerupere, puteți continua să-și intensifice prin intermediul programului tău 635 00:52:27,250 --> 00:52:32,920 linie cu linie, spre deosebire de a începe programul din nou. 636 00:52:32,920 --> 00:52:35,520 Deci, dacă nu doriți să începeți din nou programul și doar continua de aici, 637 00:52:35,520 --> 00:52:41,970 aveți posibilitatea să utilizați comanda continua și continua programul va rula la sfârșitul anului. 638 00:52:41,970 --> 00:52:45,010 Așa cum a făcut-o aici. 639 00:52:45,010 --> 00:52:54,880 Cu toate acestea, în cazul în care am reporniți programul, CS50 pietre, l hit-uri breakpoint-mi din nou, 640 00:52:54,880 --> 00:52:59,670 și de data asta, dacă nu vreau să merg pur și simplu tot drumul prin restul programului, 641 00:52:59,670 --> 00:53:08,040 Eu pot folosi următoarea comandă, pe care am abrevierea de asemenea, cu nr. 642 00:53:08,040 --> 00:53:12,960 Iar acest lucru se va intensifica prin linie de program de linie. 643 00:53:12,960 --> 00:53:17,530 Astfel încât să puteți viziona ca lucrurile executa, ca schimbarea variabile, cum lucrurile se actualizează. 644 00:53:17,530 --> 00:53:21,550 Care este destul de frumos. 645 00:53:21,550 --> 00:53:26,570 Un alt lucru interesant este, mai degrabă decât repetând aceeași comandă de peste si peste si peste, din nou, 646 00:53:26,570 --> 00:53:30,670 dacă te-a lovit doar Enter - deci aici te vezi nu am scris nimic în - 647 00:53:30,670 --> 00:53:33,780 daca am lovit Enter, se va repeta comanda anterioara, 648 00:53:33,780 --> 00:53:36,900 sau comanda GDB precedent pe care mi-am pus doar inch 649 00:53:36,900 --> 00:53:56,000 Eu pot să apăsarea Enter și se va ține pas cu pas prin linie cu linie codul meu. 650 00:53:56,000 --> 00:53:59,310 Mi-ar încuraja să meargă voi verifica celelalte programe buggy, de asemenea. 651 00:53:59,310 --> 00:54:01,330 Nu avem timp pentru a obține prin toate acestea astăzi, în secțiunea. 652 00:54:01,330 --> 00:54:05,890 Codul sursa este acolo, astfel încât să puteți fel de a vedea ce se întâmplă 653 00:54:05,890 --> 00:54:07,730 în spatele scenei, dacă te chiar blocat, 654 00:54:07,730 --> 00:54:11,940 dar cel puțin, practică doar cizme sus GDB, 655 00:54:11,940 --> 00:54:13,940 rularea programului până când se rupe de tine, 656 00:54:13,940 --> 00:54:18,260 obtinerea backtrace, imaginind ceea ce functioneaza accident a fost în, 657 00:54:18,260 --> 00:54:24,450 ceea ce a fost pe linie, imprimarea unor valori variabile, 658 00:54:24,450 --> 00:54:30,140 Doar așa vei obține o simt pentru ea, pentru că va ajuta cu adevarat te duci mai departe. 659 00:54:30,140 --> 00:54:36,340 În acest moment, vom iesi din PIB, pe care veți face cu ajutorul demisia sau doar q. 660 00:54:36,340 --> 00:54:40,460 Dacă programul dvs. este în mijlocul de a rula încă, și nu a ieșit, 661 00:54:40,460 --> 00:54:43,510 se va întreba mereu, "Ești sigur că vrei cu adevărat să renunțe?" 662 00:54:43,510 --> 00:54:48,770 Puteți lovi doar da. 663 00:54:48,770 --> 00:54:55,250 >> Acum ne vom uita la urmatoarea problema avem, care este programul de pisica. 664 00:54:55,250 --> 00:54:59,880 Dacă te uiți pe scurt reorientare și conducte, veți vedea că Tommy foloseste acest program 665 00:54:59,880 --> 00:55:07,540 care imprimă practic totalitatea producției unui fișier de pe ecran. 666 00:55:07,540 --> 00:55:12,660 Deci, dacă am alerga pisica, aceasta este de fapt un program de built-in pentru a aparat, 667 00:55:12,660 --> 00:55:16,860 și, dacă aveți Mac-uri puteți face acest lucru pe Mac ta, daca deschizi terminal. 668 00:55:16,860 --> 00:55:25,630 Și noi - pisica, să spunem, cp.c, și apăsați Enter. 669 00:55:25,630 --> 00:55:29,640 Ce-a făcut această, dacă vom derula un pic și a vedea în cazul în care am fugit linie, 670 00:55:29,640 --> 00:55:40,440 sau în cazul în care am fugit comanda pisica, este literalmente doar imprimate conținutul cp.c la ecranul nostru. 671 00:55:40,440 --> 00:55:44,140 Ne putem rula din nou și vă pot pune în mai multe fișiere împreună. 672 00:55:44,140 --> 00:55:49,880 Astfel încât să puteți face cp.c pisica, iar apoi ne poate înlănțui, de asemenea, fișierul cat.c, 673 00:55:49,880 --> 00:55:53,250 care este programul suntem pe cale de a scrie, 674 00:55:53,250 --> 00:55:58,140 și-l va imprima ambele fișiere back to back la ecranul nostru. 675 00:55:58,140 --> 00:56:05,490 Deci, dacă am derula în sus un pic, vom vedea că atunci când ne-am întâlnit această cp.c pisica, cat.c, 676 00:56:05,490 --> 00:56:17,110 prima tipărit fișierul cp, si apoi mai jos, ea imprimate fișierul cat.c dreapta jos aici. 677 00:56:17,110 --> 00:56:19,650 Vom folosi aceasta pentru a obține doar picioarele noastre ude. 678 00:56:19,650 --> 00:56:25,930 Joaca-te cu imprimare simplă la terminalul, a se vedea modul în care funcționează. 679 00:56:25,930 --> 00:56:39,170 Dacă voi deschide cu gedit cat.c, apăsați Enter, 680 00:56:39,170 --> 00:56:43,760 puteți vedea programul pe care suntem pe cale de a scrie. 681 00:56:43,760 --> 00:56:48,980 Am inclus această placă cazan frumos, așa că nu trebuie să-și petreacă timpul tastarea tot asta. 682 00:56:48,980 --> 00:56:52,310 Noi verificam, de asemenea, numărul de argumente trecut inch 683 00:56:52,310 --> 00:56:56,910 Noi imprimam un mesaj de folosire frumos. 684 00:56:56,910 --> 00:57:00,950 >> Acesta este genul de lucru care, din nou, ca și cum am vorbit despre, 685 00:57:00,950 --> 00:57:04,490 E aproape ca și cum memoria musculare. 686 00:57:04,490 --> 00:57:07,190 Doar amintiți-vă să continui să faci același tip de lucruri 687 00:57:07,190 --> 00:57:11,310 și întotdeauna imprimarea un fel de mesaj de ajutor 688 00:57:11,310 --> 00:57:17,670 astfel încât oamenii să știe cum să rulați programul tău. 689 00:57:17,670 --> 00:57:21,630 Cu pisica, e destul de simplu; suntem doar de gând să treacă prin toate argumentele diferitelor 690 00:57:21,630 --> 00:57:24,300 care au fost trecut la programul nostru, și vom imprima 691 00:57:24,300 --> 00:57:29,950 conținutul acestora atenția la un ecran la un moment dat. 692 00:57:29,950 --> 00:57:35,670 În scopul de a imprima fișiere pentru a ecran, am de gând să faci ceva foarte asemănător 693 00:57:35,670 --> 00:57:38,120 pentru ceea ce am făcut la sfârșitul testului. 694 00:57:38,120 --> 00:57:45,350 La sfârșitul testului, care închiria programul, am avut de a deschide un fișier, 695 00:57:45,350 --> 00:57:48,490 și apoi am avut pentru a imprima la ea. 696 00:57:48,490 --> 00:57:54,660 În acest caz, vom deschide un fișier, și vom citi din ea în loc. 697 00:57:54,660 --> 00:58:00,630 Apoi ne-am de gând să imprima, în loc de un fișier, vom tipări la ecran. 698 00:58:00,630 --> 00:58:05,830 Deci, tipărirea la ecranul ați făcut înainte de toate cu printf. 699 00:58:05,830 --> 00:58:08,290 Așa că nu e prea nebun. 700 00:58:08,290 --> 00:58:12,190 Dar citirea unui fișier este un fel de ciudat. 701 00:58:12,190 --> 00:58:17,300 Vom trece prin asta un pic la un moment dat. 702 00:58:17,300 --> 00:58:20,560 Dacă voi reveni la această problemă în ultima testul dvs., problema 33, 703 00:58:20,560 --> 00:58:27,280 prima linie pe care am de gând să fac aici, deschiderea fișierului, este foarte similar cu ceea ce am făcut acolo. 704 00:58:27,280 --> 00:58:36,370 Deci Stella, ceea ce face ca aspectul linie de genul, atunci când deschideți un fișier? 705 00:58:36,370 --> 00:58:47,510 [Stella] Capital * FILE, Fișier - >> Bine. >> - Este egal cu fopen. Da >>. 706 00:58:47,510 --> 00:58:55,980 Care în acest caz este? E în comentariu. 707 00:58:55,980 --> 00:59:06,930 >> E în comentariu? argv [i] și r? 708 00:59:06,930 --> 00:59:11,300 Exact >>. Dreapta pe. Deci, Stella e dreptate. 709 00:59:11,300 --> 00:59:13,720 Aceasta este ceea ce pare a fi linia. 710 00:59:13,720 --> 00:59:19,670 Vom obține o variabilă flux de fișier, depozitați-l într-un * FILE, astfel încât toate capacele, 711 00:59:19,670 --> 00:59:25,720 FILE, *, și numele acestei variabile va fi fișier. 712 00:59:25,720 --> 00:59:32,250 Am putea-o numi tot ceea ce ne place. Am putea numi first_file, sau file_i, orice ne-ar plăcea. 713 00:59:32,250 --> 00:59:37,590 Și apoi numele fișierului a fost adoptată în pe linia de comandă pentru acest program. 714 00:59:37,590 --> 00:59:44,450 Deci, este stocat în argv [i,] și apoi vom deschide acest fișier în modul citire. 715 00:59:44,450 --> 00:59:48,100 Acum, că ne-am deschis dosarul, ceea ce este lucrul pe care noi întotdeauna trebuie să vă amintiți să facă 716 00:59:48,100 --> 00:59:52,230 ori de câte ori am deschis un fișier? Închide-o. 717 00:59:52,230 --> 00:59:57,220 Deci Missy, cum putem inchide un fisier? 718 00:59:57,220 --> 01:00:01,020 [Missy] fclose (file) >> fclose (file). Exact. 719 01:00:01,020 --> 01:00:05,340 Mare. Bine. Dacă ne uităm la acest comentariu de făcut aici, 720 01:00:05,340 --> 01:00:11,940 se spune, "Deschide argv [i] și a imprima conținutul sale la stdout." 721 01:00:11,940 --> 01:00:15,460 >> Out Standard este un nume ciudat. Stdout este doar modul nostru de a spune 722 01:00:15,460 --> 01:00:22,880 vrem să-l imprimați să terminalului; vrem să-l imprimați fluxul de ieșire standard. 723 01:00:22,880 --> 01:00:26,450 Putem obține de fapt scapa de acest comentariu aici. 724 01:00:26,450 --> 01:00:36,480 Am de gând să-l copiați și lipiți-l din moment ce e ceea ce am făcut. 725 01:00:36,480 --> 01:00:41,290 În acest moment, acum avem de a citi fișierul de biți bit. 726 01:00:41,290 --> 01:00:46,300 Am discutat despre o serie de moduri de fișiere de lectură. 727 01:00:46,300 --> 01:00:51,830 Care sunt cele favorite pana acum? 728 01:00:51,830 --> 01:00:57,960 Care modalități ați văzut sau nu vă amintiți, pentru a citi fișiere? 729 01:00:57,960 --> 01:01:04,870 [Daniel] fread? Fread >>? Deci, fread este unul. Jimmy, știi și alții? 730 01:01:04,870 --> 01:01:12,150 [Jimmy] Nr >> Bine. Nope. Charlotte? Alexander? Orice alții? Bine. 731 01:01:12,150 --> 01:01:20,740 Deci, celelalte sunt fgetc, este una care vom folosi o mulțime. 732 01:01:20,740 --> 01:01:26,410 Există, de asemenea, fscanf; voi vedea un model aici? 733 01:01:26,410 --> 01:01:29,170 Toate încep cu f. Nimic de a face cu un fișier. 734 01:01:29,170 --> 01:01:35,260 Nu e fread, fgetc, fscanf. Acestea sunt toate funcțiile de citire. 735 01:01:35,260 --> 01:01:49,120 Pentru scrierea avem fwrite, avem fputc loc de fgetc. 736 01:01:49,120 --> 01:01:58,250 De asemenea, am dori fprintf am văzut-o pe test. 737 01:01:58,250 --> 01:02:01,680 Deoarece aceasta este o problemă care implică citirea dintr-un fișier, 738 01:02:01,680 --> 01:02:04,940 vom folosi una din aceste trei funcții. 739 01:02:04,940 --> 01:02:10,890 Noi nu vom utiliza aceste funcții jos aici. 740 01:02:10,890 --> 01:02:14,880 Aceste funcții sunt toate găsite în I / O standard bibliotecă. 741 01:02:14,880 --> 01:02:17,510 Deci, daca te uiti la partea de sus a acestui program, 742 01:02:17,510 --> 01:02:24,110 puteți vedea că am inclus deja fișierul antet pentru I / O standard bibliotecă. 743 01:02:24,110 --> 01:02:27,120 Dacă vrem să aflăm care dintre noi vrem să folosim, 744 01:02:27,120 --> 01:02:29,690 putem deschide întotdeauna paginile man. 745 01:02:29,690 --> 01:02:34,350 Deci, putem scrie stdio om 746 01:02:34,350 --> 01:02:43,180 si citeste tot despre stdio de intrare și de ieșire în funcțiile C. 747 01:02:43,180 --> 01:02:49,870 Și putem vedea deja oh, uite. E menționând fgetc, se menționează fputc. 748 01:02:49,870 --> 01:02:57,220 Astfel, puteți detalia un pic si uita-te la, să zicem, fgetc 749 01:02:57,220 --> 01:03:00,060 si uita-te la pagina de manual a lui. 750 01:03:00,060 --> 01:03:03,430 Puteți vedea că merge împreună cu o grămadă de alte funcții: 751 01:03:03,430 --> 01:03:12,640 fgetc, fgets, getc, getchar, devine, ungetc, și darea ei de caractere si siruri de caractere. 752 01:03:12,640 --> 01:03:19,180 Deci, acesta este modul în care citim în caractere și șiruri de fișiere de pe intrarea standard, 753 01:03:19,180 --> 01:03:21,990 care este în esență de la utilizator. 754 01:03:21,990 --> 01:03:24,780 Și acest lucru este cum o facem în actuala C. 755 01:03:24,780 --> 01:03:30,850 Deci, acest lucru nu se utilizează getString și funcțiile getchar 756 01:03:30,850 --> 01:03:36,840 pe care am folosit din biblioteca CS50. 757 01:03:36,840 --> 01:03:39,710 Vom face această problemă în câteva moduri 758 01:03:39,710 --> 01:03:43,430 astfel încât să puteți vedea două moduri diferite de a face asta. 759 01:03:43,430 --> 01:03:48,490 Atât funcția fread că Daniel mentionat si fgetc sunt bune moduri de a face acest lucru. 760 01:03:48,490 --> 01:03:53,790 Cred că fgetc este un pic mai usor, deoarece are doar, după cum vedeți, 761 01:03:53,790 --> 01:03:59,660 un singur argument, * FILE pe care noi încercăm să citească personaj din, 762 01:03:59,660 --> 01:04:02,740 și valoarea sa returnata este un int. 763 01:04:02,740 --> 01:04:05,610 Și aceasta este un pic confuz, nu? 764 01:04:05,610 --> 01:04:11,450 >> Pentru ca ne apropiem un caracter, așa că de ce nu acest retur un char? 765 01:04:11,450 --> 01:04:18,700 Voi aveți orice idei cu privire la ce acest lucru nu s-ar putea întoarce un char? 766 01:04:18,700 --> 01:04:25,510 [Răspunde Missy, neinteligibil] >> Da. Deci Missy e dreptate. 767 01:04:25,510 --> 01:04:31,570 Dacă e ASCII, atunci acest lucru ar putea fi întreg mapată la un char reală. 768 01:04:31,570 --> 01:04:33,520 Ar putea fi un caracter ASCII, și asta e bine. 769 01:04:33,520 --> 01:04:36,220 Asta e exact ceea ce se întâmplă. 770 01:04:36,220 --> 01:04:39,190 Suntem folosind un int pur și simplu pentru că are mai mulți biți. 771 01:04:39,190 --> 01:04:44,750 E mai mare decât un char; char noastră are doar 8 biți, care pe 1 octet noastre 32-bit mașini. 772 01:04:44,750 --> 01:04:48,520 Și un int are valoare toate cele 4 octeți de spațiu ". 773 01:04:48,520 --> 01:04:50,940 Și se dovedește că modul fgetc funcționează, 774 01:04:50,940 --> 01:04:53,940 dacă vom defila în jos, în rezumatul nostru în această pagină om un pic, 775 01:04:53,940 --> 01:05:05,000 defila tot drumul în jos. Se pare că ei folosesc această valoare special numit EOF. 776 01:05:05,000 --> 01:05:09,640 E o constantă specială în valoare de retur a funcției fgetc 777 01:05:09,640 --> 01:05:14,570 ori de câte ori te-a lovit sfârșitul fișierului sau în cazul în care veți primi o eroare. 778 01:05:14,570 --> 01:05:18,170 Și se dovedește că a face aceste comparații cu EOF în mod corespunzător, 779 01:05:18,170 --> 01:05:24,060 doriți să aveți această sumă suplimentară de informații pe care le au într-o int 780 01:05:24,060 --> 01:05:28,420 spre deosebire de folosind o variabilă char. 781 01:05:28,420 --> 01:05:32,130 Chiar dacă fgetc este obtinerea efectiv un caracter dintr-un fișier, 782 01:05:32,130 --> 01:05:38,450 doriți să vă amintiți că se întoarce ceva care este de tip int pentru tine. 783 01:05:38,450 --> 01:05:41,360 Acestea fiind spuse, e destul de usor de utilizat. 784 01:05:41,360 --> 01:05:44,960 O să ne dea un caracter, așa că tot ce trebuie să faceți este tot întreb dosar, 785 01:05:44,960 --> 01:05:48,440 "Dă-mi următorul caracter, dă-mi următorul caracter, dă-mi caracterul următor," 786 01:05:48,440 --> 01:05:51,400 până când vom ajunge la sfârșitul fișierului. 787 01:05:51,400 --> 01:05:54,730 Și că va trage într-un caracter la un moment dat din fișierul nostru, 788 01:05:54,730 --> 01:05:56,250 și apoi putem face ce ne place cu ea. 789 01:05:56,250 --> 01:06:00,160 Noi putem stoca, putem adăuga la un șir, putem imprima. 790 01:06:00,160 --> 01:06:04,630 Nimic din toate astea. 791 01:06:04,630 --> 01:06:09,600 >> Zoom înapoi și merge înapoi la programul nostru cat.c, 792 01:06:09,600 --> 01:06:16,170 dacă am de gând să utilizeze fgetc, 793 01:06:16,170 --> 01:06:21,710 cum am putea aborda această următoarea linie de cod? 794 01:06:21,710 --> 01:06:26,020 Vom folosi - fread va face ceva ușor diferit. 795 01:06:26,020 --> 01:06:32,600 Și de data asta, suntem doar de gând să utilizeze fgetc pentru a obține un caracter la un moment dat. 796 01:06:32,600 --> 01:06:40,910 Pentru a procesa un fișier întreg, ceea ce s-ar putea trebuie să facem? 797 01:06:40,910 --> 01:06:44,030 Câte personaje sunt acolo într-un fișier? 798 01:06:44,030 --> 01:06:47,390 Există o mulțime. Deci, probabil, veți dori pentru a obține unul 799 01:06:47,390 --> 01:06:49,860 și de a lua apoi altul și altul și să obțineți un alt. 800 01:06:49,860 --> 01:06:53,330 Ce fel de algoritm crezi că am putea avea de a utiliza aici? 801 01:06:53,330 --> 01:06:55,470 Ce tip de -? [Alexander] A pentru buclă? Exact >>. 802 01:06:55,470 --> 01:06:57,500 Un anumit tip de bucla. 803 01:06:57,500 --> 01:07:03,380 A pentru buclă este de fapt o mare, în acest caz. 804 01:07:03,380 --> 01:07:08,620 Și ca și cum ai spune, se pare ca va doriti o bucla peste întregul dosar, 805 01:07:08,620 --> 01:07:11,820 obținerea unui personaj la un moment dat. 806 01:07:11,820 --> 01:07:13,850 Orice sugestii cu privire la ceea ce s-ar putea ca arata ca? 807 01:07:13,850 --> 01:07:22,090 [Alexander, neinteligibil] 808 01:07:22,090 --> 01:07:30,050 Bine >>, spune-mi în limba engleză ceea ce încerci să faci? [Alexander, neinteligibil] 809 01:07:30,050 --> 01:07:36,270 Deci, în acest caz, se pare că suntem doar încercarea de a bucla peste întregul dosar. 810 01:07:36,270 --> 01:07:45,330 [Alexander] Deci, i > -? 811 01:07:45,330 --> 01:07:49,290 Cred ca marimea fisierului, nu? Dimensiunea - Vom scrie doar ca asta. 812 01:07:49,290 --> 01:07:57,470 Dimensiunea de fișier pentru moment, i + +. 813 01:07:57,470 --> 01:08:04,610 Deci, se dovedește că modul în care face acest lucru utilizând fgetc, iar acest lucru este nou, 814 01:08:04,610 --> 01:08:10,460 este că nu există nici o modalitate ușoară de a obține doar dimensiunea unui fișier 815 01:08:10,460 --> 01:08:16,979 cu acest "sizeof" tip de construcție pe care le-ați văzut până acum. 816 01:08:16,979 --> 01:08:20,910 Când ne-am folosi această funcție fgetc, vom introduce un fel de 817 01:08:20,910 --> 01:08:29,069 noua sintaxă, funky, pentru a prezenta pentru bucla, în cazul în care în loc de a folosi doar un contor de bază 818 01:08:29,069 --> 01:08:33,920 pentru a merge caracter cu caracter, vom trage un caracter la un moment dat, 819 01:08:33,920 --> 01:08:37,120 un caracter la un moment dat, și modul în care știm că suntem la sfârșitul 820 01:08:37,120 --> 01:08:41,290 nu este atunci când ne-am numarat un anumit număr de caractere, 821 01:08:41,290 --> 01:08:49,939 dar atunci când personajul ne scoate acest scop este deosebit de caracter fișier. 822 01:08:49,939 --> 01:08:58,689 Astfel încât să putem face acest lucru prin - Eu numesc asta ch, și noi o să-l inițializa 823 01:08:58,689 --> 01:09:08,050 cu apel prima noastră pentru a obține primul caracter din fisier. 824 01:09:08,050 --> 01:09:14,979 Deci, această parte chiar aici, acest lucru este mergi la a lua un caracter din fisier 825 01:09:14,979 --> 01:09:20,840 și-l păstrează în variabila ch. 826 01:09:20,840 --> 01:09:25,420 Vom continua să facem acest lucru pana cand vom ajunge la sfârșitul fișierului, 827 01:09:25,420 --> 01:09:41,170 pe care le face prin testarea pentru personajul nu este egal cu acel caracter EOF specială. 828 01:09:41,170 --> 01:09:48,750 Și atunci în loc de a face CH + +, ceea ce ar incrementa valoarea doar, 829 01:09:48,750 --> 01:09:52,710 așa că, dacă citim un un fișier de, un capital A, să zicem, 830 01:09:52,710 --> 01:09:56,810 CH + + ne-ar da b, iar apoi am obține c și d, apoi. 831 01:09:56,810 --> 01:09:59,310 Asta nu e clar ce ne dorim. Ceea ce ne dorim aici 832 01:09:59,310 --> 01:10:05,830 în acest bit este ultima vrem să obțineți următorul caracter din fișierul. 833 01:10:05,830 --> 01:10:09,500 >> Deci, cum am putea obține următorul caracter din fișierul? 834 01:10:09,500 --> 01:10:13,470 Cum ajungem primul caracter din fișierul? 835 01:10:13,470 --> 01:10:17,200 [Student] fgetfile? >> Fgetc, sau, îmi pare rău, ai avut dreptate. 836 01:10:17,200 --> 01:10:20,470 Am greșit chiar acolo. Deci da. 837 01:10:20,470 --> 01:10:26,240 Aici în loc de a face CH + +, 838 01:10:26,240 --> 01:10:29,560 suntem doar de gând să sun fgetc (fișier) din nou 839 01:10:29,560 --> 01:10:39,180 și stoca rezultatul în variabila ch noastră aceeași. 840 01:10:39,180 --> 01:10:43,730 [Întrebare Student, neinteligibil] 841 01:10:43,730 --> 01:10:52,390 Acest lucru este în cazul în care >> tipii ăștia FILE * sunt speciale. 842 01:10:52,390 --> 01:10:59,070 Modul în care acestea funcționează este că - atunci când deschideți prima - atunci când faci mai întâi că apelul fopen, 843 01:10:59,070 --> 01:11:04,260 * FILE eficient servește ca un pointer la începutul fișierului. 844 01:11:04,260 --> 01:11:12,830 Și apoi de fiecare dată când suna fgetc, se misca un caracter prin fișierul. 845 01:11:12,830 --> 01:11:23,280 Deci, ori de câte ori te sun asta, te incrementare indicatorul fișierului de un caracter. 846 01:11:23,280 --> 01:11:26,210 Și când te fgetc din nou, te muți în alt personaj 847 01:11:26,210 --> 01:11:28,910 și un alt personaj și un alt personaj și un alt personaj. 848 01:11:28,910 --> 01:11:32,030 [Întrebare Student, neinteligibil] >> Și that - Da. 849 01:11:32,030 --> 01:11:34,810 E un fel de magie acestei sub capota. 850 01:11:34,810 --> 01:11:37,930 Tu doar ține de incrementare prin intermediul. 851 01:11:37,930 --> 01:11:46,510 În acest moment, sunteți în stare să lucreze efectiv cu un caracter. 852 01:11:46,510 --> 01:11:52,150 Deci, cum am putea imprima acest pentru a ecran, acum? 853 01:11:52,150 --> 01:11:58,340 Putem folosi același lucru pe care am folosit printf înainte. 854 01:11:58,340 --> 01:12:00,330 Pe care le-am folosit tot semestrul. 855 01:12:00,330 --> 01:12:05,450 Putem numi printf, 856 01:12:05,450 --> 01:12:21,300 și putem trece la caracterul la fel ca asta. 857 01:12:21,300 --> 01:12:27,430 Un alt mod de a face acest lucru este, mai degrabă decât folosind printf și având de a face acest șir format, 858 01:12:27,430 --> 01:12:29,490 putem folosi, de asemenea, una dintre celelalte funcții. 859 01:12:29,490 --> 01:12:40,090 Putem folosi fputc, care imprimă un caracter ecran, 860 01:12:40,090 --> 01:12:52,580 cu excepția cazului dacă ne uităm la fputc - lasă-mă să micșora un pic. 861 01:12:52,580 --> 01:12:56,430 Vedem ce e frumos este nevoie în personajul pe care am citit cu ajutorul fgetc, 862 01:12:56,430 --> 01:13:05,100 dar atunci trebuie să ne dea un curs de apa pentru a imprima la. 863 01:13:05,100 --> 01:13:11,850 Putem folosi, de asemenea, funcția putchar, care va pune direct în standard. 864 01:13:11,850 --> 01:13:16,070 Deci, există o grămadă de opțiuni diferite pe care le putem folosi pentru imprimare. 865 01:13:16,070 --> 01:13:19,580 Sunt toate în standard I / O bibliotecă. 866 01:13:19,580 --> 01:13:25,150 Ori de câte ori doriți să imprimați - așa printf, implicit, va imprima la standardul specială în curs de apa, 867 01:13:25,150 --> 01:13:27,910 care este faptul că stdout. 868 01:13:27,910 --> 01:13:41,300 Deci, putem referi doar la ea ca un fel de magie această valoare, consolă aici. 869 01:13:41,300 --> 01:13:48,410 Hopa. Pune punct și virgulă exterior. 870 01:13:48,410 --> 01:13:52,790 >> Aceasta este o mulțime de informații noi, Funky aici. 871 01:13:52,790 --> 01:13:58,600 O mulțime de acest lucru este foarte idiomatică, în sensul că aceasta este codul 872 01:13:58,600 --> 01:14:05,700 care este scris acest fel doar pentru că e curat pentru a citi, ușor de citit. 873 01:14:05,700 --> 01:14:11,520 Există multe moduri diferite de a face acest lucru, multe funcții diferite pe care le puteți utiliza, 874 01:14:11,520 --> 01:14:14,680 dar avem tendința să urmeze doar aceste modele același de peste si peste. 875 01:14:14,680 --> 01:14:20,180 Asa ca nu fi surprins dacă vedeți cod ca asta vine din nou și din nou. 876 01:14:20,180 --> 01:14:25,690 Bine. În acest moment, avem nevoie de a sparge pentru a doua zi. 877 01:14:25,690 --> 01:14:31,300 Mulțumesc că ai venit. Vă mulțumim pentru vizionarea daca esti on-line. Și ne vedem săptămâna viitoare. 878 01:14:31,300 --> 01:14:33,890 [CS50.TV]