1 00:00:00,000 --> 00:00:02,730 [Powered by Google Translate] [ODJELJAK 5: manje udoban] 2 00:00:02,730 --> 00:00:05,180 [Nate Hardison, Sveučilište Harvard] 3 00:00:05,180 --> 00:00:08,260 [Ovo je CS50.] [CS50.TV] 4 00:00:08,260 --> 00:00:11,690 Dakle, dobrodošli natrag, momci. 5 00:00:11,690 --> 00:00:16,320 Dobrodošli na sekciji pet. 6 00:00:16,320 --> 00:00:20,220 U ovom trenutku, nakon što je završio kviz 0 i nakon što su vidjeli kako ste to učinili, 7 00:00:20,220 --> 00:00:25,770 nadamo se osjećam jako dobro jer sam bio vrlo impresioniran rezultatima u tom dijelu. 8 00:00:25,770 --> 00:00:28,050 Za naše online gledatelja, imali smo nekoliko pitanja 9 00:00:28,050 --> 00:00:33,680 o posljednja dva problema na problem seta - ili na kvizu, a. 10 00:00:33,680 --> 00:00:39,690 Tako da ćemo ići preko onih jako brzo, tako da svatko vidi ono što se dogodilo 11 00:00:39,690 --> 00:00:45,060 i kako to ide kroz stvarne rješenje nego samo gledanje rješenje sama. 12 00:00:45,060 --> 00:00:50,330 Mi ćemo ići u posljednjih nekoliko problema jako brzo, 32 i 33. 13 00:00:50,330 --> 00:00:53,240 Samo, opet, tako da on-line gledatelji mogu vidjeti. 14 00:00:53,240 --> 00:00:59,080 >> Ako ste okrenuti vaš problem 32, koji se nalazi na stranici 13, 15 00:00:59,080 --> 00:01:02,730 13 od 16, 32 Problem je sve o swapova. 16 00:01:02,730 --> 00:01:05,010 To je sve o zamjeni dva prirodna broja. 17 00:01:05,010 --> 00:01:08,740 To je problem koji mi je otišao preko nekoliko puta u predavanju. 18 00:01:08,740 --> 00:01:13,590 I ovdje, ono što smo molili da učinite je brzo memorije trag. 19 00:01:13,590 --> 00:01:17,000 Za popuniti vrijednostima varijabli kao što su oni na stog 20 00:01:17,000 --> 00:01:20,250 kao kod prolazi kroz ove zamjenske funkcije. 21 00:01:20,250 --> 00:01:24,500 Konkretno, ono što gledamo - Idem staviti ovaj ipad dolje - 22 00:01:24,500 --> 00:01:29,650 posebno, ono što gledamo je ova linija brojevima 6 pravo ovdje. 23 00:01:29,650 --> 00:01:36,740 I to je brojevima 6 za samo dodirne s prethodnim problemom. 24 00:01:36,740 --> 00:01:41,720 Ono što želimo učiniti je prikazati ili natpis na stanje memorije 25 00:01:41,720 --> 00:01:46,090 kao što je to u vrijeme kada smo izvršiti ovu linije broj 6, 26 00:01:46,090 --> 00:01:52,540 što je zapravo povratak iz naše zamjenske funkcije ovdje. 27 00:01:52,540 --> 00:01:59,450 Ako smo dođite ovamo, vidjeli smo da su sve adrese u memoriji je predviđeno za nas. 28 00:01:59,450 --> 00:02:02,540 To je vrlo ključ, vratit ćemo se na to u samo jednom trenutku. 29 00:02:02,540 --> 00:02:09,240 I onda ovdje dolje na dnu, imali smo malo memorije dijagram koji ćemo odnose. 30 00:02:09,240 --> 00:02:12,490 Ja sam zapravo su to učinili na mom iPad. 31 00:02:12,490 --> 00:02:20,720 Tako ću izmjenjivati ​​natrag i naprijed između ipad i ovaj kod samo za referencu. 32 00:02:20,720 --> 00:02:26,540 >> Počnimo. Prvo, ajmo se fokusirati na prvih nekoliko redaka glavni ovdje. 33 00:02:26,540 --> 00:02:30,220 Za početak, da ćemo inicijalizirati x na 1 i y 2. 34 00:02:30,220 --> 00:02:33,040 Dakle, imamo dvije cjelobrojne varijable, oni oboje će biti stavljen na stog. 35 00:02:33,040 --> 00:02:36,050 Mi ćemo staviti jedan i dva u njima. 36 00:02:36,050 --> 00:02:43,150 Dakle, ako sam flip preko na moj ipad, nadamo se, ajmo vidjeti - 37 00:02:43,150 --> 00:02:48,660 Apple TV zrcaljenje, i tamo ćemo ići. Ok. 38 00:02:48,660 --> 00:02:51,670 Dakle, ako sam flip preko na moj ipad, 39 00:02:51,670 --> 00:02:56,220 Želim inicijalizirati x na 1 i y 2. 40 00:02:56,220 --> 00:03:00,580 Mi to vrlo jednostavno pisanje jedan u okvir označen x. 41 00:03:00,580 --> 00:03:07,730 i dva u okvir označen y. Prilično jednostavan. 42 00:03:07,730 --> 00:03:11,620 Dakle, sad idemo nazad na laptop, vidjeti što će se dogoditi sljedeći. 43 00:03:11,620 --> 00:03:15,810 Dakle, ovo je sljedeći redak u kojem se stvari dobiti lukav. 44 00:03:15,810 --> 00:03:28,110 Prolazimo adresu x i adresu y kao parametara i b za swap funkciji. 45 00:03:28,110 --> 00:03:32,380 Adresu x i adresa y su stvari koje ne možemo izračunati 46 00:03:32,380 --> 00:03:36,360 bez pozivanja na tim točkama pravo ovdje dolje. 47 00:03:36,360 --> 00:03:39,750 I na sreću, prve dvije bullet bodova nam točno reći što su odgovori. 48 00:03:39,750 --> 00:03:44,740 Adresa xu memorije je 10, a adresa yu memorije je 14. 49 00:03:44,740 --> 00:03:51,870 Dakle, oni su vrijednosti koje se prenose kao i B vrh u našoj zamjenu funkciji. 50 00:03:51,870 --> 00:04:00,760 Pa opet, vratite se u našoj shemi, ja mogu napisati 10 u 51 00:04:00,760 --> 00:04:07,400 i 14 u B. 52 00:04:07,400 --> 00:04:11,610 Sada, to je točka gdje smo nastavili s swapa. 53 00:04:11,610 --> 00:04:14,520 Dakle, flipping natrag na laptop opet, 54 00:04:14,520 --> 00:04:21,079 vidimo da je način swap radi je sam prvi dereference i pohraniti rezultat u tmp. 55 00:04:21,079 --> 00:04:27,650 Dakle dereference operater kaže, "Hej. Liječiti sadržaj varijable kao adresu. 56 00:04:27,650 --> 00:04:33,830 Idite na ono što je pohranjena na toj adresi, i to učitavanje. " 57 00:04:33,830 --> 00:04:41,720 Što ste učitati iz varijable će biti pohranjeni u našoj tmp varijable. 58 00:04:41,720 --> 00:04:45,150 Flipping natrag na iPad. 59 00:04:45,150 --> 00:04:51,690 Ako idemo na adresu 10, znamo da je adresa 10 je varible x 60 00:04:51,690 --> 00:04:55,480 jer nam je rečeno od strane naše tocke da je adresa x memorije je 10. 61 00:04:55,480 --> 00:05:00,180 Dakle, možemo otići tamo, dobili vrijednost toga, što je jedan, kao što smo vidjeli na našem iPad, 62 00:05:00,180 --> 00:05:06,300 i opterećenje koje u tmp. 63 00:05:06,300 --> 00:05:08,250 Opet, to nije konačni sadržaj. 64 00:05:08,250 --> 00:05:14,350 Mi idemo šetati, a mi ćemo doći do našeg konačnog stanja programa na kraju. 65 00:05:14,350 --> 00:05:17,210 Ali sada, imamo vrijednost jedne pohranjene u tmp. 66 00:05:17,210 --> 00:05:19,210 >> I tu je brzo pitanje ovdje. 67 00:05:19,210 --> 00:05:23,980 [Aleksandar] Jeli dereference operater - to je samo zvijezda ispred varijable? 68 00:05:23,980 --> 00:05:27,600 >> Da. Dakle dereference operater, kao što smo okrenuti leđa naše laptop opet, 69 00:05:27,600 --> 00:05:33,780 je ova zvijezda ispred. 70 00:05:33,780 --> 00:05:37,460 U tom smislu, to je - da ga usporediti s množenja operatora 71 00:05:37,460 --> 00:05:42,400 koji zahtijeva dvije stvari; dereference operator je unarni operator. 72 00:05:42,400 --> 00:05:46,130 Samo primijeniti na jednoj vrijednosti, za razliku od binarnog operatora, 73 00:05:46,130 --> 00:05:48,810 gdje se primjenjuje na dvije različite vrijednosti. 74 00:05:48,810 --> 00:05:52,080 Dakle, to je ono što se događa u ovoj liniji. 75 00:05:52,080 --> 00:05:58,390 Mi učitava vrijednost 1 i pohranjeni u našoj privremenog integer varijable. 76 00:05:58,390 --> 00:06:05,800 U sljedećem retku, spremamo sadržaj b u - 77 00:06:05,800 --> 00:06:12,630 ili, bolje rečeno, mi spremiti sadržaj koji b se upućuju na na mjestu gdje se pokazuje na. 78 00:06:12,630 --> 00:06:17,690 Ako ćemo analizirati ovaj s desna na lijevo, mi ćemo dereference b, 79 00:06:17,690 --> 00:06:23,580 idemo na adresu 14, mi ćemo ugrabiti cijeli broj koji je tamo, 80 00:06:23,580 --> 00:06:26,900 i onda ćemo ići na adresu 10, 81 00:06:26,900 --> 00:06:34,240 a mi ćemo baciti rezultat našeg dereference od b u tom prostoru. 82 00:06:34,240 --> 00:06:40,080 Flipping natrag na naš ipad, gdje možemo napraviti to malo konkretniji, 83 00:06:40,080 --> 00:06:44,070 to bi moglo pomoći ako sam pisati brojeve na sve adrese ovdje. 84 00:06:44,070 --> 00:06:53,820 Dakle, mi znamo da je na y, mi smo na adresi 14, x je na adrese 10. 85 00:06:53,820 --> 00:07:00,180 Kada smo započeli na b, mi dereference b, idemo da iskoristite vrijednost dva. 86 00:07:00,180 --> 00:07:08,320 Mi ćemo zgrabiti ovu vrijednost, jer to je vrijednost koja živi na adresi 14. 87 00:07:08,320 --> 00:07:15,700 I mi ćemo ga staviti u varijablu koja živi na adresi 10, 88 00:07:15,700 --> 00:07:19,160 što je tamo, što odgovara našim varijabla x. 89 00:07:19,160 --> 00:07:21,810 Tako možemo učiniti malo prepisati ovdje 90 00:07:21,810 --> 00:07:35,380 gdje smo dobili osloboditi od naše jedne i umjesto toga napisati dvije. 91 00:07:35,380 --> 00:07:39,560 Dakle, sve je dobro i dobro u svijetu, iako mi smo prepisati x sada. 92 00:07:39,560 --> 00:07:44,890 Mi smo pohranjeni X staru vrijednost u našoj tmp varijable. 93 00:07:44,890 --> 00:07:50,210 Dakle, možemo završiti swap sa sljedeći redak. 94 00:07:50,210 --> 00:07:53,030 Flipping natrag na naš laptop. 95 00:07:53,030 --> 00:07:58,150 Sada sve što ostaje je da se sadržaj iz našeg privremenog integer varijable 96 00:07:58,150 --> 00:08:05,630 te ih pohraniti u varijablu koja živi na adresi koja b drži. 97 00:08:05,630 --> 00:08:10,230 Dakle, idemo učinkovito dereference b da biste dobili pristup varijabla 98 00:08:10,230 --> 00:08:14,340 da je na adresu koja b drži u njoj, 99 00:08:14,340 --> 00:08:19,190 i idemo u stvari vrijednost koja se drži tmp u njega. 100 00:08:19,190 --> 00:08:23,280 Flipping natrag na iPad još jednom. 101 00:08:23,280 --> 00:08:31,290 Ja mogu izbrisati ove vrijednosti ovdje, 2, 102 00:08:31,290 --> 00:08:41,010 i umjesto ćemo kopirati jedan pravo u nju. 103 00:08:41,010 --> 00:08:43,059 Zatim sljedeća linija koja izvršava, naravno - 104 00:08:43,059 --> 00:08:47,150 ako smo okrenuti leđa na laptop - je li to točka 6, 105 00:08:47,150 --> 00:08:52,500 koja je točka na kojoj smo htjeli imati naš dijagram potpunosti ispuniti. 106 00:08:52,500 --> 00:08:58,940 Dakle, flipping natrag na iPad još jednom, samo tako možete vidjeti ispunjenu dijagram, 107 00:08:58,940 --> 00:09:06,610 možete vidjeti da imamo 10 u, 14 u B, jedan u tmp, dva u x, a jedan u y. 108 00:09:06,610 --> 00:09:11,000 Ima li kakvih pitanja o tome? 109 00:09:11,000 --> 00:09:14,640 Znači li to više smisla, nakon što je prošao kroz njega? 110 00:09:14,640 --> 00:09:24,850 Napravite manje smisla? Nadam se da ne. Ok. 111 00:09:24,850 --> 00:09:28,230 >> Pokazivači su vrlo lukav subjekt. 112 00:09:28,230 --> 00:09:33,420 Jedan od dečki s kojima surađujemo ima vrlo čest poslovicu: 113 00:09:33,420 --> 00:09:36,590 "Da bi razumjeli naputke, prvo morate razumjeti naputke." 114 00:09:36,590 --> 00:09:40,530 Koji mislim da je vrlo istinito. To ne potrajati naviknuti na njega. 115 00:09:40,530 --> 00:09:45,360 Crtanje puno slika, crtež puno memorije dijagrama kao što je ovaj jedan su vrlo korisne, 116 00:09:45,360 --> 00:09:49,480 i nakon što hoda kroz primjer nakon primjerice nakon, primjerice, 117 00:09:49,480 --> 00:09:54,450 to će početi da bi malo više smisla i malo više osjećaja i malo više smisla. 118 00:09:54,450 --> 00:10:01,560 Konačno, jednog dana, imat ćete sve to u potpunosti ovladali. 119 00:10:01,560 --> 00:10:13,800 Sva pitanja prije nego što smo prešli na sljedeći problem? U redu. 120 00:10:13,800 --> 00:10:18,840 Tako okrenuti leđa na laptop. 121 00:10:18,840 --> 00:10:23,300 Sljedeći problem koji imamo je problem broj 33 na datoteku I / O. 122 00:10:23,300 --> 00:10:26,350 Povećavanje na ovoj malo. 123 00:10:26,350 --> 00:10:28,710 Problem 33 - Da? 124 00:10:28,710 --> 00:10:32,110 >> [Daniel] Upravo sam imao brzo pitanje. Ova zvijezda, ili asterisk, 125 00:10:32,110 --> 00:10:35,590 to se zove dereferencing kada koristite zvjezdicu prije. 126 00:10:35,590 --> 00:10:38,820 Što je to zove kad koristite ampersand prije? 127 00:10:38,820 --> 00:10:43,140 >> Je pečatni znak prije je adresa-od operatera. 128 00:10:43,140 --> 00:10:45,880 Dakle, neka je pomicanje natrag gore. 129 00:10:45,880 --> 00:10:49,310 Ups. Ja sam u zoom modu, tako da ne mogu stvarno pomicanje. 130 00:10:49,310 --> 00:10:52,780 Ako gledamo na ovom kodeksu stvarno brzo ovdje, 131 00:10:52,780 --> 00:10:54,980 opet, ista stvar se događa. 132 00:10:54,980 --> 00:10:59,180 Ako gledamo na ovom kodeksu ovdje, na ovoj liniji gdje ćemo napraviti poziv za swap, 133 00:10:59,180 --> 00:11:10,460 Ampersand samo govori "dobili adresu na koju varijabla x živote." 134 00:11:10,460 --> 00:11:14,460 Kada vaš prevodilac sastavlja svoj kôd, 135 00:11:14,460 --> 00:11:20,590 to je zapravo fizički označiti mjesto u memoriji za sve svoje varijabli da žive. 136 00:11:20,590 --> 00:11:24,910 I tako što prevodilac onda možete učiniti nakon što je sastavio sve, 137 00:11:24,910 --> 00:11:31,110 ona zna, "Oh, ja sam stavio x na adresu 10. sam stavio y na adresu 14." 138 00:11:31,110 --> 00:11:34,640 To onda može ispuniti ovih vrijednosti za vas. 139 00:11:34,640 --> 00:11:44,740 Pa onda možete - to može onda proći to i proći & Y u, kao dobro. 140 00:11:44,740 --> 00:11:50,730 Ovi dečki dobili adresu, ali oni su također, kada ih proći u zamjenu funkciju, 141 00:11:50,730 --> 00:11:55,690 ova vrsta informacije, ovaj int * ovdje, govori prevodilac, 142 00:11:55,690 --> 00:12:01,350 "Dobro, idemo se tumačenje ovu adresu kao adresu integer varijable." 143 00:12:01,350 --> 00:12:05,900 Kao adresu int, što je različito od adresi znakova varijable 144 00:12:05,900 --> 00:12:09,930 jer int zauzima, na 32-bitni stroj, zauzima 4 byte prostora, 145 00:12:09,930 --> 00:12:13,310 dok je lik samo zauzima 1 byte prostora. 146 00:12:13,310 --> 00:12:17,310 Dakle, važno je znati i što je - što živi, ​​što tip od vrijednosti 147 00:12:17,310 --> 00:12:20,340 živi na adresi koja je dobio prošlo u. 148 00:12:20,340 --> 00:12:22,020 Ili je adresa da ste se bave. 149 00:12:22,020 --> 00:12:29,020 Na taj način, vi znate koliko bajtova informacija zapravo učitati iz vašeg RAM-a. 150 00:12:29,020 --> 00:12:31,780 I onda, da, to dereference operater, poput tebe su postavljali, 151 00:12:31,780 --> 00:12:37,200 ide i pristupa informacijama na određenu adresu. 152 00:12:37,200 --> 00:12:42,820 Tako je, kaže, s ovim varijable ovdje, liječenje sadržaj kao adresu, 153 00:12:42,820 --> 00:12:47,880 ići na tu adresu, i izvucite, učitati u procesoru, opterećenja u registar 154 00:12:47,880 --> 00:12:56,340 stvarne vrijednosti ili sadržaja koji žive na toj adresi. 155 00:12:56,340 --> 00:12:59,620 Svaki više pitanja? Ovo su dobra pitanja. 156 00:12:59,620 --> 00:13:01,650 To je puno novih terminologije previše. 157 00:13:01,650 --> 00:13:09,800 To je također vrsta funky, gledajući & a * u različitim mjestima. 158 00:13:09,800 --> 00:13:13,180 >> U redu. 159 00:13:13,180 --> 00:13:18,530 Dakle, natrag na problemu 33, podnijeti I / O. 160 00:13:18,530 --> 00:13:22,540 To je bio jedan od onih problema koje ja mislim par stvari dogodilo. 161 00:13:22,540 --> 00:13:25,400 Jedan od njih, to je relativno nova tema. 162 00:13:25,400 --> 00:13:30,590 To je bio predstavljen uskoro pred kvizu, 163 00:13:30,590 --> 00:13:33,400 i onda mislim da je to vrsta kao jedna od onih riječi problema u matematici 164 00:13:33,400 --> 00:13:39,720 gdje su vam dati puno informacija, ali zapravo ne završiti potrebe da koriste tonu njega. 165 00:13:39,720 --> 00:13:44,060 Prvi dio ovog problema opisuje što CSV datoteka je. 166 00:13:44,060 --> 00:13:50,620 Sada, CSV datoteka, prema opisu, je odvojen zarezom vrijednosti datoteka. 167 00:13:50,620 --> 00:13:55,300 Razlog su uopće zanimljiva, a razlog što ih je ikada koristiti, 168 00:13:55,300 --> 00:14:00,800 je, jer, kako su mnogi od vas ikada koristiti stvari kao što su Excel? 169 00:14:00,800 --> 00:14:03,240 Slika većina vas, vjerojatno, ili će se koristiti u nekom trenutku u vašem životu. 170 00:14:03,240 --> 00:14:06,430 Vi ćete koristiti nešto poput Excela. 171 00:14:06,430 --> 00:14:10,940 Da bi dobili podatke iz Excel spreadsheet-ovima ili učiniti bilo kakve obrade s njim, 172 00:14:10,940 --> 00:14:17,240 ako si htio napisati C program ili Python program, Java programa, 173 00:14:17,240 --> 00:14:20,070 nositi s podacima koje ste pohranjenih tamo, 174 00:14:20,070 --> 00:14:23,170 jedan od najčešćih načina da ga izaći u CSV datoteku. 175 00:14:23,170 --> 00:14:26,850 A možete otvoriti Excel i kad idete na "Save As" dijalog, 176 00:14:26,850 --> 00:14:32,840 možete izaći stvarni CSV datoteku. 177 00:14:32,840 --> 00:14:35,890 >> Handy znati kako se nositi s tim stvarima. 178 00:14:35,890 --> 00:14:42,010 Način na koji to radi je da je sličan - Mislim, to u suštini je oponaša tablicu, 179 00:14:42,010 --> 00:14:47,590 gdje je, kao što smo vidjeli ovdje, u vrlo lijevo-najveći komad, 180 00:14:47,590 --> 00:14:49,910 imamo sve prezimena. 181 00:14:49,910 --> 00:14:54,670 Dakle, imamo Malan, zatim Hardison, a zatim Bowden, MacWilliam, a zatim Chan. 182 00:14:54,670 --> 00:14:59,470 Sva prezimena. A onda zarez razdvaja prezimena iz prvih imena. 183 00:14:59,470 --> 00:15:02,970 David, Nate, Rob, Tommy, i Zamyla. 184 00:15:02,970 --> 00:15:06,850 Uvijek sam se miješati Robby i Toma. 185 00:15:06,850 --> 00:15:10,940 I onda, konačno, treći stupac je e-mail adrese. 186 00:15:10,940 --> 00:15:18,500 Jednom kad shvatite da je ostatak programa je prilično jednostavan za implementaciju. 187 00:15:18,500 --> 00:15:23,850 Što smo učinili kako bi oponašati ovu istu strukturu u našem C programu 188 00:15:23,850 --> 00:15:27,510 je smo koristili strukturu. 189 00:15:27,510 --> 00:15:30,520 Mi ćemo početi igrati s njima malo više, kao dobro. 190 00:15:30,520 --> 00:15:35,790 Vidjeli smo ih na prvom malo u problematiku skupa tri godine, kada smo se bavi rječnika. 191 00:15:35,790 --> 00:15:40,290 Ali ovo osoblje struct sprema posljednju ime, prezime, samo ime i e-mail. 192 00:15:40,290 --> 00:15:44,500 Baš kao što je naš CSV datoteku je spremanje. 193 00:15:44,500 --> 00:15:47,950 Dakle, ovo je samo pretvaranje iz jednog oblika u drugi. 194 00:15:47,950 --> 00:15:54,630 Moramo pretvoriti, u ovom slučaju, a osoblje struct u liniji, 195 00:15:54,630 --> 00:15:59,060 odvojenih zarezom linija, baš kao da je. 196 00:15:59,060 --> 00:16:01,500 Ima li to smisla? Vi svi su se kviz, 197 00:16:01,500 --> 00:16:07,680 pa pretpostavljam da su barem imali malo vremena za razmišljanje o tome. 198 00:16:07,680 --> 00:16:16,410 >> U najam funkciji, problem traži od nas da se u - hrapavi uvećanje na ovoj malo - 199 00:16:16,410 --> 00:16:22,480 uzeti u strukturi osoblja, osoblje struct, s ime je, 200 00:16:22,480 --> 00:16:30,900 i dodati svoj sadržaj na naš staff.csv datoteku. 201 00:16:30,900 --> 00:16:34,230 Ispada da je to prilično jednostavan za korištenje. 202 00:16:34,230 --> 00:16:37,430 Mi ćemo vrsta poigrati s tim funkcijama malo više danas. 203 00:16:37,430 --> 00:16:44,510 No, u ovom slučaju, fprintf funkcija je stvarno ključ. 204 00:16:44,510 --> 00:16:51,960 Dakle, s fprintf, možemo ispisati, baš kao i vi ste koristili printf cijeli ovaj termin. 205 00:16:51,960 --> 00:16:55,050 Možete printf linija u datoteku. 206 00:16:55,050 --> 00:16:59,030 Dakle, umjesto da samo što je uobičajeni printf poziv gdje mu dati niz formata 207 00:16:59,030 --> 00:17:05,380 i onda zamijeniti sve varijable sa sljedećim argumentima, 208 00:17:05,380 --> 00:17:11,290 s fprintf, tvoj prvi argument je umjesto datoteku koju želite pisati. 209 00:17:11,290 --> 00:17:21,170 Ako smo bili pogledati to u aparatu, na primjer, čovjek fprintf, 210 00:17:21,170 --> 00:17:25,980 možemo vidjeti razliku između printf i fprintf. 211 00:17:25,980 --> 00:17:28,960 Ja ću povećavanje ovdje malo. 212 00:17:28,960 --> 00:17:33,140 Dakle, s printf, dajemo mu niz formata, a zatim kasniji argumenti 213 00:17:33,140 --> 00:17:37,580 su sve varijable za zamjenu ili zamjenu u našem format string. 214 00:17:37,580 --> 00:17:47,310 Dok s fprintf, prvi argument je doista ovu sliku * zove stream. 215 00:17:47,310 --> 00:17:51,800 >> Premještanje natrag ovamo na naš najam, 216 00:17:51,800 --> 00:17:54,550 već smo dobili naša datoteka * potok otvorena za nas. 217 00:17:54,550 --> 00:17:57,810 To je ono što ovaj prvi red ne, to otvara staff.csv datoteku, 218 00:17:57,810 --> 00:18:01,690 on ga otvara u append modu, a sve što je lijevo za nas učiniti je 219 00:18:01,690 --> 00:18:08,640 napisati osoblje strukturu datoteke. 220 00:18:08,640 --> 00:18:10,870 I, neka se vidi, ne želim koristiti iPad? 221 00:18:10,870 --> 00:18:17,900 Ja ću koristiti ipad. Imamo prazninu - neka je stavi ovo na stolu, tako da mogu napisati nešto bolje - 222 00:18:17,900 --> 00:18:33,680 poništiti najam, a to vodi u jedan argument, a osoblje strukturu nazvanu a. 223 00:18:33,680 --> 00:18:44,120 Imaš naše aparatić, mi imamo našu datoteke * zove datoteka, 224 00:18:44,120 --> 00:18:48,380 mi imamo fopen liniju s obzirom na nas, 225 00:18:48,380 --> 00:18:51,890 i samo ću ga pisati kao točke budući da je već u PEDIA. 226 00:18:51,890 --> 00:19:00,530 A onda na našem sljedećem retku, idemo napraviti poziv fprintf 227 00:19:00,530 --> 00:19:03,700 i da ćemo proći u spisu koje želimo ispisati, 228 00:19:03,700 --> 00:19:10,290 i onda naša format string, koji - 229 00:19:10,290 --> 00:19:14,300 Pustit ću ti dečki recite mi kako to izgleda. 230 00:19:14,300 --> 00:19:20,500 Kako o vama, Stella? Znate li što je prvi dio format string izgleda? 231 00:19:20,500 --> 00:19:24,270 [Stella] nisam siguran. >> Slobodno pitajte Jimmy. 232 00:19:24,270 --> 00:19:27,690 Znate li, Jimmy? 233 00:19:27,690 --> 00:19:31,000 [Jimmy] Bi li to biti samo zadnji? Ne znam. Nisam posve siguran. 234 00:19:31,000 --> 00:19:39,020 >> Ok. Kako o, da li se itko dobiti to točno na ispitu? 235 00:19:39,020 --> 00:19:41,770 No redu. 236 00:19:41,770 --> 00:19:47,920 Ispada da je ovdje sve što morate učiniti je želimo svaki dio našeg osoblja strukture 237 00:19:47,920 --> 00:19:53,290 biti tiskan kao niz u našoj datoteci. 238 00:19:53,290 --> 00:19:59,900 Mi samo koristiti karakter supstitucije Gudački tri različita puta, jer imamo prezime 239 00:19:59,900 --> 00:20:07,160 slijedi zarez, a zatim ime slijedi zarez, 240 00:20:07,160 --> 00:20:12,430 i onda na kraju e-mail adresa koje slijede - koji nije 241 00:20:12,430 --> 00:20:15,140 ugradnju na mom ekranu - ali to je popraćen newline karaktera. 242 00:20:15,140 --> 00:20:20,060 Dakle, ja ću ga napisati samo tamo dolje. 243 00:20:20,060 --> 00:20:23,560 A onda slijedi naš format string, 244 00:20:23,560 --> 00:20:27,880 samo mi imamo zamjene, koje smo pristupili pomoću dot notacija 245 00:20:27,880 --> 00:20:31,370 koje smo vidjeli u problematiku skupa tri. 246 00:20:31,370 --> 00:20:48,820 Možemo koristiti s.last, s.first i s.email 247 00:20:48,820 --> 00:20:58,990 zamjena u te tri vrijednosti u našem format string. 248 00:20:58,990 --> 00:21:06,190 Pa kako je to ići? Smisla? 249 00:21:06,190 --> 00:21:09,700 Da? Ne? Možda? Ok. 250 00:21:09,700 --> 00:21:14,180 >> Konačna stvar da radimo nakon što smo tiskan i nakon što smo otvorili našu sliku: 251 00:21:14,180 --> 00:21:17,370 kad smo otvorili datoteku, uvijek moramo imati na umu da ga zatvoriti. 252 00:21:17,370 --> 00:21:19,430 Jer inače ćemo završiti curi memorije, 253 00:21:19,430 --> 00:21:22,500 koristeći se datoteka deskriptora. 254 00:21:22,500 --> 00:21:25,950 Tako da ga zatvorili, koji funkcija ne možemo koristiti? Daniel? 255 00:21:25,950 --> 00:21:30,120 [Daniel] fclose? >> Fclose, točno. 256 00:21:30,120 --> 00:21:37,520 Dakle, posljednji dio ovog problema je da pravilno zatvorite datoteku, koristeći fclose funkciju, 257 00:21:37,520 --> 00:21:40,370 koji samo izgleda kao da. 258 00:21:40,370 --> 00:21:43,880 Ne previše ludo. 259 00:21:43,880 --> 00:21:46,990 Cool. 260 00:21:46,990 --> 00:21:49,520 Tako da je problem 33 na kvizu. 261 00:21:49,520 --> 00:21:52,480 Morat ćemo definitivno više datoteka I / O dolazi. 262 00:21:52,480 --> 00:21:55,130 Učinit ćemo malo više u predavanju danas, ili u sekciji danas, 263 00:21:55,130 --> 00:22:01,710 jer to je ono što se događa da se formira većinu ove nadolazeće pset. 264 00:22:01,710 --> 00:22:05,020 Idemo na iz kviza u ovom trenutku. Da? 265 00:22:05,020 --> 00:22:10,880 >> [Charlotte]] Zašto fclose (datoteka) umjesto fclose (staff.csv)? 266 00:22:10,880 --> 00:22:19,100 >> Ah. Jer ispada da - pa se postavlja pitanje, što je jedan veliki, 267 00:22:19,100 --> 00:22:27,800 je razlog zašto, kada pišemo fclose, pišemo fclose (file) zvijezda varijablu 268 00:22:27,800 --> 00:22:33,680 za razliku od naziva datoteke, staff.csv? Je li to točno? Da. 269 00:22:33,680 --> 00:22:39,570 Dakle, neka je pogledati. Ako sam se vratiti na moj laptop, 270 00:22:39,570 --> 00:22:45,040 i pogledajmo na fclose funkciji. 271 00:22:45,040 --> 00:22:51,460 Dakle fclose funkcija zatvara tok i to traje u pokazivač do potoka koji želimo zatvoriti, 272 00:22:51,460 --> 00:22:57,010 za razliku od stvarnog naziva datoteke koje želimo zatvoriti. 273 00:22:57,010 --> 00:23:01,620 A to je zato što iza kulisa, kada upućivanje poziva fopen, 274 00:23:01,620 --> 00:23:12,020 kada otvorite datoteku, zapravo dodjele memorije za pohranu informacija o datoteci. 275 00:23:12,020 --> 00:23:16,380 Dakle, imate datoteke pokazivač koji ima informacije o datoteci, 276 00:23:16,380 --> 00:23:23,080 kao što je otvoren, njegova veličina, gdje ste trenutno u spisu, 277 00:23:23,080 --> 00:23:29,100 tako da možete napraviti čitanje i pisanje poziva na tom mjestu u datoteci. 278 00:23:29,100 --> 00:23:38,060 Možete završiti zatvaranjem pokazivač umjesto zatvaranja naziv datoteke. 279 00:23:38,060 --> 00:23:48,990 >> Da? [Daniel] Dakle, kako bi se koristiti najam, će vam reći - kako to dobiti korisničkog unosa? 280 00:23:48,990 --> 00:23:53,830 Da li fprintf djelovati kao GetString u smislu da ću samo čekati korisničkog unosa 281 00:23:53,830 --> 00:23:57,180 i pitati da upišete ovo - ili čekati za vas da upišite ove tri stvari u? 282 00:23:57,180 --> 00:24:00,480 Ili ne morate koristiti nešto za provedbu najam? 283 00:24:00,480 --> 00:24:04,100 >> Da. Dakle, mi nismo - pitanje je, kako smo dobili korisničkog unosa 284 00:24:04,100 --> 00:24:09,220 u cilju provođenja najam? A što imamo ovdje je pozivatelj od najma, 285 00:24:09,220 --> 00:24:17,690 donesen u ovom osoblja struct sa svim podacima pohranjenim u struct već. 286 00:24:17,690 --> 00:24:22,990 Dakle fprintf je u stanju samo napisati da podatke izravno u datoteku. 287 00:24:22,990 --> 00:24:25,690 Nema čekanja za unos korisnika. 288 00:24:25,690 --> 00:24:32,110 Korisnik je već dao doprinos po ispravno stavljajući ga u ovom osoblja struct. 289 00:24:32,110 --> 00:24:36,510 A stvari, naravno, ako će razbiti bilo koju od tih pokazivače bili null, 290 00:24:36,510 --> 00:24:40,370 pa smo pomicali natrag ovdje i gledamo naše struct. 291 00:24:40,370 --> 00:24:43,640 Imamo niz posljednji, string prvi, niz e-mail. 292 00:24:43,640 --> 00:24:48,530 Mi sada znamo da su svi oni stvarno, ispod haube, su char * varijable. 293 00:24:48,530 --> 00:24:53,470 To ne može ili može biti ukazujući na nulu. 294 00:24:53,470 --> 00:24:55,800 Oni mogu biti ukazujući na spomen na hrpi, 295 00:24:55,800 --> 00:24:59,650 možda memorije na stogu. 296 00:24:59,650 --> 00:25:04,580 Mi stvarno ne znam, ali ako bilo koji od ovih pokazivače su nula, ili je nevažeći, 297 00:25:04,580 --> 00:25:08,120 da da definitivno ću srušiti našu najam funkciju. 298 00:25:08,120 --> 00:25:11,050 To je nešto što je vrsta izvan opsega ispita. 299 00:25:11,050 --> 00:25:16,440 Mi ne brinući se o tome. 300 00:25:16,440 --> 00:25:22,170 Izvrsno. Ok. Tako se kreće od kviza. 301 00:25:22,170 --> 00:25:25,760 >> Ajmo zatvoriti ovaj momak, a mi ćemo gledati na pset 4. 302 00:25:25,760 --> 00:25:34,700 Dakle, ako vi pogledate pset spec., jednom možete pristupiti, cs50.net/quizzes, 303 00:25:34,700 --> 00:25:42,730 ćemo proći kroz nekoliko sekcija problema danas. 304 00:25:42,730 --> 00:25:52,240 Ja sam pomicanjem prema dolje - dio pitanja počinje na trećem stranici pset spec.. 305 00:25:52,240 --> 00:25:57,800 I prvi dio vas pita da ide i gledati kratko o preusmjeravanju i cijevi. 306 00:25:57,800 --> 00:26:02,820 Koja je vrsta super kratka, pokazuje neke nove, cool trikove naredbenog retka koje možete koristiti. 307 00:26:02,820 --> 00:26:06,050 I onda imamo nekoliko pitanja za vas kao dobro. 308 00:26:06,050 --> 00:26:10,860 Ovo prvo pitanje o potocima, na koje printf piše po defaultu, 309 00:26:10,860 --> 00:26:15,920 smo vrsta dotaknuo samo malo trenutak prije. 310 00:26:15,920 --> 00:26:22,380 Ovo fprintf da smo upravo raspravljali uzima u struji datoteke * kao svoj argument. 311 00:26:22,380 --> 00:26:26,580 fclose uzima u struji datoteke * kao dobro, 312 00:26:26,580 --> 00:26:32,660 i povratak vrijednost fopen vam daje tok datoteke * kao dobro. 313 00:26:32,660 --> 00:26:36,060 Razlog nismo vidjeli one prije kad smo se bavila printf 314 00:26:36,060 --> 00:26:39,450 je zbog printf ima zadani tok. 315 00:26:39,450 --> 00:26:41,810 I zadani potok na kojem piše 316 00:26:41,810 --> 00:26:45,190 ćete saznati u kratko. 317 00:26:45,190 --> 00:26:50,080 Dakle, definitivno pogledati njega. 318 00:26:50,080 --> 00:26:53,010 >> U današnjem odlomku, idemo razgovarati malo o GDB, 319 00:26:53,010 --> 00:26:57,720 budući da je više upoznati ste s njim, više praksa da se s njom, 320 00:26:57,720 --> 00:27:01,390 bolje mogućnosti ćete biti zapravo uloviti greške u vlastitom kodu. 321 00:27:01,390 --> 00:27:05,540 To ubrzava proces debugging se strahovito. 322 00:27:05,540 --> 00:27:09,230 Dakle, pomoću printf, svaki put kad to morate rekompiliranje svoj kôd, 323 00:27:09,230 --> 00:27:13,000 morate ga ponovno pokrenuti, ponekad morate premjestiti printf poziv okolo, 324 00:27:13,000 --> 00:27:17,100 komentirati se kod, to traje samo neko vrijeme. 325 00:27:17,100 --> 00:27:20,850 Naš cilj je pokušati uvjeriti da je s GDB, možete biti 326 00:27:20,850 --> 00:27:26,810 printf ništa u bilo kojem trenutku u vašem kodu, a da nikada ne morate ga rekompiliranje. 327 00:27:26,810 --> 00:27:35,120 Vi nikada nećete morati početi i zadržati guessing gdje printf sljedeći. 328 00:27:35,120 --> 00:27:40,910 Prva stvar za učiniti je da kopirate ovu liniju i dobiti odjeljak kod off webu. 329 00:27:40,910 --> 00:27:47,530 Ja sam kopiranje ovu liniju koda koji kaže, "wget ​​http://cdn.cs50.net". 330 00:27:47,530 --> 00:27:49,510 Ja ću ga kopirati. 331 00:27:49,510 --> 00:27:55,950 Ja ću ići preko moje aparata, zoom out, tako da možete vidjeti što radim, 332 00:27:55,950 --> 00:28:01,890 zalijepiti tamo, i kad sam pogodio Enter, ovo wget naredba doslovno je web dobili. 333 00:28:01,890 --> 00:28:06,210 To će srušiti ovu sliku s interneta, 334 00:28:06,210 --> 00:28:11,790 i to će ga spremiti u trenutnoj imenik. 335 00:28:11,790 --> 00:28:21,630 Sada, ako sam popis moj trenutni katalog možete vidjeti da sam dobio ovu section5.zip datoteku upravo tamo. 336 00:28:21,630 --> 00:28:25,260 Na način da se bave tim tipom je da ga unzip, 337 00:28:25,260 --> 00:28:27,650 što možete učiniti u zapovjednoj liniji, baš kao što je ovaj. 338 00:28:27,650 --> 00:28:31,880 Section5.zip. 339 00:28:31,880 --> 00:28:36,980 To će ga unzip, stvarati mape za mene, 340 00:28:36,980 --> 00:28:40,410 napuhati sve sadržaje, stavite ih tamo. 341 00:28:40,410 --> 00:28:47,410 Dakle, sada mogu ići u moj odjeljak 5 direktorij pomoću cd naredbu. 342 00:28:47,410 --> 00:28:58,310 Prazni zaslon koristeći jasno. Dakle, brisanje zaslona. 343 00:28:58,310 --> 00:29:02,280 Sada imam lijep čist terminal da se bave. 344 00:29:02,280 --> 00:29:06,200 >> Sada, ako sam popis svih datoteka koje vidim u ovaj direktorij, 345 00:29:06,200 --> 00:29:12,270 vidiš da sam dobio četiri datoteke: buggy1, buggy2, buggy3 i buggy4. 346 00:29:12,270 --> 00:29:16,180 Također sam dobio svoje odgovarajuće. C datoteke. 347 00:29:16,180 --> 00:29:20,400 Nećemo gledati na c. Datoteka za sada. 348 00:29:20,400 --> 00:29:24,140 Umjesto toga, mi ćemo ih koristiti kad smo otvoriti gdb. 349 00:29:24,140 --> 00:29:28,220 Mi smo ih čuva okolo, tako da imamo pristup stvarnog izvornog koda kada smo pomoću gdb, 350 00:29:28,220 --> 00:29:32,740 ali cilj ovog dijela poglavlja je prtljati oko s GDB 351 00:29:32,740 --> 00:29:40,370 i vidjeti kako ga možemo koristiti shvatiti što se događa u redu sa svakom od tih četiri Buggy programa. 352 00:29:40,370 --> 00:29:43,380 Dakle, mi smo samo ide po sobi jako brzo, 353 00:29:43,380 --> 00:29:47,000 i ja ću pitati nekoga za pokretanje jednog od Buggy programa, 354 00:29:47,000 --> 00:29:54,730 i onda ćemo ići kao skupina kroz GDB, pa ćemo vidjeti što možemo učiniti kako bi riješili ove programe, 355 00:29:54,730 --> 00:29:58,460 ili barem utvrditi što se događa krivo u svakoj od njih. 356 00:29:58,460 --> 00:30:04,760 Počnimo ovamo s Danielom. Hoćete li pokrenuti buggy1? Idemo vidjeti što se događa. 357 00:30:04,760 --> 00:30:09,470 [Daniel] Ona kaže da je primjena kriv. >> Da. Točno. 358 00:30:09,470 --> 00:30:12,460 Dakle, ako sam pokrenuti buggy1, ja dobiti SEG kvar. 359 00:30:12,460 --> 00:30:16,210 U ovom trenutku, mogao sam otići i otvoriti buggy1.c, 360 00:30:16,210 --> 00:30:19,450 pokušati shvatiti što se zbiva u krivu, 361 00:30:19,450 --> 00:30:22,000 ali jedan od najvažnijih antipatičan stvari o tom segmentu kvara pogreške 362 00:30:22,000 --> 00:30:27,610 je da se ne govori o tome što linija programskih stvari zapravo otišao u krivu i razbio. 363 00:30:27,610 --> 00:30:29,880 Vi vrsta morati pogledati koda 364 00:30:29,880 --> 00:30:33,990 i shvatiti pomoću pogodak i provjeriti ili printf da vidim što se događa u krivu. 365 00:30:33,990 --> 00:30:37,840 Jedna od najboljih stvari o GDB je da je to stvarno, stvarno lako 366 00:30:37,840 --> 00:30:42,170 shvatiti liniju na kojoj je vaš program ruši. 367 00:30:42,170 --> 00:30:46,160 Totalno je vrijedan da ga koristiti, čak i ako je samo za to. 368 00:30:46,160 --> 00:30:56,190 Dakle dignuti gdb, ja upišite gdb, a onda sam mu dati put do izvršnu da želim pokrenuti. 369 00:30:56,190 --> 00:31:01,960 Ovdje sam tipkati gdb ./buggy1. 370 00:31:01,960 --> 00:31:06,600 Hit Enter. Daje mi sve ove informacije o autorskim pravima, 371 00:31:06,600 --> 00:31:13,000 i ovdje dolje vidjet ćete ovu liniju koja kaže, "Čitanje simbola iz / home / 372 00:31:13,000 --> 00:31:17,680 jharvard/section5/buggy1. " 373 00:31:17,680 --> 00:31:22,060 A ako sve ide dobro, vidjet ćete ga ispisati poruku da izgleda ovako. 374 00:31:22,060 --> 00:31:25,500 To ću čitati simbole, to će reći: "Čitam simbole iz izvršnu datoteku" 375 00:31:25,500 --> 00:31:29,900 i onda će se ovaj "Gotovo" poruku ovdje. 376 00:31:29,900 --> 00:31:35,410 Ako vidite neke druge varijacije toga, ili ste vidjeli da nije mogao pronaći simbole 377 00:31:35,410 --> 00:31:41,460 ili nešto slično, što to znači je da jednostavno nije sastavio svoju izvršnu ispravno. 378 00:31:41,460 --> 00:31:49,980 Kada smo sastaviti programe za korištenje s GDB, moramo koristiti taj poseban-g zastavu, 379 00:31:49,980 --> 00:31:54,540 te da je učinjeno po defaultu ako prevesti svoje programe, samo upisivanjem napraviti 380 00:31:54,540 --> 00:31:59,320 ili napraviti buggy ili napraviti oporaviti, bilo onih. 381 00:31:59,320 --> 00:32:07,800 Ali, ako ste izradu ručno zveka, onda ćete morati ići i uključuju da-g zastavu. 382 00:32:07,800 --> 00:32:10,310 >> U ovom trenutku, da sada imamo gdb redak, 383 00:32:10,310 --> 00:32:12,310 to je prilično jednostavan za pokretanje programa. 384 00:32:12,310 --> 00:32:19,740 Mi može upisati stazu, ili možemo samo upišite r. 385 00:32:19,740 --> 00:32:22,820 Većina naredbi GDB može biti skraćeno. 386 00:32:22,820 --> 00:32:25,940 Obično se samo jednom ili nekoliko pisama, koje je prilično lijepo. 387 00:32:25,940 --> 00:32:30,980 Dakle Saad, ako Type R i pritisnite Enter, što se događa? 388 00:32:30,980 --> 00:32:39,390 [Saad] Imam SIGSEGV, segmentacije greška, a onda sve to črčkarija. 389 00:32:39,390 --> 00:32:43,650 >> Da. 390 00:32:43,650 --> 00:32:47,990 Kao što smo vidjeli na ekranu upravo sada, i kao Saad je rekao, 391 00:32:47,990 --> 00:32:53,430 kad smo upišite stazu ili R i pritisnite Enter, mi još uvijek dobiti istu grešku SEG. 392 00:32:53,430 --> 00:32:55,830 Dakle, koristite gdb ne riješi naš problem. 393 00:32:55,830 --> 00:32:59,120 No, to nam daje neku gobbledygook, a ispada da je ova črčkarija 394 00:32:59,120 --> 00:33:03,080 zapravo nam govori gdje se to događa. 395 00:33:03,080 --> 00:33:10,680 Da analizirati ovaj malo, ovaj prvi malo je funkcija u kojem će sve u redu. 396 00:33:10,680 --> 00:33:20,270 Tu je ovaj __ strcmp_sse4_2, a to nam govori da se to događa u ovoj datoteci 397 00:33:20,270 --> 00:33:29,450 zove sysdeps/i386, sve to, opet, vrsta nered - ali linija 254. 398 00:33:29,450 --> 00:33:31,670 To je vrsta teško analizirati. Obično kada vidite stvari kao što je ovaj, 399 00:33:31,670 --> 00:33:38,770 to znači da je SEG rasjedanja u jednom od sustava knjižnica. 400 00:33:38,770 --> 00:33:43,220 Tako nešto učiniti s strcmp. Vi ste vidjeli strcmp prije. 401 00:33:43,220 --> 00:33:52,730 Ne previše ludo, ali znači li to da strcmp slomljena ili da postoji problem s strcmp? 402 00:33:52,730 --> 00:33:57,110 Što mislite, Alexander? 403 00:33:57,110 --> 00:34:04,890 [Aleksandar] Je li to - je 254 linija? I - ne binarni, ali to nije njihova stropovi, 404 00:34:04,890 --> 00:34:10,590 i onda tu je još jedan jezik za svaku funkciju. Je li to 254 u toj funkciji, ili -? 405 00:34:10,590 --> 00:34:21,460 >> To je linija 254. To izgleda kao u ovoj. S. datoteku, tako da je sklop kod vjerojatno. 406 00:34:21,460 --> 00:34:25,949 >> Ali, valjda više dobilo je stvar, jer smo stečen SEG kvar, 407 00:34:25,949 --> 00:34:29,960 i to izgleda kao da dolazi iz strcmp funkciju, 408 00:34:29,960 --> 00:34:38,030 to znači, dakle, da je strcmp je slomljen? 409 00:34:38,030 --> 00:34:42,290 To ne bi trebao, nadamo se. Dakle, samo zato što imaju segmentacije grešku 410 00:34:42,290 --> 00:34:49,480 u jednoj od funkcija sustava, obično to znači da jednostavno nisu ga zove ispravno. 411 00:34:49,480 --> 00:34:52,440 Najbrži stvar za učiniti kako bi se shvatiti što se zapravo događa 412 00:34:52,440 --> 00:34:55,500 kad vidite nešto ludo ovako, kad god vidim SEG kvar, 413 00:34:55,500 --> 00:34:59,800 pogotovo ako imate program koji je koristeći više nego samo glavni, 414 00:34:59,800 --> 00:35:03,570 je koristiti povratno praćenje. 415 00:35:03,570 --> 00:35:13,080 Ja skratiti povratno praćenje pišući BT, za razliku do pune Povratno praćenje riječi. 416 00:35:13,080 --> 00:35:16,510 No, Charlotte, što se događa kad upišete BT i pogodak Ulaziti? 417 00:35:16,510 --> 00:35:23,200 [Charlotte] To mi pokazuje dvije linije, linija 0 i 1. redak. 418 00:35:23,200 --> 00:35:26,150 >> Da. Dakle linija između 0 i 1. redak. 419 00:35:26,150 --> 00:35:34,560 To su stvarni stack okviri koji su trenutno u igri kada je vaš program srušio. 420 00:35:34,560 --> 00:35:42,230 Počevši od najvišem okvira, frame 0, a ide na dno-većina, što je okvir 1. 421 00:35:42,230 --> 00:35:45,140 Naš vrhunski okvir je strcmp okvir. 422 00:35:45,140 --> 00:35:50,080 Možete misliti o tome što slično za taj problem smo samo radili na kvizu s pokazivačima, 423 00:35:50,080 --> 00:35:54,890 gdje smo zamijenili stog okvir na vrhu glavne stog okvira, 424 00:35:54,890 --> 00:35:59,700 i imali smo varijable koje Swap je koristite na vrhu varijabli koje glavni je koriste. 425 00:35:59,700 --> 00:36:08,440 Evo naša nesreća dogodila u našoj strcmp funkciju, koju je sazvao naš glavni funkciji, 426 00:36:08,440 --> 00:36:14,370 i povratno praćenje daje nam ne samo funkcije u kojoj stvari propustio, 427 00:36:14,370 --> 00:36:16,440 ali to je također nam reći gdje je sve bio pozvan od. 428 00:36:16,440 --> 00:36:18,830 Dakle, ako sam pomicanje preko malo više na desno, 429 00:36:18,830 --> 00:36:26,110 možemo vidjeti da, da, bili smo na liniji 254 ovog strcmp-sse4.s datoteku. 430 00:36:26,110 --> 00:36:32,540 No, upućen je poziv na buggy1.c, linije 6. 431 00:36:32,540 --> 00:36:35,960 Dakle, to znači da možemo učiniti je - možemo ići provjeriti i vidjeti što se događa 432 00:36:35,960 --> 00:36:39,930 na buggy1.c, linije 6. 433 00:36:39,930 --> 00:36:43,780 Opet, postoji nekoliko načina da to učinite. Jedan od njih je za izlazak iz GDB 434 00:36:43,780 --> 00:36:49,460 ili imaju svoj kod otvoriti u drugom prozoru i cross reference. 435 00:36:49,460 --> 00:36:54,740 To, samo po sebi, je prilično zgodan, jer sada, ako ste u uredovno vrijeme 436 00:36:54,740 --> 00:36:57,220 i imaš SEG kvar i vaš TF je pitate gdje je sve nego, 437 00:36:57,220 --> 00:36:59,710 možete samo reći: "Oh, linija 6. Ne znam što se događa, 438 00:36:59,710 --> 00:37:03,670 ali nešto o liniji šest uzrokuje moj program za break. " 439 00:37:03,670 --> 00:37:10,430 Drugi način da to učinite je možete koristiti ovu naredbu zove popis u GDB. 440 00:37:10,430 --> 00:37:13,650 Također ga možete skratiti sa l. 441 00:37:13,650 --> 00:37:18,910 Dakle, ako smo pogodak l, što smo dobili ovdje? 442 00:37:18,910 --> 00:37:21,160 Mi smo dobili hrpu čudne stvari. 443 00:37:21,160 --> 00:37:26,030 Ovo je stvarni sklop kod 444 00:37:26,030 --> 00:37:29,860 koji je u strcmp_sse4_2. 445 00:37:29,860 --> 00:37:32,440 Ovo izgleda vrsta funky, 446 00:37:32,440 --> 00:37:36,520 i razlog da smo uzimajući to je zato što upravo sada, 447 00:37:36,520 --> 00:37:40,160 GDB nas ima u kadru 0. 448 00:37:40,160 --> 00:37:43,070 >> Dakle, bilo gledamo varijabli, svaki put gledamo izvornog koda, 449 00:37:43,070 --> 00:37:50,530 gledamo izvornog koda koji se odnosi na stog okvir smo trenutno u. 450 00:37:50,530 --> 00:37:53,200 Dakle, kako bi dobili ništa smisleno, moramo 451 00:37:53,200 --> 00:37:57,070 premjestiti na stog okvir koji čini više smisla. 452 00:37:57,070 --> 00:38:00,180 U ovom slučaju, glavni okvir stog bi malo više smisla, 453 00:38:00,180 --> 00:38:02,680 jer to je zapravo kod koji smo pisali. 454 00:38:02,680 --> 00:38:05,330 Ne strcmp broj. 455 00:38:05,330 --> 00:38:08,650 Način na koji se može kretati između okvira, u ovom slučaju, jer imamo dva, 456 00:38:08,650 --> 00:38:10,430 imamo 0 i 1, 457 00:38:10,430 --> 00:38:13,650 li to učiniti s gore i dolje naredbi. 458 00:38:13,650 --> 00:38:18,480 Ako sam se pomaknuli jednu okvir, 459 00:38:18,480 --> 00:38:21,770 sada sam u glavnom izlazu okvira. 460 00:38:21,770 --> 00:38:24,330 Ja mogu pomaknuti prema dolje da se vrati na mjesto gdje sam bio, 461 00:38:24,330 --> 00:38:32,830 ići gore opet, ići dolje opet, i opet ići gore. 462 00:38:32,830 --> 00:38:39,750 Ako ste ikada učiniti svoj program u GDB, možete dobiti sudar, možete dobiti povratno praćenje, 463 00:38:39,750 --> 00:38:42,380 i vidjet ćete da je to u nekom datotekom da ne zna što se događa. 464 00:38:42,380 --> 00:38:45,460 Možete pokušati popis, broj ne izgleda upoznat s tobom, 465 00:38:45,460 --> 00:38:48,150 pogledati svoje okvire i shvatiti gdje se nalazite. 466 00:38:48,150 --> 00:38:51,010 Vjerojatno si u krivom stog okvira. 467 00:38:51,010 --> 00:38:58,760 Ili barem si u stog okvir koji nije onaj koji ti stvarno mogu debug. 468 00:38:58,760 --> 00:39:03,110 Sada smo u odgovarajućem stog okvira, mi smo u glavni, 469 00:39:03,110 --> 00:39:08,100 Sada možemo koristiti naredbu popisa shvatiti što je linija bila. 470 00:39:08,100 --> 00:39:13,590 A možete ga vidjeti, to je tiskan za nas ovdje. 471 00:39:13,590 --> 00:39:19,470 No, možemo udariti popis svi isti, a popis daje nam ovu lijepu ispis 472 00:39:19,470 --> 00:39:23,920 od stvarnog izvornog koda koji je ovdje događa. 473 00:39:23,920 --> 00:39:26,420 >> Konkretno, možemo pogledati liniji šest. 474 00:39:26,420 --> 00:39:29,330 Možemo vidjeti što se ovdje događa. 475 00:39:29,330 --> 00:39:31,250 I to izgleda kao da smo izradu string usporedbu 476 00:39:31,250 --> 00:39:41,050 između niza "CS50 stijena" i argv [1]. 477 00:39:41,050 --> 00:39:45,700 Nešto o tome je pad. 478 00:39:45,700 --> 00:39:54,120 Dakle, Missy, imate bilo kakve misli na ono što bi moglo biti događa ovdje? 479 00:39:54,120 --> 00:39:59,400 [Missy] Ne znam zašto je pad. >> Ne znam zašto se to pad? 480 00:39:59,400 --> 00:40:02,700 Jimmy, sve misli? 481 00:40:02,700 --> 00:40:06,240 [Jimmy] Nisam posve siguran, ali zadnji put kad smo koristili niz usporediti, 482 00:40:06,240 --> 00:40:10,260 ili strcmp, kao što smo imali tri različita slučaja pod njim. 483 00:40:10,260 --> 00:40:12,800 Nismo imati ==, ne mislim, jel u toj prvoj liniji. 484 00:40:12,800 --> 00:40:16,700 Umjesto toga, on je bio podijeljen u tri, a jedan je bio == 0, 485 00:40:16,700 --> 00:40:19,910 jedan je <0, mislim, i jedan je> 0. 486 00:40:19,910 --> 00:40:22,590 Dakle, možda nešto kao što je to? >> Da. Dakle, tu je taj problem 487 00:40:22,590 --> 00:40:27,200 od činimo usporedbu ispravno? 488 00:40:27,200 --> 00:40:31,660 Stella? Bilo misli? 489 00:40:31,660 --> 00:40:38,110 [Stella] nisam siguran. >> Ne znam. Daniel? Misli? Ok. 490 00:40:38,110 --> 00:40:44,770 Ispada ono što se događa ovdje je kada smo trčali program 491 00:40:44,770 --> 00:40:48,370 i dobili smo SEG kvar, kada ste pokrenuli program za prvi put, Daniel 492 00:40:48,370 --> 00:40:50,800 jesi li mu dati nikakve argumente naredbenog retka? 493 00:40:50,800 --> 00:40:58,420 [Daniel] No >> broj U tom slučaju, ono što je vrijednost argv [1]? 494 00:40:58,420 --> 00:41:00,920 >> Nema vrijednost. >> Točno. 495 00:41:00,920 --> 00:41:06,120 Pa, ne postoji odgovarajući string vrijednost. 496 00:41:06,120 --> 00:41:10,780 No, tu je neke vrijednosti. Što je vrijednost koja dobiva pohranjen unutra? 497 00:41:10,780 --> 00:41:15,130 >> Smeća vrijednost? >> To je bilo smeća vrijednost ili, u ovom slučaju, 498 00:41:15,130 --> 00:41:19,930 kraj argv niz uvijek prestaje sa null. 499 00:41:19,930 --> 00:41:26,050 Dakle, ono što je zapravo dobio pohranjeni u tu je nula. 500 00:41:26,050 --> 00:41:30,810 Drugi način da se riješi to, nego ga razmišljanja kroz, 501 00:41:30,810 --> 00:41:33,420 je pokušati ga ispišete. 502 00:41:33,420 --> 00:41:35,880 Ovo je mjesto gdje sam rekao da koristite gdb je super, 503 00:41:35,880 --> 00:41:40,640 jer možete ispisati sve varijable, sve vrijednosti za koje želite 504 00:41:40,640 --> 00:41:43,230 Korištenjem ove ruci-Dandy p naredbu. 505 00:41:43,230 --> 00:41:48,520 Dakle, ako sam tip P i onda sam upisati vrijednost varijable ili naziv varijable, 506 00:41:48,520 --> 00:41:55,320 recimo, argc, vidim da argc je jedan. 507 00:41:55,320 --> 00:42:01,830 Ako želim isprintati argv [0], ja mogu učiniti baš kao da. 508 00:42:01,830 --> 00:42:04,840 I kao što smo vidjeli, argv [0] je uvijek ime svog programa, 509 00:42:04,840 --> 00:42:06,910 Uvijek naziv izvršne datoteke. 510 00:42:06,910 --> 00:42:09,740 Ovdje možete vidjeti da je dobio punu put ime. 511 00:42:09,740 --> 00:42:15,920 Ja također može ispisati iz argv [1] i vidjeti što se događa. 512 00:42:15,920 --> 00:42:20,890 >> Ovdje smo dobili ovu vrstu mistične vrijednosti. 513 00:42:20,890 --> 00:42:23,890 Dobili smo ovu 0x0. 514 00:42:23,890 --> 00:42:27,850 Sjetite se na početku mandata, kada smo razgovarali o heksadecimalni brojevi? 515 00:42:27,850 --> 00:42:34,680 Ili da malo pitanje na kraju pset 0 o tome da predstavljaju 50 u hex? 516 00:42:34,680 --> 00:42:39,410 Način na koji smo pisati heksadecimalni brojevi u CS, samo ne sebe zbuniti 517 00:42:39,410 --> 00:42:46,080 s decimalnim brojevima, je da smo ih uvijek prefiks s 0x. 518 00:42:46,080 --> 00:42:51,420 Dakle, ovo 0x prefiks uvijek samo znači interpretirati sljedeći broj kao heksadecimalni broj, 519 00:42:51,420 --> 00:42:57,400 ne kao niz, a ne kao decimalni broj, a ne kao binarni broj. 520 00:42:57,400 --> 00:43:02,820 Budući da je broj 5-0 je ispravan broj u heksadecimalnom. 521 00:43:02,820 --> 00:43:06,240 I to je broj u decimalu, 50. 522 00:43:06,240 --> 00:43:10,050 Dakle, ovo je samo koliko smo disambiguate. 523 00:43:10,050 --> 00:43:14,860 Dakle, 0x0 znači heksadecimalni 0, što je također decimalni 0, binarni 0. 524 00:43:14,860 --> 00:43:17,030 To je samo vrijednost 0. 525 00:43:17,030 --> 00:43:22,630 Ispada da je to ono što null je, zapravo, u sjećanju. 526 00:43:22,630 --> 00:43:25,940 Nula je samo 0. 527 00:43:25,940 --> 00:43:37,010 Ovdje, element pohranjeni na argv [1] je null. 528 00:43:37,010 --> 00:43:45,220 Dakle, mi pokušavamo usporediti našu "CS50 stijene" niz u prazan niz. 529 00:43:45,220 --> 00:43:48,130 Dakle dereferencing null, pokušavate pristupiti stvari na null, 530 00:43:48,130 --> 00:43:55,050 oni obično idu izazvati neku vrstu segmentacije kvara ili drugih loših stvari događaju. 531 00:43:55,050 --> 00:43:59,350 I ispada da strcmp ne provjeriti 532 00:43:59,350 --> 00:44:04,340 da li ili ne ste prošli u vrijednosti koja je nula. 533 00:44:04,340 --> 00:44:06,370 Umjesto toga, ona samo ide naprijed, pokušava učiniti svoj posao, 534 00:44:06,370 --> 00:44:14,640 i ako SEG grešaka, to SEG grešaka, i to je tvoj problem. Morate ići to popraviti. 535 00:44:14,640 --> 00:44:19,730 Stvarno brzo, kako bismo mogli riješiti ovaj problem? Charlotte? 536 00:44:19,730 --> 00:44:23,540 [Charlotte] možete provjeriti pomoću li. 537 00:44:23,540 --> 00:44:32,240 Dakle, ako argv [1] je null, == 0, a zatim se vratiti 1, ili nešto [nerazumljiv]. 538 00:44:32,240 --> 00:44:34,590 >> Da. Dakle, to je jedan sjajan način da to učinite, kao što možemo provjeriti, 539 00:44:34,590 --> 00:44:39,230 vrijednost smo o proći u strcmp, argv [1], je li null? 540 00:44:39,230 --> 00:44:45,830 Ako je to nula, onda možemo reći ok, pobaciti. 541 00:44:45,830 --> 00:44:49,450 >> Češći način da to učinite je da koristite argc vrijednost. 542 00:44:49,450 --> 00:44:52,040 Možete vidjeti ovdje na početku glavne, 543 00:44:52,040 --> 00:44:58,040 smo izostavili taj prvi test koji se obično učiniti kada ćemo koristiti argumente naredbenog retka, 544 00:44:58,040 --> 00:45:05,240 koji je za testiranje da li ili ne naša argc vrijednost je ono što smo očekivali. 545 00:45:05,240 --> 00:45:10,290 U ovom slučaju, mi smo očekivali barem dva argumenta, 546 00:45:10,290 --> 00:45:13,660 Naziv programa plus jedan drugoga. 547 00:45:13,660 --> 00:45:17,140 Budući da smo o tome kako koristiti drugi argument ovdje. 548 00:45:17,140 --> 00:45:21,350 Tako da nekakvu testa unaprijed, prije našeg poziva strcmp 549 00:45:21,350 --> 00:45:37,390 da testovi li ili ne argv je najmanje dva, također će učiniti istu vrstu stvari. 550 00:45:37,390 --> 00:45:40,620 Možemo vidjeti ako to radi tako da pokrenete program. 551 00:45:40,620 --> 00:45:45,610 Uvijek možete ponovno pokrenuti programa unutar GDB, što je jako lijepo. 552 00:45:45,610 --> 00:45:49,310 Možete pokrenuti, a kada prođe u argumente za svoj program, 553 00:45:49,310 --> 00:45:53,060 ih proći prilikom poziv pokrenuti, a ne kada se dignuti gdb. 554 00:45:53,060 --> 00:45:57,120 Na taj način možete zadržati pozivajući svoj program s različitim argumentima svaki put. 555 00:45:57,120 --> 00:46:08,080 Tako trčite, ili opet, mogu upisati r, pa da vidimo što će se dogoditi ako upišete "halo". 556 00:46:08,080 --> 00:46:11,140 Uvijek će vas pitati želite li ga početi iz početka. 557 00:46:11,140 --> 00:46:17,490 Obično, vi ne želite da ga početi iz početka. 558 00:46:17,490 --> 00:46:25,010 I u ovom trenutku, to ponovno opet, to ispisuje 559 00:46:25,010 --> 00:46:28,920 program koji smo trčanje, buggy1, s argumentom Hello, 560 00:46:28,920 --> 00:46:32,720 i ispisuje ovaj standardni out, ona kaže: "Ti dvojku", tužno lice. 561 00:46:32,720 --> 00:46:37,610 Ali mi nije SEG kvar. On je rekao da je proces izašao normalno. 562 00:46:37,610 --> 00:46:39,900 Tako da izgleda prilično dobro. 563 00:46:39,900 --> 00:46:43,050 Nema više segmenata kriv, mi je napravio to prošlost, 564 00:46:43,050 --> 00:46:48,190 tako da izgleda kao da je doista segment kriv bug koji smo dobivali. 565 00:46:48,190 --> 00:46:51,540 Nažalost, to nam govori da smo uzimajući D. 566 00:46:51,540 --> 00:46:54,090 >> Možemo se vratiti i pogledati kôd i vidjeti što se događa tamo 567 00:46:54,090 --> 00:46:57,980 shvatiti što je - zašto je nam govori da imamo D. 568 00:46:57,980 --> 00:47:03,690 Hajdemo vidjeti, ovdje je to printf rekavši da imaš D. 569 00:47:03,690 --> 00:47:08,540 Ako upišite popis, kao što držati tipkanjem popisa, on drži Ponavljanje kroz svoj program, 570 00:47:08,540 --> 00:47:10,940 tako da ću vam pokazati prvih nekoliko redaka svom programu. 571 00:47:10,940 --> 00:47:15,450 Tada ću vam pokazati sljedećoj nekoliko redaka, a sljedeći blok i sljedeći komad. 572 00:47:15,450 --> 00:47:18,240 I to ću zadržati pokušava ići dolje. 573 00:47:18,240 --> 00:47:21,180 A sada ćemo doći do "postroje broj 16 je izvan dometa." 574 00:47:21,180 --> 00:47:23,940 Budući da ima samo 15 redaka. 575 00:47:23,940 --> 00:47:30,310 Ako dođete do ove točke i vaš pitate, "Što da učinim?" možete koristiti naredbu pomoć. 576 00:47:30,310 --> 00:47:34,340 Koristite pomoći, a zatim dati mu ime naredbe. 577 00:47:34,340 --> 00:47:36,460 A vidiš GDB nam daje sve ovu vrstu stvari. 578 00:47:36,460 --> 00:47:43,870 Ona kaže, "Bez argumenta, navodi deset više linija nakon ili oko prethodnom popisu. 579 00:47:43,870 --> 00:47:47,920 Popis - navodi deset linije prije - " 580 00:47:47,920 --> 00:47:52,960 Dakle, pokušajmo pomoću popisa minusa. 581 00:47:52,960 --> 00:47:57,000 I to navodi u 10 redaka natrag, možete se poigrati s popisa malo. 582 00:47:57,000 --> 00:48:02,330 Možete napraviti popis, popis -, možete čak i dati popis nekoliko, kao što je popis 8, 583 00:48:02,330 --> 00:48:07,500 i to ću navesti 10 linije oko linija 8. 584 00:48:07,500 --> 00:48:10,290 A možete vidjeti što se ovdje događa je da ste je dobio jednostavan ako drugdje. 585 00:48:10,290 --> 00:48:13,980 Ako ste upisali u CS50 stijenama, ona ispisuje "Vi dobijete A." 586 00:48:13,980 --> 00:48:16,530 Inače ga ispisuje "Vi dobiti D." 587 00:48:16,530 --> 00:48:23,770 Sori grad. U redu. Da? 588 00:48:23,770 --> 00:48:26,730 >> [Daniel] Dakle, kada sam pokušao raditi CS50 stijene bez navodnika, 589 00:48:26,730 --> 00:48:29,290 ona kaže: "Vi dobiti D." 590 00:48:29,290 --> 00:48:32,560 Morao sam citati da bi to raditi, zašto je to? 591 00:48:32,560 --> 00:48:38,490 >> Da. Ispada da kada - to je još jedna zabavna mala poslastica - 592 00:48:38,490 --> 00:48:47,900 kada pokrenete program, ako ćemo ga pokrenuti i mi upisati u CS50 stijenama, 593 00:48:47,900 --> 00:48:50,800 baš kao i Daniel je rekao što je učinio, a vi pritisnite Enter, 594 00:48:50,800 --> 00:48:52,870 to još uvijek kaže da smo dobili D. 595 00:48:52,870 --> 00:48:55,580 A pitanje je, zašto je ovo? 596 00:48:55,580 --> 00:49:02,120 I ispada da su oba naša terminal i GDB analizirati ih kao dvije zasebne argumenata. 597 00:49:02,120 --> 00:49:04,800 Jer kada postoji prostor, koji je podrazumijevao kao 598 00:49:04,800 --> 00:49:08,730 Prvi argument je završio, sljedeći argument je oko za početak. 599 00:49:08,730 --> 00:49:13,260 Način da kombiniraju one u dva, ili oprostite, u jednog argumenta, 600 00:49:13,260 --> 00:49:18,510 je koristiti citati. 601 00:49:18,510 --> 00:49:29,560 Tako sada, ako smo ga staviti u navodnike i pokrenite ga opet, dobivamo A. 602 00:49:29,560 --> 00:49:38,780 Dakle, samo da podsjetimo, bez navodnika, CS50 i stijene se raščlaniti kao dvije zasebne argumenata. 603 00:49:38,780 --> 00:49:45,320 S navodnicima, to je analiziran kao jedan argument uopce. 604 00:49:45,320 --> 00:49:53,070 >> Možemo vidjeti ovo s prelomne tačke. 605 00:49:53,070 --> 00:49:54,920 Do sada smo bili trčanje naš program, i to je bio trčanje 606 00:49:54,920 --> 00:49:58,230 dok bilo to SEG grešaka ili pogodaka pogrešku 607 00:49:58,230 --> 00:50:05,930 ili dok je izašao i sve je potpuno u redu. 608 00:50:05,930 --> 00:50:08,360 To ne mora nužno biti najkorisnija stvar, jer ponekad 609 00:50:08,360 --> 00:50:11,840 imate grešku u svom programu, ali to ne uzrokuje segmentaciju grešku. 610 00:50:11,840 --> 00:50:16,950 To nije uzrok svoj program da se zaustavi ili bilo što slično. 611 00:50:16,950 --> 00:50:20,730 Način da se GDB pauzirati vaš program u određenom trenutku 612 00:50:20,730 --> 00:50:23,260 je postaviti točke prekida. 613 00:50:23,260 --> 00:50:26,520 Možete to učiniti postavljanjem točke prekida na naziva funkcije 614 00:50:26,520 --> 00:50:30,770 ili možete postaviti točke prekida na određenoj liniji koda. 615 00:50:30,770 --> 00:50:34,450 Volim da postavite prijelomnih točaka na funkciju imena, jer - lako zapamtiti, 616 00:50:34,450 --> 00:50:37,700 i ako zaista otići i promijeniti svoj izvorni kod se malo, 617 00:50:37,700 --> 00:50:42,020 onda tvoj prijelomna točka zapravo će ostati na istom mjestu u kodu. 618 00:50:42,020 --> 00:50:44,760 Dok ako koristite brojeve redaka, a linija brojevi promijeniti 619 00:50:44,760 --> 00:50:51,740 zato što dodati ili izbrisati neki kod, a zatim svoje prijelomnih točaka su svi totalno zeznuo. 620 00:50:51,740 --> 00:50:58,590 Jedan od najčešćih stvari koje sam učiniti je postaviti točke prekida na glavnoj funkciji. 621 00:50:58,590 --> 00:51:05,300 Često ću dignuti gdb, ja ću Tip B Main, pritisnite Enter, i da ću postaviti točke prekida 622 00:51:05,300 --> 00:51:10,630 na glavnoj funkciji koja samo kaže, "Pauza program čim početi prikazivati" 623 00:51:10,630 --> 00:51:17,960 i na taj način, kada sam se pokreću moj program sa, recimo, CS50 stijenama kao dva argumenta 624 00:51:17,960 --> 00:51:24,830 i pritisnite Enter, ona dobiva glavnu funkciju i to prestaje pravo na vrlo prvoj liniji, 625 00:51:24,830 --> 00:51:30,620 pravo prije nego što ga ocjenjuje strcmp funkciju. 626 00:51:30,620 --> 00:51:34,940 >> Budući da sam zastao, sada mogu početi mucking oko sebe i vidjeti što se događa 627 00:51:34,940 --> 00:51:40,250 sa svim različitim varijablama koje su prošli u mom programu. 628 00:51:40,250 --> 00:51:43,670 Ovdje mogu ispisati argc i vidjeti što se događa. 629 00:51:43,670 --> 00:51:50,030 Pogledajte kako argc je 3, jer ima tri različite vrijednosti u njemu. 630 00:51:50,030 --> 00:51:54,060 To je dobio naziv programa, to je dobio prvi argument i drugi argument. 631 00:51:54,060 --> 00:52:09,330 Možemo ispisati one od strane gleda na argv [0], argv [1], a argv [2]. 632 00:52:09,330 --> 00:52:12,030 Dakle, sada možete vidjeti zašto se to strcmp poziv će uspjeti, 633 00:52:12,030 --> 00:52:21,650 jer vidiš da je podijeljen do CS50 i stijene u dvije zasebne argumenata. 634 00:52:21,650 --> 00:52:27,250 U ovom trenutku, nakon što ste pogoditi točke prekida, možete nastaviti na korak kroz svoj program 635 00:52:27,250 --> 00:52:32,920 redak po redak, za razliku od pokretanja programa ponovno. 636 00:52:32,920 --> 00:52:35,520 Dakle, ako ne želite pokrenuti svoj program i opet samo dalje od ovog, 637 00:52:35,520 --> 00:52:41,970 možete koristiti naredbu nastaviti i dalje će pokrenuti program do kraja. 638 00:52:41,970 --> 00:52:45,010 Baš kao što je to učinio ovdje. 639 00:52:45,010 --> 00:52:54,880 Međutim, ako sam ponovno pokrenuti program, CS50 stijene, pogodi moje točke prekida opet, 640 00:52:54,880 --> 00:52:59,670 i ovaj put, ako ja ne želim samo ići sve na putu kroz ostatak programa, 641 00:52:59,670 --> 00:53:08,040 Ja mogu koristiti slijedeću naredbu, koji sam također skratiti s n. 642 00:53:08,040 --> 00:53:12,960 I ovaj će korak kroz program liniju po liniju. 643 00:53:12,960 --> 00:53:17,530 Tako možete gledati kao stvari izvršiti, kao varijable promjene, kao što se stvari ažuriraju. 644 00:53:17,530 --> 00:53:21,550 Koji je prilično lijepo. 645 00:53:21,550 --> 00:53:26,570 Druga super stvar je nego ponavlja istu naredbu iznova i iznova i iznova, 646 00:53:26,570 --> 00:53:30,670 ako samo pritisnite Enter - pa evo vidite nisam upisali u ništa - 647 00:53:30,670 --> 00:53:33,780 ako sam pogodio Enter, to će ponoviti prethodne naredbe, 648 00:53:33,780 --> 00:53:36,900 ili prethodnu naredbu GDB da sam samo staviti u. 649 00:53:36,900 --> 00:53:56,000 Ja mogu držati udarajući Unesite i to ću zadržati koračni kroz moje koda liniju po liniju. 650 00:53:56,000 --> 00:53:59,310 Ja bi potaknuti vi ići provjeriti druge lud programe kao dobro. 651 00:53:59,310 --> 00:54:01,330 Mi nemamo vremena da se kroz sve njih danas u sekciji. 652 00:54:01,330 --> 00:54:05,890 Izvorni kod je tamo, tako da možete nekako vidjeti što se događa 653 00:54:05,890 --> 00:54:07,730 iza scene ako stvarno zapeti, 654 00:54:07,730 --> 00:54:11,940 ali barem, samo vježbati čizma gore gdb, 655 00:54:11,940 --> 00:54:13,940 pokretanja programa sve dok se lomi na vas, 656 00:54:13,940 --> 00:54:18,260 uzimajući povratno praćenje, figuring out ono što funkcionira sudar je bio u, 657 00:54:18,260 --> 00:54:24,450 ono linija je bila na, ispis neke promjenjive vrijednosti, 658 00:54:24,450 --> 00:54:30,140 samo tako da ćete dobiti osjećaj za to, jer je to stvarno će vam pomoći da ide naprijed. 659 00:54:30,140 --> 00:54:36,340 U ovom trenutku, mi ćemo prestati iz GDB, koje ne koristite prestati ili samo q. 660 00:54:36,340 --> 00:54:40,460 Ako je vaš program u sredini radi i dalje, a to nije izašao, 661 00:54:40,460 --> 00:54:43,510 uvijek će vas pitati "Jeste li sigurni da stvarno želite prestati?" 662 00:54:43,510 --> 00:54:48,770 Možete samo pogoditi da. 663 00:54:48,770 --> 00:54:55,250 >> Sada ćemo pogledati na sljedećem problema koje imamo, a to je mačka programa. 664 00:54:55,250 --> 00:54:59,880 Ako gledate na kratko preusmjeravanje i cijevi, vidjet ćete da je Tommy koristi ovaj program 665 00:54:59,880 --> 00:55:07,540 da je u osnovi ispisuje sve izlaz u datoteku na zaslonu. 666 00:55:07,540 --> 00:55:12,660 Dakle, ako sam pokrenuti mačka, to je zapravo izgrađen-in program za aparata, 667 00:55:12,660 --> 00:55:16,860 i ako imate Mac možete to učiniti na vašem Macu, ako vam se otvoriti terminal. 668 00:55:16,860 --> 00:55:25,630 A mi - mačka, recimo, cp.c, i pritisnite Enter. 669 00:55:25,630 --> 00:55:29,640 Što je to učinio, ako mi pomicanje gore malo i vidjeti gdje smo trčali liniju, 670 00:55:29,640 --> 00:55:40,440 ili gdje smo trčali mačka naredbu, to doslovno samo ispisati sadržaj cp.c našem zaslonu. 671 00:55:40,440 --> 00:55:44,140 Možemo ga ponovno pokrenuti i možete staviti u više datoteka zajedno. 672 00:55:44,140 --> 00:55:49,880 Dakle, što možete učiniti mačka cp.c, a onda možemo spojite na cat.c datoteku, 673 00:55:49,880 --> 00:55:53,250 koji je program smo napisati, 674 00:55:53,250 --> 00:55:58,140 i to će ispisati obje datoteke natrag na leđa našoj zaslonu. 675 00:55:58,140 --> 00:56:05,490 Dakle, ako smo se pomicali gore malo, vidimo da, kada smo trčali ovaj mačka cp.c, cat.c, 676 00:56:05,490 --> 00:56:17,110 prvi je tiskan CP datoteku, a zatim ispod njega, to ispisati iz cat.c datoteku upravo ovdje dolje. 677 00:56:17,110 --> 00:56:19,650 Mi ćemo koristiti to samo dobiti naše noge mokro. 678 00:56:19,650 --> 00:56:25,930 Poigrajte se s jednostavnim ispis na terminalu, vidjeti kako se to radi. 679 00:56:25,930 --> 00:56:39,170 Ako ti dečki otvaraju sa gedit cat.c, pritisnite Enter, 680 00:56:39,170 --> 00:56:43,760 možete vidjeti program da smo o tome pisati. 681 00:56:43,760 --> 00:56:48,980 Uključili smo ovu lijepu kotao ploča, tako da ne morate trošiti vrijeme tipkati sve da van. 682 00:56:48,980 --> 00:56:52,310 Također smo provjeriti broj argumenata prošao i. 683 00:56:52,310 --> 00:56:56,910 Mi ispisati lijep običaj poruku. 684 00:56:56,910 --> 00:57:00,950 >> To je vrsta stvar koja, opet, kao što smo razgovarali o tome, 685 00:57:00,950 --> 00:57:04,490 to je gotovo kao mišića memorije. 686 00:57:04,490 --> 00:57:07,190 Dovoljno je sjetiti se držati događaj istu vrstu stvari 687 00:57:07,190 --> 00:57:11,310 i uvijek ispisuje nekakav korisne poruke 688 00:57:11,310 --> 00:57:17,670 tako da ljudi znaju kako pokrenuti vaš program. 689 00:57:17,670 --> 00:57:21,630 Sa mačka, to je prilično jednostavan, samo mi ćemo proći kroz sve različite argumente 690 00:57:21,630 --> 00:57:24,300 koji su doneseni na našem programu, a mi idemo za ispis 691 00:57:24,300 --> 00:57:29,950 njihov sadržaj van na zaslonu jedna na vrijeme. 692 00:57:29,950 --> 00:57:35,670 Kako bi se ispisati datoteke iz na zaslonu, idemo napraviti nešto vrlo slično 693 00:57:35,670 --> 00:57:38,120 na ono što je na kraju kviza. 694 00:57:38,120 --> 00:57:45,350 Na kraju kviza, da unajmi program, morali smo otvoriti datoteku, 695 00:57:45,350 --> 00:57:48,490 i onda smo imali za ispis na njega. 696 00:57:48,490 --> 00:57:54,660 U tom slučaju, mi ćemo otvoriti datoteku, a mi ćemo čitati iz njega umjesto. 697 00:57:54,660 --> 00:58:00,630 Onda ćemo ispisati, umjesto u datoteku, idemo za ispis na zaslonu. 698 00:58:00,630 --> 00:58:05,830 Dakle, ispis na ekranu svi ste učinili prije s printf. 699 00:58:05,830 --> 00:58:08,290 Dakle, to nije previše ludo. 700 00:58:08,290 --> 00:58:12,190 No, čitanje datoteke je vrsta čudno. 701 00:58:12,190 --> 00:58:17,300 Mi ćemo proći kroz taj malo na vrijeme. 702 00:58:17,300 --> 00:58:20,560 Ako vi vratiti taj zadnji problema na kvizu, problematičnom 33, 703 00:58:20,560 --> 00:58:27,280 prvi red da ćemo učiniti ovdje, otvaranje datoteka, vrlo slično onome što smo radili tamo. 704 00:58:27,280 --> 00:58:36,370 Dakle, Stella, što se tu liniju izgledati, kada smo otvorili datoteku? 705 00:58:36,370 --> 00:58:47,510 [Stella] Kapital SLIKA *, datoteka - >> Dobro. >> - Je jednaka fopen. >> Yup. 706 00:58:47,510 --> 00:58:55,980 Koja je u ovom slučaju? To je u komentaru. 707 00:58:55,980 --> 00:59:06,930 >> To je u komentaru? argv [i] i R? 708 00:59:06,930 --> 00:59:11,300 >> Točno. Pravo na. Dakle, Stella je totalno u pravu. 709 00:59:11,300 --> 00:59:13,720 To je ono što izgleda kao linija. 710 00:59:13,720 --> 00:59:19,670 Idemo dobiti varijablu datoteke potok, spremite ga u datoteku *, tako da sve kape, 711 00:59:19,670 --> 00:59:25,720 SLIKA, *, a ime ove varijable će biti datoteka. 712 00:59:25,720 --> 00:59:32,250 Mogli bismo ga nazvati ono što smo željeli. Mogli bismo ga nazvati first_file, ili file_i, ono što smo željeli. 713 00:59:32,250 --> 00:59:37,590 I onda ime datoteke je prošao u na naredbenog retka za ovaj program. 714 00:59:37,590 --> 00:59:44,450 Dakle, to je pohranjen u argv [i], a zatim ćemo otvoriti ovu datoteku u modu čitanja. 715 00:59:44,450 --> 00:59:48,100 Sada kada smo otvorili datoteku, što je stvar da uvijek moramo imati na umu da to 716 00:59:48,100 --> 00:59:52,230 kad smo otvorili datoteku? Zatvorite ga. 717 00:59:52,230 --> 00:59:57,220 Dakle, Missy, kako ćemo zatvoriti datoteku? 718 00:59:57,220 --> 01:00:01,020 [Missy] fclose (datoteka) >> fclose (datoteka). Točno. 719 01:00:01,020 --> 01:00:05,340 Izvrsno. Ok. Ako gledamo na to učiniti komentar ovdje, 720 01:00:05,340 --> 01:00:11,940 ona kaže, "Otvoreno argv [i] i ispisati svoje sadržaje na stdout." 721 01:00:11,940 --> 01:00:15,460 >> Standardni out je čudno ime. Stdout je samo naš način da se kaže 722 01:00:15,460 --> 01:00:22,880 želimo ispisati ga na terminal, želimo ga ispisati na standardni izlaz potoka. 723 01:00:22,880 --> 01:00:26,450 Mi zapravo mogu dobiti osloboditi od ovaj komentar ovdje. 724 01:00:26,450 --> 01:00:36,480 Ja ću ga kopirati i zalijepiti jer to je ono što smo učinili. 725 01:00:36,480 --> 01:00:41,290 U ovom trenutku, sada moramo pročitati datoteku malo po malo. 726 01:00:41,290 --> 01:00:46,300 Mi smo razgovarali nekoliko načina čitanja datoteka. 727 01:00:46,300 --> 01:00:51,830 Koje su vaši favoriti dosad? 728 01:00:51,830 --> 01:00:57,960 Koji načini ste vidjeli ili sjećaš, čitati datoteke? 729 01:00:57,960 --> 01:01:04,870 [Daniel] fread? >> Fread? Dakle fread je jedan. Jimmy, znaš li druge? 730 01:01:04,870 --> 01:01:12,150 [Jimmy] No >> Ok. Ne. Charlotte? Alexander? Bilo drugi? Ok. 731 01:01:12,150 --> 01:01:20,740 Dakle, one druge su fgetc, je onaj koji ćemo koristiti puno. 732 01:01:20,740 --> 01:01:26,410 Tu je i fscanf; vi vidite uzorak ovdje? 733 01:01:26,410 --> 01:01:29,170 Oni počinju s f. Sve to učiniti s datotekom. 734 01:01:29,170 --> 01:01:35,260 Tu je fread, fgetc, fscanf. To su sve funkcije čitanja. 735 01:01:35,260 --> 01:01:49,120 Za pisanje imamo fwrite, imamo fputc umjesto fgetc. 736 01:01:49,120 --> 01:01:58,250 Mi također fprintf su željeli smo vidjeli na kvizu. 737 01:01:58,250 --> 01:02:01,680 Budući da je to problem koji uključuje čitanje iz datoteke, 738 01:02:01,680 --> 01:02:04,940 idemo koristiti jednu od ove tri funkcije. 739 01:02:04,940 --> 01:02:10,890 Nećemo koristiti ove funkcije ovdje dolje. 740 01:02:10,890 --> 01:02:14,880 Ove funkcije su svi nalazi u standardnoj I / O knjižnici. 741 01:02:14,880 --> 01:02:17,510 Dakle, ako pogledate na vrhu ovog programa, 742 01:02:17,510 --> 01:02:24,110 možete vidjeti da smo već uključeni u header datoteku za standardni I / O knjižnici. 743 01:02:24,110 --> 01:02:27,120 Ako želimo shvatiti što jednom želimo koristiti, 744 01:02:27,120 --> 01:02:29,690 uvijek možemo otvoriti stranice man. 745 01:02:29,690 --> 01:02:34,350 Tako možemo upisati čovjek stdio 746 01:02:34,350 --> 01:02:43,180 i pročitati sve o stdio ulaznih i izlaznih funkcija u C. 747 01:02:43,180 --> 01:02:49,870 I već možemo vidjeti oh, izgleda. To je spomena fgetc, to je spomenuti fputc. 748 01:02:49,870 --> 01:02:57,220 Dakle, možete izbušiti dolje malo i pogledati, recimo, fgetc 749 01:02:57,220 --> 01:03:00,060 i gledati na čovjeka stranici. 750 01:03:00,060 --> 01:03:03,430 Možete vidjeti da to ide uz cijela hrpa drugih funkcija: 751 01:03:03,430 --> 01:03:12,640 fgetc, fgets, getc, getchar, dobiva, ungetc, a njegov unos znakova i gudače. 752 01:03:12,640 --> 01:03:19,180 Pa to je, kako čitamo u likovima i gudače iz datoteka iz standardnog ulaza, 753 01:03:19,180 --> 01:03:21,990 koji je u suštini od korisnika. 754 01:03:21,990 --> 01:03:24,780 A to je kako ćemo to učiniti u stvarnom C. 755 01:03:24,780 --> 01:03:30,850 Dakle, to ne koristi GetString i getchar funkcije 756 01:03:30,850 --> 01:03:36,840 da smo koristili od CS50 knjižnici. 757 01:03:36,840 --> 01:03:39,710 Mi ćemo učiniti ovaj problem u nekoliko načina 758 01:03:39,710 --> 01:03:43,430 tako da možete vidjeti dva različita načina radi. 759 01:03:43,430 --> 01:03:48,490 Oba fread funkcija da Daniel spominje i fgetc su dobri načine kako to učiniti. 760 01:03:48,490 --> 01:03:53,790 Mislim fgetc je malo lakše, jer ima samo, kao što vidite, 761 01:03:53,790 --> 01:03:59,660 jedan argument, SLIKA * da smo težak za čitanje lik iz, 762 01:03:59,660 --> 01:04:02,740 i njegova povratna vrijednost je int. 763 01:04:02,740 --> 01:04:05,610 I ovo je malo konfuzno, zar ne? 764 01:04:05,610 --> 01:04:11,450 >> Budući da smo uzimajući karakter, pa zašto ne taj povratak char? 765 01:04:11,450 --> 01:04:18,700 Vi imate ideje o tome zašto to ne bi mogli vratiti char? 766 01:04:18,700 --> 01:04:25,510 [Missy odgovori, nerazumljivo] >> Da. Dakle, gospođica je potpuno u pravu. 767 01:04:25,510 --> 01:04:31,570 Ako je ASCII, onda je to cijeli bi se preslikati u stvarni char. 768 01:04:31,570 --> 01:04:33,520 Mogao bi biti ASCII, i to je točno. 769 01:04:33,520 --> 01:04:36,220 To je upravo ono što se događa. 770 01:04:36,220 --> 01:04:39,190 Mi smo pomoću int jednostavno zato što ima više bitova. 771 01:04:39,190 --> 01:04:44,750 To je veći od char; naš char ima samo osam bitova, da jedan bajt na našim 32-bitnim strojevima. 772 01:04:44,750 --> 01:04:48,520 I int ima sve 4 bajta u vrijednosti prostora. 773 01:04:48,520 --> 01:04:50,940 I ispada da način fgetc radi, 774 01:04:50,940 --> 01:04:53,940 ako mi se pomaknite prema dolje u našem sinopsisa u tom čovjeku stranici malo, 775 01:04:53,940 --> 01:05:05,000 pomaknite dokraja. Ispada da su oni koristili ovu posebnu vrijednost pod nazivom EOF. 776 01:05:05,000 --> 01:05:09,640 To je posebno konstanta kao povratnu vrijednost od fgetc funkcije 777 01:05:09,640 --> 01:05:14,570 kad god pogoditi kraj datoteke ili ako dobijete pogrešku. 778 01:05:14,570 --> 01:05:18,170 I ispada da to učiniti ove usporedbe s EOF ispravno, 779 01:05:18,170 --> 01:05:24,060 želite imati taj dodatni iznos od informacija koje imate u int 780 01:05:24,060 --> 01:05:28,420 za razliku od korištenja char varijablu. 781 01:05:28,420 --> 01:05:32,130 Iako fgetc učinkovito dobivanje znaka iz datoteke, 782 01:05:32,130 --> 01:05:38,450 Želite li se sjetiti da je povratak nešto što je tipa int za vas. 783 01:05:38,450 --> 01:05:41,360 To je rekao, to je prilično jednostavan za korištenje. 784 01:05:41,360 --> 01:05:44,960 To će nam dati karakter, tako da sve što morate učiniti je držati molba datoteku, 785 01:05:44,960 --> 01:05:48,440 "Daj mi sljedeći znak, daj mi sljedeći znak, daj mi sljedeći znak" 786 01:05:48,440 --> 01:05:51,400 dok ne dođemo do kraja datoteke. 787 01:05:51,400 --> 01:05:54,730 I da će se povući u jedan lik u isto vrijeme iz naše datoteke, 788 01:05:54,730 --> 01:05:56,250 a onda možemo raditi što god mi se sviđa s njom. 789 01:05:56,250 --> 01:06:00,160 Možemo ga pohraniti, možemo ga dodati na string, možemo ga ispisati. 790 01:06:00,160 --> 01:06:04,630 Učinite nešto od toga. 791 01:06:04,630 --> 01:06:09,600 >> Zumiranje natrag i ide natrag u naše cat.c programa, 792 01:06:09,600 --> 01:06:16,170 ako ćemo koristiti fgetc, 793 01:06:16,170 --> 01:06:21,710 kako bismo mogli pristupiti ovu sljedeću liniju koda? 794 01:06:21,710 --> 01:06:26,020 Mi ćemo koristiti - fread će učiniti nešto malo drugačiji. 795 01:06:26,020 --> 01:06:32,600 I ovaj put, samo mi ćemo koristiti fgetc dobiti jedan lik u isto vrijeme. 796 01:06:32,600 --> 01:06:40,910 Za obradu cijelu sliku, što bismo mogli učiniti? 797 01:06:40,910 --> 01:06:44,030 Koliko likovi postoje u datoteci? 798 01:06:44,030 --> 01:06:47,390 Postoji puno. Dakle, vjerojatno želite dobiti jedan 799 01:06:47,390 --> 01:06:49,860 i onda se još i dobiti još i dobiti drugi. 800 01:06:49,860 --> 01:06:53,330 Kakav algoritma misliš da možda ćete morati koristiti ovdje? 801 01:06:53,330 --> 01:06:55,470 Koji tip -? [Aleksandar] za petlje? >> Točno. 802 01:06:55,470 --> 01:06:57,500 Neki tip petlje. 803 01:06:57,500 --> 01:07:03,380 For petlja je zapravo super, u ovom slučaju. 804 01:07:03,380 --> 01:07:08,620 I kao što ste rekli, to zvuči kao da želite petlju nad cijelom datotekom, 805 01:07:08,620 --> 01:07:11,820 uzimajući lik u isto vrijeme. 806 01:07:11,820 --> 01:07:13,850 Bilo koji sugestija o tome što bi moglo izgledati? 807 01:07:13,850 --> 01:07:22,090 [Alexander, nerazumljivo] 808 01:07:22,090 --> 01:07:30,050 >> Ok, samo mi reci na engleskom jeziku što pokušavaš učiniti? [Alexander, nerazumljivo] 809 01:07:30,050 --> 01:07:36,270 Dakle, u ovom slučaju, to zvuči kao da smo samo pokušavamo petlji preko cijele datoteke. 810 01:07:36,270 --> 01:07:45,330 [Aleksandar] Pa ja > Veličina -? 811 01:07:45,330 --> 01:07:49,290 Valjda veličinu datoteke, zar ne? Veličina - hrapavi samo napisati ovako. 812 01:07:49,290 --> 01:07:57,470 Veličina datoteke za sada, ja + +. 813 01:07:57,470 --> 01:08:04,610 Tako ispada da je način na koji to učiniti koristeći fgetc, a to je nova, 814 01:08:04,610 --> 01:08:10,460 je da ne postoji jednostavan način da samo dobiti veličinu datoteke 815 01:08:10,460 --> 01:08:16,979 s ovim "sizeof" tipa konstruirati da ste vidjeli prije. 816 01:08:16,979 --> 01:08:20,910 Kada smo koristiti taj fgetc funkciju, uvodimo neke vrste 817 01:08:20,910 --> 01:08:29,069 nova, funky sintaksa bi to za petlje, gdje se umjesto koristeći samo osnovnu brojač 818 01:08:29,069 --> 01:08:33,920 ići slovo po slovo, idemo izvući jedan lik u isto vrijeme, 819 01:08:33,920 --> 01:08:37,120 jedan lik u isto vrijeme, i način na koji znamo da smo na kraju 820 01:08:37,120 --> 01:08:41,290 ne kad smo broje određeni broj znakova, 821 01:08:41,290 --> 01:08:49,939 ali kad lik mi izvadi je da se posebna kraj datoteke karaktera. 822 01:08:49,939 --> 01:08:58,689 Dakle, možemo to učiniti - Ja ovaj ch, a mi ćemo ga inicijalizirati 823 01:08:58,689 --> 01:09:08,050 s našeg prvog poziva da se prvi znak iz datoteke. 824 01:09:08,050 --> 01:09:14,979 Dakle, ovaj dio ovdje, ovo će dobiti lik iz datoteke 825 01:09:14,979 --> 01:09:20,840 i pohraniti u varijablu ch. 826 01:09:20,840 --> 01:09:25,420 Mi ćemo zadržati to dok ne dođemo do kraja datoteke, 827 01:09:25,420 --> 01:09:41,170 koje smo učiniti testiranje na lik ne bude jednak toj posebnoj EOF karaktera. 828 01:09:41,170 --> 01:09:48,750 I onda, umjesto da radiš ch + +, koji bi samo povećajte vrijednost, 829 01:09:48,750 --> 01:09:52,710 pa ako čitamo A iz spisa, kapitala, kažu, 830 01:09:52,710 --> 01:09:56,810 ch + + će nam dati b, a zatim bismo dobili C i zatim d. 831 01:09:56,810 --> 01:09:59,310 To je očito nije ono što želimo. Ono što želimo ovdje 832 01:09:59,310 --> 01:10:05,830 u ovom posljednjem malo se želimo dobiti sljedeći znak iz datoteke. 833 01:10:05,830 --> 01:10:09,500 >> Dakle, kako bismo mogli dobiti sljedeći lik iz spisa? 834 01:10:09,500 --> 01:10:13,470 Kako smo dobili prvi znak iz datoteke? 835 01:10:13,470 --> 01:10:17,200 [Studentski] fgetfile? >> Fgetc, ili, žao mi je, da si potpuno u pravu. 836 01:10:17,200 --> 01:10:20,470 Ja ga pogrešno tamo. Pa da. 837 01:10:20,470 --> 01:10:26,240 Ovdje umjesto da radiš ch + +, 838 01:10:26,240 --> 01:10:29,560 mi smo samo ide na poziv fgetc (file) ponovno 839 01:10:29,560 --> 01:10:39,180 i pohraniti rezultat u našoj istoj ch varijable. 840 01:10:39,180 --> 01:10:43,730 [Studentski pitanje, nerazumljivo] 841 01:10:43,730 --> 01:10:52,390 >> Ovo je mjesto gdje ti SLIKA * dečki su posebna. 842 01:10:52,390 --> 01:10:59,070 Način oni rade je da - kad ste prvi put otvorili - kada se prvi put napraviti taj fopen poziv, 843 01:10:59,070 --> 01:11:04,260 datoteku * učinkovito služi kao pokazivač na početku datoteke. 844 01:11:04,260 --> 01:11:12,830 I onda svaki put kad poziv fgetc, ona kreće jedan lik kroz datoteku. 845 01:11:12,830 --> 01:11:23,280 Dakle, kad god to zovu, ti si povećavanjem datoteke pokazivač po jedan karakter. 846 01:11:23,280 --> 01:11:26,210 A kada fgetc opet, znači da se krećete na drugi lik 847 01:11:26,210 --> 01:11:28,910 a drugi lik, a drugi lik, a drugi lik. 848 01:11:28,910 --> 01:11:32,030 [Studentski pitanje, nerazumljivo] >> I that's - da. 849 01:11:32,030 --> 01:11:34,810 To je vrsta ove magije ispod haube. 850 01:11:34,810 --> 01:11:37,930 Vi samo držati povećavanjem putem. 851 01:11:37,930 --> 01:11:46,510 U ovom trenutku, vi ste u mogućnosti da zapravo rade s karakterom. 852 01:11:46,510 --> 01:11:52,150 Dakle, kako bismo mogli ispisati ovo na ekranu, sada? 853 01:11:52,150 --> 01:11:58,340 Možemo koristiti isti printf stvar da smo koristili prije. 854 01:11:58,340 --> 01:12:00,330 To smo koristili sve semestar. 855 01:12:00,330 --> 01:12:05,450 Možemo to nazvati printf, 856 01:12:05,450 --> 01:12:21,300 i možemo proći u liku baš kao da je. 857 01:12:21,300 --> 01:12:27,430 Drugi način da to učinite je radije nego da koristite printf i što učiniti ovaj format string, 858 01:12:27,430 --> 01:12:29,490 možemo koristiti jednu od druge funkcije. 859 01:12:29,490 --> 01:12:40,090 Možemo koristiti fputc, koji ispisuje karakter na zaslonu, 860 01:12:40,090 --> 01:12:52,580 osim ako gledamo fputc - neka me udaljili malo. 861 01:12:52,580 --> 01:12:56,430 Mi vidimo ono što je lijepo je to potrebno u znak da smo očitati pomoću fgetc, 862 01:12:56,430 --> 01:13:05,100 ali onda moramo mu dati struju za ispis na. 863 01:13:05,100 --> 01:13:11,850 Mi također može koristiti Putchar funkciju, koja će se staviti izravno na standardne van. 864 01:13:11,850 --> 01:13:16,070 Dakle, postoje cijela hrpa različitih opcija koje možemo koristiti za ispis. 865 01:13:16,070 --> 01:13:19,580 Oni su svi u standardnoj I / O knjižnici. 866 01:13:19,580 --> 01:13:25,150 Kad god želite ispisati - tako printf, po defaultu, ispisati će se posebnom standardu iz potoka, 867 01:13:25,150 --> 01:13:27,910 što je to stdout. 868 01:13:27,910 --> 01:13:41,300 Dakle, mi samo može odnositi na njega kao vrsta ovog čarobnog vrijednosti, stdout ovdje. 869 01:13:41,300 --> 01:13:48,410 Ups. Stavite zarez izvan. 870 01:13:48,410 --> 01:13:52,790 >> To je puno novih, funky informacija ovdje. 871 01:13:52,790 --> 01:13:58,600 Puno toga je vrlo idiomatski, u smislu da je to kod 872 01:13:58,600 --> 01:14:05,700 koja je napisana na ovaj način samo zato što je čista čitati, jednostavan za čitanje. 873 01:14:05,700 --> 01:14:11,520 Postoji mnogo različitih načina kako to učiniti, mnoge različite funkcije koje možete koristiti, 874 01:14:11,520 --> 01:14:14,680 ali mi imaju tendenciju da slijedite ove iste obrasce iznova i iznova. 875 01:14:14,680 --> 01:14:20,180 Dakle, nemojte se iznenaditi ako vidite kod ovako dolaze opet i opet. 876 01:14:20,180 --> 01:14:25,690 U redu. U ovom trenutku, moramo razbiti za taj dan. 877 01:14:25,690 --> 01:14:31,300 Hvala za dolazak. Hvala za gledanje, ako ste online. A mi ćemo vas vidjeti sljedeći tjedan. 878 01:14:31,300 --> 01:14:33,890 [CS50.TV]