1 00:00:00,000 --> 00:00:02,730 [Powered by Google Translate] [ODDELEK 5: manj udoben] 2 00:00:02,730 --> 00:00:05,180 [Nate Hardison, Harvard University] 3 00:00:05,180 --> 00:00:08,260 [To je CS50.] [CS50.TV] 4 00:00:08,260 --> 00:00:11,690 Torej, dobrodošli nazaj, fantje. 5 00:00:11,690 --> 00:00:16,320 Dobrodošli v 5. poglavju. 6 00:00:16,320 --> 00:00:20,220 Na tej točki, ki so končali kviz 0 in ko je videl, kako ste naredili, 7 00:00:20,220 --> 00:00:25,770 upajmo, da se počutim res dobro, ker sem bil zelo navdušen nad rezultati v tem oddelku. 8 00:00:25,770 --> 00:00:28,050 Za naše spletne gledalcev, imeli smo nekaj vprašanj 9 00:00:28,050 --> 00:00:33,680 O zadnjih dveh problemov na problem set - ali na kvizu, ne. 10 00:00:33,680 --> 00:00:39,690 Tako smo šli čez tiste res hitro, tako da vsi vidijo, kaj se je zgodilo 11 00:00:39,690 --> 00:00:45,060 in kako iti skozi dejanske rešitve in ne samo gledate rešitev sama. 12 00:00:45,060 --> 00:00:50,330 Mi smo šli v zadnjih nekaj težav, zelo hitro, 32 in 33. 13 00:00:50,330 --> 00:00:53,240 Samo, še enkrat, tako da so spletne gledalci videli to. 14 00:00:53,240 --> 00:00:59,080 >> Če obrnete na vašo težavo 32, ki je na strani 13, 15 00:00:59,080 --> 00:01:02,730 13 od 16, 32 Problem je vse o zamenjavah. 16 00:01:02,730 --> 00:01:05,010 To je vse o menjavi dve celi števili. 17 00:01:05,010 --> 00:01:08,740 To je problem, da bomo šli čez nekaj časa na predavanju. 18 00:01:08,740 --> 00:01:13,590 In tukaj, kaj smo spraševali vas je hitro spomin sled. 19 00:01:13,590 --> 00:01:17,000 Za zapolnitev v vrednosti spremenljivk, kot so na kupu 20 00:01:17,000 --> 00:01:20,250 kot je koda gre skozi to swap funkcijo. 21 00:01:20,250 --> 00:01:24,500 Še posebej tisto, kar smo si ogleduje - Jaz bom dal to iPad dol - 22 00:01:24,500 --> 00:01:29,650 zlasti to, kar smo iskali na to vrstica oštevilčena 6 prav tukaj. 23 00:01:29,650 --> 00:01:36,740 Pa tud če je oštevilčena 6 za samo bližino s prejšnjim problema. 24 00:01:36,740 --> 00:01:41,720 Kaj želite storiti, je prikazati ali označujejo stanje pomnilnika 25 00:01:41,720 --> 00:01:46,090 saj je v času, ko bo ta številka vrstice 6, 26 00:01:46,090 --> 00:01:52,540 , ki je učinkovit donos iz naše swap funkcijo tukaj. 27 00:01:52,540 --> 00:01:59,450 Če smo se pomaknite navzdol tukaj, smo videli, da je bilo vse naslove v spominu iz nas. 28 00:01:59,450 --> 00:02:02,540 To je zelo ključnega pomena, se bomo vrnili k njim vsak trenutek. 29 00:02:02,540 --> 00:02:09,240 In potem sem dol na dnu, smo imeli malo pomnilnika diagram, bomo nanašajo. 30 00:02:09,240 --> 00:02:12,490 Pravzaprav sem to naredil na moj iPad. 31 00:02:12,490 --> 00:02:20,720 Torej bom izmenično naprej in nazaj med iPad in to kodo samo za referenco. 32 00:02:20,720 --> 00:02:26,540 >> Začnimo. Najprej naj se osredotoči na prvih nekaj vrstic glavni tukaj. 33 00:02:26,540 --> 00:02:30,220 Če želite začeti, bomo za inicializacijo za 1 x in y za 2. 34 00:02:30,220 --> 00:02:33,040 Torej imamo dve integer spremenljivk, oni tako bo treba dati na kup. 35 00:02:33,040 --> 00:02:36,050 Bomo dal 1 in 2 v njih. 36 00:02:36,050 --> 00:02:43,150 Torej, če sem preklopil na mojem iPad, upajmo, da vidimo - 37 00:02:43,150 --> 00:02:48,660 Apple TV zrcaljenje, in tam gremo. Ok. 38 00:02:48,660 --> 00:02:51,670 Torej, če sem preklopil na mojem iPad, 39 00:02:51,670 --> 00:02:56,220 Želim inicializacijo x in y za 1 do 2. 40 00:02:56,220 --> 00:03:00,580 Mi, ki preprosto tako, da napišete 1 v polju označenem x 41 00:03:00,580 --> 00:03:07,730 in 2 v škatli označeni y. Dokaj preprost. 42 00:03:07,730 --> 00:03:11,620 Torej, zdaj gremo nazaj v laptop, kaj se bo zgodilo naslednje. 43 00:03:11,620 --> 00:03:15,810 Torej, to next line je, če se stvari zapleteno. 44 00:03:15,810 --> 00:03:28,110 Peljemo naslov x in y naslov kot parametrov a in b na swap funkcijo. 45 00:03:28,110 --> 00:03:32,380 Naslov x in y naslovom So stvari, ki jih ne moremo izračunati 46 00:03:32,380 --> 00:03:36,360 brez sklicevanja na te alinejah prav tukaj. 47 00:03:36,360 --> 00:03:39,750 In na srečo, prva dva zaporedna točki nam povejte, kaj so odgovori. 48 00:03:39,750 --> 00:03:44,740 Naslov x v spomin je 10 in naslov y v spomin je 14. 49 00:03:44,740 --> 00:03:51,870 Torej, to so vrednote, ki se opravili v kot in b se uvrščajo v sam vrh naše swap funkcijo. 50 00:03:51,870 --> 00:04:00,760 Torej, še enkrat, prehod nazaj na naši sliki, lahko napišem v 10 51 00:04:00,760 --> 00:04:07,400 in 14 v b. 52 00:04:07,400 --> 00:04:11,610 No, to je točka, kjer bomo nadaljevali z zamenjavo. 53 00:04:11,610 --> 00:04:14,520 Torej lahkota nazaj na laptop spet, 54 00:04:14,520 --> 00:04:21,079 vidimo, da je način zamenjave dela je najprej dereference in trgovina rezultat v tmp. 55 00:04:21,079 --> 00:04:27,650 Torej dereference operater reče: "Hej. Privoščite vsebino spremenljivke kot naslov. 56 00:04:27,650 --> 00:04:33,830 Pojdi na vse, kar je shranjena na tem naslovu, in jo naložite. " 57 00:04:33,830 --> 00:04:41,720 Kaj boste naložili iz spremenljivke se bo shranjeni v našem tmp spremenljivko. 58 00:04:41,720 --> 00:04:45,150 Flipping nazaj na iPad. 59 00:04:45,150 --> 00:04:51,690 Če gremo v reševanje 10, vemo, da je naslov 10 x varible 60 00:04:51,690 --> 00:04:55,480 ker so nam povedali naše točki, da je naslov v pomnilniku x je 10. 61 00:04:55,480 --> 00:05:00,180 Torej, lahko gremo tja, se vrednost tega, kar je 1, kot smo videli na naši iPad, 62 00:05:00,180 --> 00:05:06,300 in obremenitev, ki v tmp. 63 00:05:06,300 --> 00:05:08,250 Še enkrat, to ni končna vsebina. 64 00:05:08,250 --> 00:05:14,350 Gremo na sprehod skozi in bomo prišli do našega končnega stanja programa na koncu. 65 00:05:14,350 --> 00:05:17,210 Toda zdaj imamo shranjeno v vrednosti 1 tmp. 66 00:05:17,210 --> 00:05:19,210 >> In tukaj je hitro vprašanje tukaj. 67 00:05:19,210 --> 00:05:23,980 [Aleksander] Je dereference subjekt - to je samo zvezda tik pred spremenljivko? 68 00:05:23,980 --> 00:05:27,600 >> Da. Torej dereference subjekt, kot smo flip nazaj na našo prenosnik še enkrat, 69 00:05:27,600 --> 00:05:33,780 je ta zvezda tik pred. 70 00:05:33,780 --> 00:05:37,460 V tem smislu je - jo primerjal z multiplikacijskim operaterja 71 00:05:37,460 --> 00:05:42,400 ki zahteva dvoje; dereference upravljavec Predznak. 72 00:05:42,400 --> 00:05:46,130 Tako velja za eno vrednost v primerjavi z binarno operaterja, 73 00:05:46,130 --> 00:05:48,810 kjer se uporabljajo za dve različni vrednosti. 74 00:05:48,810 --> 00:05:52,080 Torej, to je tisto, kar se dogaja v tej vrstici. 75 00:05:52,080 --> 00:05:58,390 Mi naložen vrednost 1 in ga shrani v svojo začasno celo spremenljivko. 76 00:05:58,390 --> 00:06:05,800 V naslednjih vrsticah hranimo vsebino b v - 77 00:06:05,800 --> 00:06:12,630 ali, bolje rečeno, hranimo vsebino, ki se kažejo na b na kraju, kjer se kaže. 78 00:06:12,630 --> 00:06:17,690 Če analiziramo ta od desne proti levi, se bomo, da b dereference, 79 00:06:17,690 --> 00:06:23,580 bomo obravnavali 14, bomo zagrabiti celo število, ki je tam, 80 00:06:23,580 --> 00:06:26,900 in potem smo šli na naslov 10, 81 00:06:26,900 --> 00:06:34,240 in bomo vrgli rezultat naše ciljne datoteke z B, v tem prostoru. 82 00:06:34,240 --> 00:06:40,080 Flipping nazaj k naši iPad, kjer lahko naredimo to malo bolj konkretno, 83 00:06:40,080 --> 00:06:44,070 to bi pomagalo, če sem napisal številke na vse naslove tukaj. 84 00:06:44,070 --> 00:06:53,820 Torej vemo, da je y, smo na naslov 14, x je na naslovu 10. 85 00:06:53,820 --> 00:07:00,180 Ko smo začeli na b, da dereference b, bomo zgrabi vrednost 2. 86 00:07:00,180 --> 00:07:08,320 Mi se bomo, da zgrabite to vrednost, ker je to vrednost, ki ne živi na naslovu 14. 87 00:07:08,320 --> 00:07:15,700 In bomo, da ga v spremenljivko, ki živi na naslovu 10, 88 00:07:15,700 --> 00:07:19,160 , ki je tam, ki ustrezajo našim spremenljivke x. 89 00:07:19,160 --> 00:07:21,810 Tako lahko naredimo malo prepisal tukaj 90 00:07:21,810 --> 00:07:35,380 kjer smo znebiti našega 1 in namesto tega napišite 2. 91 00:07:35,380 --> 00:07:39,560 Torej, vse je lepo in prav na svetu, čeprav smo se prečrtanih x zdaj. 92 00:07:39,560 --> 00:07:44,890 Imamo hranijo stare vrednosti X je v našem tmp spremenljivko. 93 00:07:44,890 --> 00:07:50,210 Torej lahko zaključimo zamenjave z naslednjo vrstico. 94 00:07:50,210 --> 00:07:53,030 Flipping nazaj v naš laptop. 95 00:07:53,030 --> 00:07:58,150 Zdaj ne preostane je, da vsebine iz našega začasno celo spremenljivko 96 00:07:58,150 --> 00:08:05,630 in jih shranimo v spremenljivko, ki živi na naslovu, ki je b holdinga. 97 00:08:05,630 --> 00:08:10,230 Torej bomo učinkovito dereference b, da bi dobili dostop do spremenljivko 98 00:08:10,230 --> 00:08:14,340 da je na naslovu, ki b ima v njej, 99 00:08:14,340 --> 00:08:19,190 in bomo stvari vrednost, ki je v lasti tmp vanjo. 100 00:08:19,190 --> 00:08:23,280 Flipping nazaj na iPad še enkrat. 101 00:08:23,280 --> 00:08:31,290 Ne morem izbrisati to vrednost tukaj, 2, 102 00:08:31,290 --> 00:08:41,010 in namesto tega bomo kopirati 1 pravico vanjo. 103 00:08:41,010 --> 00:08:43,059 Nato naslednjo vrstico, ki izvrši, seveda - 104 00:08:43,059 --> 00:08:47,150 če želimo obrniti nazaj v laptop - je ta točka 6, 105 00:08:47,150 --> 00:08:52,500 kar je točka, na kateri smo želeli, da imamo načrt v celoti izpolnili. 106 00:08:52,500 --> 00:08:58,940 Torej lahkota nazaj na iPad še enkrat, le tako boste lahko videli izpolnjen diagram, 107 00:08:58,940 --> 00:09:06,610 boste videli, da imamo pri 10, 14 in b, 1 v NTU, 2 X, in 1 v y. 108 00:09:06,610 --> 00:09:11,000 Ali obstajajo vprašanja o tem? 109 00:09:11,000 --> 00:09:14,640 Ali je to bolj smiselno, ko je šel skozi to? 110 00:09:14,640 --> 00:09:24,850 Naredite manj smiselna? Upam, da ne. Ok. 111 00:09:24,850 --> 00:09:28,230 >> Kazalci so zelo kočljiva tema. 112 00:09:28,230 --> 00:09:33,420 Eden od fantov, s katerimi delamo ima zelo pogosti pregovor: 113 00:09:33,420 --> 00:09:36,590 "Da bi razumeli namig, morate najprej razumeti namig." 114 00:09:36,590 --> 00:09:40,530 Mislim, da je zelo res. To pa bo trajalo nekaj časa, da se navadiš. 115 00:09:40,530 --> 00:09:45,360 Risba veliko slik, žrebanjem pomnilniških diagrami, kot je ta, so zelo koristno, 116 00:09:45,360 --> 00:09:49,480 in potem greste skozi primer po primer po primer, 117 00:09:49,480 --> 00:09:54,450 da bomo začeli, da bi malo več pameti in malo več občutka in malo več občutka. 118 00:09:54,450 --> 00:10:01,560 Končno en dan, boste imeli vse popolnoma obvlada. 119 00:10:01,560 --> 00:10:13,800 Vsa vprašanja, preden gremo na naslednjo težavo? V redu. 120 00:10:13,800 --> 00:10:18,840 Torej flip nazaj na laptop. 121 00:10:18,840 --> 00:10:23,300 Naslednji problem imamo, je problem številka 33 na datoteko I / O. 122 00:10:23,300 --> 00:10:26,350 Povečajte o tem malo. 123 00:10:26,350 --> 00:10:28,710 Problem 33 - Da? 124 00:10:28,710 --> 00:10:32,110 >> [Daniel] sem moral hitro vprašanje. Ta zvezda, ali zvezdica, 125 00:10:32,110 --> 00:10:35,590 to se imenuje Dereferenciranje ko uporabite zvezdico prej. 126 00:10:35,590 --> 00:10:38,820 Kako se imenuje, ko uporabite znak '& prej? 127 00:10:38,820 --> 00:10:43,140 >> Ta znak je pred-naslov izvajalca. 128 00:10:43,140 --> 00:10:45,880 Torej se pomaknete nazaj. 129 00:10:45,880 --> 00:10:49,310 Ups. Jaz sem v načinu povečave, tako da ne morem pomikanje. 130 00:10:49,310 --> 00:10:52,780 Če pogledamo te kode zelo hitro tukaj, 131 00:10:52,780 --> 00:10:54,980 spet ista stvar dogaja. 132 00:10:54,980 --> 00:10:59,180 Če pogledamo to kodo tukaj, na tej progi, kjer naredimo razpis za zamenjavo, 133 00:10:59,180 --> 00:11:10,460 Ta znak je samo rekel "dobil naslov, na katerem spremenljivke x življenj." 134 00:11:10,460 --> 00:11:14,460 Ko je vaš prevajalnik prevede kodo, 135 00:11:14,460 --> 00:11:20,590 to je dejansko fizično označili iz prostora v pomnilniku za vse vaše spremenljivk, ki živijo. 136 00:11:20,590 --> 00:11:24,910 In kaj lahko naredite, ko prevajalnik je bilo zbrati vse, 137 00:11:24,910 --> 00:11:31,110 ve, "Oh, sem dal na naslovu x 10. sem dal y na naslovu 14". 138 00:11:31,110 --> 00:11:34,640 Nato lahko izpolnite te vrednote za vas. 139 00:11:34,640 --> 00:11:44,740 Tako lahko potem - lahko nato mimo in to smučarsko & Y, kot dobro. 140 00:11:44,740 --> 00:11:50,730 Ti fantje so dobili naslov, pa tudi, ko jih preide v swap funkcijo 141 00:11:50,730 --> 00:11:55,690 ta vrsta informacij, to int * tukaj, pove prevajalnik, 142 00:11:55,690 --> 00:12:01,350 "Ok, gremo se razlagajo ta naslov kot naslov celoštevilski spremenljivki." 143 00:12:01,350 --> 00:12:05,900 Kot naslov notr, ki se razlikuje od naslova za znakovni spremenljivke 144 00:12:05,900 --> 00:12:09,930 ker int zavzema, na 32-bitnih računalnikih, zavzema 4 bajte prostora, 145 00:12:09,930 --> 00:12:13,310 ker je znak samo povzema 1 bajt prostora. 146 00:12:13,310 --> 00:12:17,310 Zato je pomembno, da vedo, kaj je prav - kar živi, ​​kakšno vrednost 147 00:12:17,310 --> 00:12:20,340 živi na naslovu, da imam noter opravljenem 148 00:12:20,340 --> 00:12:22,020 Ali je naslov, ki ste se ukvarjajo s. 149 00:12:22,020 --> 00:12:29,020 Tako boste vedeli, koliko bajtov informacij za dejansko obremenitev iz vašega RAM-a. 150 00:12:29,020 --> 00:12:31,780 In potem, ja, to dereference operater, tako kot vi spraševali, 151 00:12:31,780 --> 00:12:37,200 gre in dostopa do informacij na določenem naslovu. 152 00:12:37,200 --> 00:12:42,820 Torej se pravi, s tem spremenljivko tukaj, zdravljenje vsebino kot naslov, 153 00:12:42,820 --> 00:12:47,880 pojdi na ta naslov in je potegnil ven, vstavite v procesor, obremenitve v register 154 00:12:47,880 --> 00:12:56,340 Dejanske vrednosti ali vsebin, ki živijo na tem naslovu. 155 00:12:56,340 --> 00:12:59,620 Vse več vprašanj? To so dobra vprašanja. 156 00:12:59,620 --> 00:13:01,650 To je veliko novi terminologiji, preveč. 157 00:13:01,650 --> 00:13:09,800 To je tudi neke vrste funky, videnje & * in na različnih mestih. 158 00:13:09,800 --> 00:13:13,180 >> V redu. 159 00:13:13,180 --> 00:13:18,530 Torej nazaj k problemu 33, vložite I / O. 160 00:13:18,530 --> 00:13:22,540 To je bil eden od tistih problemov, ki mislim, da nekaj stvari se je zgodilo. 161 00:13:22,540 --> 00:13:25,400 Ena, je dokaj nova tema. 162 00:13:25,400 --> 00:13:30,590 Predstavljen je bil kmalu pred kviza, 163 00:13:30,590 --> 00:13:33,400 in potem mislim, da je nekako kot eden od tistih besednih problemov v matematiki 164 00:13:33,400 --> 00:13:39,720 če vam veliko informacij, vendar pa dejansko ne končajo ob uporabi tone tega. 165 00:13:39,720 --> 00:13:44,060 Prvi del tega problema, ki opisuje, kaj je datoteka CSV. 166 00:13:44,060 --> 00:13:50,620 Sedaj datoteko CSV, v skladu z opisom, je z vejico ločene vrednosti datoteko. 167 00:13:50,620 --> 00:13:55,300 Razlog za to so sploh zanimiva in razlog, da si jih kdaj uporabiti, 168 00:13:55,300 --> 00:14:00,800 je, ker je, koliko od vas kdaj uporabili stvari, kot so Excel? 169 00:14:00,800 --> 00:14:03,240 Slika je večina od vas, verjetno bo ali uporabljati na neki točki v svojem življenju. 170 00:14:03,240 --> 00:14:06,430 Boste uporabite nekaj podobnega Excelu. 171 00:14:06,430 --> 00:14:10,940 Da bi dobili podatke iz Excelove preglednice, ali pa kakršno koli obdelavo z njo, 172 00:14:10,940 --> 00:14:17,240 če bi želel napisati program C ali Python program, Java program, 173 00:14:17,240 --> 00:14:20,070 ravnati s podatki, ki ste jih shranjene tam, 174 00:14:20,070 --> 00:14:23,170 eden od najbolj pogostih načinov, da ga ven, je v datoteki CSV. 175 00:14:23,170 --> 00:14:26,850 In lahko odprli Excel in ko greš na "Shrani kot" dialog, 176 00:14:26,850 --> 00:14:32,840 lahko dobite od dejanskega datoteko CSV. 177 00:14:32,840 --> 00:14:35,890 >> Handy, da vedo, kako ravnati s temi stvarmi. 178 00:14:35,890 --> 00:14:42,010 Kako deluje, je, da je podobno - mislim, da je v bistvu posnemajo preglednice, 179 00:14:42,010 --> 00:14:47,590 če so, kot vidimo tukaj v zelo levo večino del, 180 00:14:47,590 --> 00:14:49,910 imamo vse priimke. 181 00:14:49,910 --> 00:14:54,670 Torej imamo Malan, nato Hardison, nato pa Bowden MacWilliam in nato Chan. 182 00:14:54,670 --> 00:14:59,470 Vse zadnjih imena. In potem vejica ločuje priimke iz prvih imen. 183 00:14:59,470 --> 00:15:02,970 David, Nate, Rob, Tommy in Zamyla. 184 00:15:02,970 --> 00:15:06,850 Vedno sem pomešajo Robby in Toma. 185 00:15:06,850 --> 00:15:10,940 In potem, na koncu, tretji stolpec je e-poštni naslov. 186 00:15:10,940 --> 00:15:18,500 Ko boste razumeli, da je preostali del programa je dokaj enostaven za uporabo. 187 00:15:18,500 --> 00:15:23,850 Kaj smo storili, da bi posnemajo to isto strukturo v našem programu C 188 00:15:23,850 --> 00:15:27,510 se smo uporabili strukturo. 189 00:15:27,510 --> 00:15:30,520 Bomo začeli igrati z njimi malo več kot dobro. 190 00:15:30,520 --> 00:15:35,790 Smo jih videli prvič malo v nizu problemov 3, ko smo se ukvarjajo s slovarji. 191 00:15:35,790 --> 00:15:40,290 Ampak to osebje struct shrani priimek, prvo ime in e-pošto. 192 00:15:40,290 --> 00:15:44,500 Tako kot naši datoteki CSV je shranjevanje. 193 00:15:44,500 --> 00:15:47,950 Torej, to je samo pretvorbi iz ene oblike v drugo. 194 00:15:47,950 --> 00:15:54,630 Moramo spremeniti, v tem primeru, da uslužbenec struct v vrstici, 195 00:15:54,630 --> 00:15:59,060 ločene z vejico line, kar tako. 196 00:15:59,060 --> 00:16:01,500 Ima to smisel? Fantje so naredile kviz, 197 00:16:01,500 --> 00:16:07,680 Mislim, da ste vsaj imeli nekaj časa za razmislek o tem. 198 00:16:07,680 --> 00:16:16,410 >> V najem funkcijo, problem nas prosi, naj se - Bomo povečaj o tem malo - 199 00:16:16,410 --> 00:16:22,480 sprejmejo v kadrovsko strukturo, osebje, struct, ki je ime, 200 00:16:22,480 --> 00:16:30,900 in dodajte njeno vsebino na našo datoteko staff.csv. 201 00:16:30,900 --> 00:16:34,230 Izkazalo se je, da je to precej enostavno za uporabo. 202 00:16:34,230 --> 00:16:37,430 Bomo nekako igral s temi funkcijami malo več danes. 203 00:16:37,430 --> 00:16:44,510 Toda v tem primeru je funkcija ovrednotenj je res ključnega pomena. 204 00:16:44,510 --> 00:16:51,960 Torej, z ovrednotenj, lahko natisnete, tako kot fantje so bili z uporabo printf ves ta mandat. 205 00:16:51,960 --> 00:16:55,050 Lahko printf vrstica v datoteki. 206 00:16:55,050 --> 00:16:59,030 Torej, namesto da bi samo običajni printf klic, če mu daš format niz 207 00:16:59,030 --> 00:17:05,380 potem pa zamenjal vse spremenljivke z naslednjimi argumenti, 208 00:17:05,380 --> 00:17:11,290 z ovrednotenj, vaš zelo prvi argument je, namesto da bi datoteko, ki jo želite napisati, da. 209 00:17:11,290 --> 00:17:21,170 Če smo bili, da pogled na to napravo, na primer, človek ovrednotenj, 210 00:17:21,170 --> 00:17:25,980 lahko vidimo razliko med printf in ovrednotenj. 211 00:17:25,980 --> 00:17:28,960 Jaz bom povečavo tukaj malo. 212 00:17:28,960 --> 00:17:33,140 Torej, z printf smo ji oblikovnega niza, nato pa nadaljnje trditve 213 00:17:33,140 --> 00:17:37,580 so vse spremenljivke za nadomestitev ali zamenjavo v našem formatu nizu. 214 00:17:37,580 --> 00:17:47,310 Ker je z ovrednotenj, prvi argument je res to sliko * imenujemo tok. 215 00:17:47,310 --> 00:17:51,800 >> Premikanje nazaj sem na naše najem, 216 00:17:51,800 --> 00:17:54,550 smo že dobili naše datoteke * tok odprl za nas. 217 00:17:54,550 --> 00:17:57,810 To je tisto, kar ta prva vrstica pa, da odpre datoteko staff.csv, 218 00:17:57,810 --> 00:18:01,690 jo odpre v načinu dodajanje in vse, kar je ostalo za nas, da to ni 219 00:18:01,690 --> 00:18:08,640 napišite kadrovsko strukturo v spis. 220 00:18:08,640 --> 00:18:10,870 In poglejmo, ali želim uporabiti iPad? 221 00:18:10,870 --> 00:18:17,900 Uporabil bom iPad. Imamo ničnost - Dajmo to na mizi, tako da lahko pišem malo bolje - 222 00:18:17,900 --> 00:18:33,680 nična najem in je potrebno v enem argumentu, kadrovsko strukturo, imenovano s. 223 00:18:33,680 --> 00:18:44,120 Imam svoje naramnice, imamo našo datoteko * imenovano datoteko 224 00:18:44,120 --> 00:18:48,380 imamo fopen linijo, ki nam, 225 00:18:48,380 --> 00:18:51,890 in jaz sem jo napisal kot pike, saj je že v občestva. 226 00:18:51,890 --> 00:19:00,530 In potem na našo naslednjo vrstico, bomo za klic v ovrednotenj 227 00:19:00,530 --> 00:19:03,700 in bomo prehod iz spisa, ki ga želimo tiskati, 228 00:19:03,700 --> 00:19:10,290 in potem naša formatni niz, ki je - 229 00:19:10,290 --> 00:19:14,300 Jaz bom pustil vi povej mi, kako izgleda. 230 00:19:14,300 --> 00:19:20,500 Kaj pa ti, Stella? Ali veste, kaj je prvi del niza formatu izgleda? 231 00:19:20,500 --> 00:19:24,270 [Stella] Nisem prepričan. >> Feel free to ask Jimmy. 232 00:19:24,270 --> 00:19:27,690 Ali veste, Jimmy? 233 00:19:27,690 --> 00:19:31,000 [Jimmy] bi bilo samo se zadnja? Ne vem. Nisem povsem prepričan. 234 00:19:31,000 --> 00:19:39,020 >> Redu. Kaj pa, je kdo dobil to pravilno na izpit? 235 00:19:39,020 --> 00:19:41,770 Ne redu. 236 00:19:41,770 --> 00:19:47,920 Izkazalo se je, da je tukaj vse, kar moramo storiti je, da želimo, da vsak del našega kadrovske strukture 237 00:19:47,920 --> 00:19:53,290 se natisne kot niz v naši datoteki. 238 00:19:53,290 --> 00:19:59,900 Samo uporabite niz Nadomeščanje značaj tri različne čase, ker imamo priimek 239 00:19:59,900 --> 00:20:07,160 sledi vejica, nato ime vejice, 240 00:20:07,160 --> 00:20:12,430 in na koncu je e-poštni naslov, ki je sledil -, ki ni 241 00:20:12,430 --> 00:20:15,140 vgradnjo na mojem zaslonu - vendar je sledil znak za novo vrstico. 242 00:20:15,140 --> 00:20:20,060 Tako bom napisala samo tam. 243 00:20:20,060 --> 00:20:23,560 In potem po našem oblikovnega niza, 244 00:20:23,560 --> 00:20:27,880 smo pravkar imeli zamenjave, ki imamo dostop z uporabo notacije dot 245 00:20:27,880 --> 00:20:31,370 ki smo jih videli v kompletu problema 3. 246 00:20:31,370 --> 00:20:48,820 Mi lahko uporabite s.last, s.first in s.email 247 00:20:48,820 --> 00:20:58,990 nadomestiti v teh treh vrednosti v našem formatu nizu. 248 00:20:58,990 --> 00:21:06,190 In kako je bilo? Smiselno? 249 00:21:06,190 --> 00:21:09,700 Ja? Ne? Predvidoma? Ok. 250 00:21:09,700 --> 00:21:14,180 >> Končni stvar, ki jo naredimo, ko smo natisnejo in po tem, ko smo odprli datoteko: 251 00:21:14,180 --> 00:21:17,370 ko smo odprli datoteko, moramo vedno zapomniti, da jo zaprete. 252 00:21:17,370 --> 00:21:19,430 Ker drugače bomo na koncu pušča spomin, 253 00:21:19,430 --> 00:21:22,500 porabo datoteke deskriptorjev. 254 00:21:22,500 --> 00:21:25,950 Torej, da ga zapre, katero funkcijo bomo uporabili? Daniel? 255 00:21:25,950 --> 00:21:30,120 [Daniel] fclose? >> Fclose, točno. 256 00:21:30,120 --> 00:21:37,520 Torej, zadnji del tega problema je, da ustrezno zapreti datoteko z uporabo fclose funkcijo, 257 00:21:37,520 --> 00:21:40,370 ki samo izgleda tako. 258 00:21:40,370 --> 00:21:43,880 Ne preveč noro. 259 00:21:43,880 --> 00:21:46,990 Kul. 260 00:21:46,990 --> 00:21:49,520 Torej, to je problem 33 na kvizu. 261 00:21:49,520 --> 00:21:52,480 Imeli bomo zagotovo več datoteko I / O prihajajo. 262 00:21:52,480 --> 00:21:55,130 Naredili bomo malo bolj na predavanju danes ali v oddelku danes 263 00:21:55,130 --> 00:22:01,710 ker to je tisto, kar se dogaja, da so večino tega prihajajoči pset. 264 00:22:01,710 --> 00:22:05,020 Gremo naprej s kvizom na tej točki. Ja? 265 00:22:05,020 --> 00:22:10,880 >> [Charlotte]] Zakaj fclose (datoteka) namesto fclose (staff.csv)? 266 00:22:10,880 --> 00:22:19,100 >> Ah. Ker se je izkazalo, da je - tako je vprašanje, ki je eno veliko, 267 00:22:19,100 --> 00:22:27,800 zakaj, ko smo napisali fclose, smo pisno fclose (datoteka) zvezdicami spremenljivko 268 00:22:27,800 --> 00:22:33,680 v nasprotju z imenom datoteke, staff.csv? Je to res? Ja. 269 00:22:33,680 --> 00:22:39,570 Torej poglejmo. Če sem preklopil nazaj na moj laptop, 270 00:22:39,570 --> 00:22:45,040 in poglejmo na fclose funkcijo. 271 00:22:45,040 --> 00:22:51,460 Torej fclose funkcija zapre tok in je potrebno v kazalca do potoka, ki ga želite zapreti, 272 00:22:51,460 --> 00:22:57,010 v nasprotju z dejanskim imenom datoteke, ki jo želimo zapreti. 273 00:22:57,010 --> 00:23:01,620 In to zato, ker v ozadju, ko kličete na fopen, 274 00:23:01,620 --> 00:23:12,020 ko odprete datoteko, ki ste ga dejansko dodelitev pomnilnika za shranjevanje informacij o datoteki. 275 00:23:12,020 --> 00:23:16,380 Torej imate datotečnega kazalca, ki ima informacije o datoteki, 276 00:23:16,380 --> 00:23:23,080 kot je to odprto, njegova velikost, če ste trenutno v spisu, 277 00:23:23,080 --> 00:23:29,100 tako da boste lahko branje in pisanje klicev na tem mestu v datoteki. 278 00:23:29,100 --> 00:23:38,060 Boste na koncu zaprtje kazalec namesto zapiranja ime datoteke. 279 00:23:38,060 --> 00:23:48,990 >> Ja? [Daniel] Torej, da bi uporabili najem, bi rekli - kako to dobiti vnos uporabnika? 280 00:23:48,990 --> 00:23:53,830 Ali ovrednotenj delujejo kot GetString v smislu, da bo to šele čakati uporabniškega vnosa 281 00:23:53,830 --> 00:23:57,180 in vas prosim, da ta tip - ali počakajte, da vnesete te tri stvari? 282 00:23:57,180 --> 00:24:00,480 Ali pa boste morali uporabiti nekaj za izvajanje najem? 283 00:24:00,480 --> 00:24:04,100 >> Ja. Torej nismo -, je bilo vprašanje, kako bomo dobili navodilo za vnos 284 00:24:04,100 --> 00:24:09,220 Za izvajanje najem? In kaj imamo tukaj je klicatelj najemna 285 00:24:09,220 --> 00:24:17,690 mimo tega osebja struct z vsemi podatki, ki so shranjeni v struct že. 286 00:24:17,690 --> 00:24:22,990 Torej ovrednotenj lahko samo napisati, da podatke neposredno v datoteko. 287 00:24:22,990 --> 00:24:25,690 Ni vam treba čakati na vnos uporabnika. 288 00:24:25,690 --> 00:24:32,110 Uporabnik je že glede na vložek z ustrezno ga je dala v tem struct zaposlenih. 289 00:24:32,110 --> 00:24:36,510 In stvari, seveda bi prekinil, če katerikoli od teh kazalcev je bilo null, 290 00:24:36,510 --> 00:24:40,370 tako da se pomaknete nazaj gor in se ozremo na naše struct. 291 00:24:40,370 --> 00:24:43,640 Imamo niz nazadnje, 1. niz, niz sporočilo. 292 00:24:43,640 --> 00:24:48,530 Zdaj vemo, da vse tiste, res pod pokrovom motorja, so spremenljivke char *. 293 00:24:48,530 --> 00:24:53,470 To je lahko ali pa tudi ne kaže na null. 294 00:24:53,470 --> 00:24:55,800 Lahko se kaže v spomin na kup, 295 00:24:55,800 --> 00:24:59,650 Mogoče spomin na kupu. 296 00:24:59,650 --> 00:25:04,580 Ne vem, ampak če kateri od teh kazalcev je nična ali neveljavna, 297 00:25:04,580 --> 00:25:08,120 , da boste zagotovo crash našo najema funkcijo. 298 00:25:08,120 --> 00:25:11,050 To je bilo nekaj, kar je nekako izven obsega izpit. 299 00:25:11,050 --> 00:25:16,440 Mi ne skrbi glede tega. 300 00:25:16,440 --> 00:25:22,170 Čudovito. Ok. Torej oddaljujejo od kviza. 301 00:25:22,170 --> 00:25:25,760 >> Naj blizu tega tipa, in gremo pogledati pset 4. 302 00:25:25,760 --> 00:25:34,700 Torej, če vi pogled na spec pset, ko lahko dostopate do njega, cs50.net/quizzes, 303 00:25:34,700 --> 00:25:42,730 smo šli skozi nekaj problemov rubriki danes. 304 00:25:42,730 --> 00:25:52,240 Jaz sem se pomaknete - Del vprašanj se začne na tretji strani pset spec. 305 00:25:52,240 --> 00:25:57,800 In prvi del vas vpraša, da gredo in pazi na kratko preusmerjanje in cevi. 306 00:25:57,800 --> 00:26:02,820 Ki je nekako kul Skratka, prikazuje nekaj novih, zanimivih trikov ukazne vrstice, ki jih lahko uporabite. 307 00:26:02,820 --> 00:26:06,050 In potem imamo nekaj vprašanj za vas. 308 00:26:06,050 --> 00:26:10,860 To prvo vprašanje o tokovih, ki printf piše privzeto 309 00:26:10,860 --> 00:26:15,920 smo nekako dotaknila le malo pred nekaj trenutki. 310 00:26:15,920 --> 00:26:22,380 Ta ovrednotenj, da sva samo razpravljamo se v toku datoteke * kot svoje trditve. 311 00:26:22,380 --> 00:26:26,580 fclose se v toku datotek *, kot tudi, 312 00:26:26,580 --> 00:26:32,660 in vrnitev vrednost fopen vam tok datoteke * kot dobro. 313 00:26:32,660 --> 00:26:36,060 Razlog nismo videli tisti prej, ko smo obravnavali printf 314 00:26:36,060 --> 00:26:39,450 zato, ker ima privzeto printf tok. 315 00:26:39,450 --> 00:26:41,810 In privzeto tok, ki ga piše 316 00:26:41,810 --> 00:26:45,190 boste izvedeli v kratkem. 317 00:26:45,190 --> 00:26:50,080 Torej, definitivno si na njem. 318 00:26:50,080 --> 00:26:53,010 >> V oddelku današnji bomo govorili malo o gdb, 319 00:26:53,010 --> 00:26:57,720 ker je bolj seznanjeni boste z njim, bolj praksa dobiš z njim, 320 00:26:57,720 --> 00:27:01,390 bolje se boste dejansko lovil hrošče v svojem kodeksu. 321 00:27:01,390 --> 00:27:05,540 To pospeši proces debugging up strašen. 322 00:27:05,540 --> 00:27:09,230 Torej, z uporabo printf, vsakič, ko boste to storili, da boste morali ponovno prevesti kodo, 323 00:27:09,230 --> 00:27:13,000 boste morali teči znova, včasih moraš premakniti printf klic v okolici, 324 00:27:13,000 --> 00:27:17,100 zakomentirajte kodo, potrebujem samo nekaj časa. 325 00:27:17,100 --> 00:27:20,850 Naš cilj je, da preizkusite in vas prepričali, da z gdb, lahko bistveno 326 00:27:20,850 --> 00:27:26,810 printf karkoli kjerkoli v kodi, in nikoli ne bo, da ga prevedem. 327 00:27:26,810 --> 00:27:35,120 Nikoli ne začeti in voditi ugibati, kam printf naprej. 328 00:27:35,120 --> 00:27:40,910 Prva stvar je, da kopirate to vrstico in dobili odsek kode off spletu. 329 00:27:40,910 --> 00:27:47,530 Jaz sem to kopiranje kode, ki pravi, "wget ​​http://cdn.cs50.net". 330 00:27:47,530 --> 00:27:49,510 Grem ga kopirajte. 331 00:27:49,510 --> 00:27:55,950 Jaz grem na mojo napravo, pomanjšate, tako da lahko vidite, kaj počnem, 332 00:27:55,950 --> 00:28:01,890 prilepite tja, in ko sem pritisnite tipko Enter, ta ukaz wget dobesedno spletni dobili. 333 00:28:01,890 --> 00:28:06,210 To se dogaja, da bi se odprl te datoteke off interneta, 334 00:28:06,210 --> 00:28:11,790 in to se dogaja, da ga shranite na trenutni imenik. 335 00:28:11,790 --> 00:28:21,630 Zdaj, če sem seznam moj trenutni imenik, lahko vidite, da sem dobil to datoteko section5.zip prav tam. 336 00:28:21,630 --> 00:28:25,260 Način za reševanje tega tipa je, da jo razširite, 337 00:28:25,260 --> 00:28:27,650 ki jih lahko naredite v ukazni vrstici, tako kot to. 338 00:28:27,650 --> 00:28:31,880 Section5.zip. 339 00:28:31,880 --> 00:28:36,980 To bo razširite ustvarite mapo za mene, 340 00:28:36,980 --> 00:28:40,410 napihne vse vsebine, ki jih v njem. 341 00:28:40,410 --> 00:28:47,410 Torej, zdaj lahko grem v mojo oddelku 5 imenika z ukazom cd. 342 00:28:47,410 --> 00:28:58,310 Počistite zaslon z jasno. Torej, počistite zaslon. 343 00:28:58,310 --> 00:29:02,280 Zdaj imam lepo čisto terminal za obravnavo. 344 00:29:02,280 --> 00:29:06,200 >> Zdaj, če sem seznam vseh datotek, ki sem ga videl v tem imeniku, 345 00:29:06,200 --> 00:29:12,270 boste videli, da imam štiri datoteke: buggy1, buggy2, buggy3 in buggy4. 346 00:29:12,270 --> 00:29:16,180 Prav tako sem dobil njihove ustrezne. C datotek. 347 00:29:16,180 --> 00:29:20,400 Ne bomo, da pogled na. Files C, za zdaj. 348 00:29:20,400 --> 00:29:24,140 Namesto tega se bomo, da jih uporabijo, ko smo odprli GDB. 349 00:29:24,140 --> 00:29:28,220 Imamo jih hranijo okoli, tako da imamo dostop do dejanske kode, ko smo z GDB, 350 00:29:28,220 --> 00:29:32,740 a cilj tega dela odseka je Lemiti okrog z gdb 351 00:29:32,740 --> 00:29:40,370 in videli, kako ga lahko uporabite, da ugotovimo, kaj je narobe z vsakim od teh štirih buggy programov. 352 00:29:40,370 --> 00:29:43,380 Torej smo le, da bo po prostoru zelo hitro, 353 00:29:43,380 --> 00:29:47,000 in jaz bom prosil nekoga, da delo z enim od buggy programov, 354 00:29:47,000 --> 00:29:54,730 in potem bova šla v skupini z gdb, pa bomo videli, kaj lahko storimo, da se določi teh programov, 355 00:29:54,730 --> 00:29:58,460 ali vsaj ugotoviti, kaj je šlo narobe, so v vsaki od njih. 356 00:29:58,460 --> 00:30:04,760 Začnimo tukaj z Danielom. Bo naletite buggy1? Poglejmo, kaj se zgodi. 357 00:30:04,760 --> 00:30:09,470 [Daniel] To pravi, da je uporaba kriv. >> Ja. Točno tako. 358 00:30:09,470 --> 00:30:12,460 Torej, če sem teči buggy1, dobim SEG napako. 359 00:30:12,460 --> 00:30:16,210 Na tej točki, lahko grem in odprli buggy1.c, 360 00:30:16,210 --> 00:30:19,450 poskusite ugotoviti, kaj je šlo narobe, 361 00:30:19,450 --> 00:30:22,000 ampak ena od najbolj gnusen stvari o tem SEG napake napake 362 00:30:22,000 --> 00:30:27,610 je, da ne pove o tem, kaj vrstica programa stvari dejansko šlo narobe in si zlomil. 363 00:30:27,610 --> 00:30:29,880 Si nekako morali pogledati na oznako 364 00:30:29,880 --> 00:30:33,990 in ugotoviti, s ugibati in preverite, ali printf da vidim, kaj je narobe. 365 00:30:33,990 --> 00:30:37,840 Ena izmed najboljših stvari približno gdb je, da je zelo, zelo enostavno 366 00:30:37,840 --> 00:30:42,170 razbrati linijo, na kateri je vaš program zruši. 367 00:30:42,170 --> 00:30:46,160 To je popolnoma vredno, da bi ga uporabili, pa čeprav samo za to. 368 00:30:46,160 --> 00:30:56,190 Torej zagnati GDB, sem tip GDB, potem pa sem ji pot do izvedljive datoteke, ki jih želim teči. 369 00:30:56,190 --> 00:31:01,960 Tukaj sem tipkanje gdb ./buggy1. 370 00:31:01,960 --> 00:31:06,600 Pritisnite tipko Enter. Daje mi vse te informacije o avtorskih pravicah, 371 00:31:06,600 --> 00:31:13,000 in tukaj boste videli to vrstico, ki pravi, "branje simbolov iz / home / 372 00:31:13,000 --> 00:31:17,680 jharvard/section5/buggy1. " 373 00:31:17,680 --> 00:31:22,060 In če bo šlo vse dobro, boste videli, da natisnete sporočilo, da je videti takole. 374 00:31:22,060 --> 00:31:25,500 To bom prebral simbole, bo rekel "Berem simbole iz vašega izvedljivo datoteko," 375 00:31:25,500 --> 00:31:29,900 in potem bo imela ta "Končano" sporočilo tukaj. 376 00:31:29,900 --> 00:31:35,410 Če vidite kakšno drugo različico tega, ali vidiš, da ni bilo mogoče najti simbolov 377 00:31:35,410 --> 00:31:41,460 ali kaj podobnega, kaj to pomeni, da ste jo pravkar ne pripravljajo svoje izvedljivo pravilno. 378 00:31:41,460 --> 00:31:49,980 Ko smo sestaviti programe za uporabo s gdb, moramo uporabiti, da se posebne g zastavo, 379 00:31:49,980 --> 00:31:54,540 in je naredil, da je privzeto, če zbere svoje programe, tako da z vnosom 380 00:31:54,540 --> 00:31:59,320 ali bi Otroški voziček ali da si opomore, vsak od njih. 381 00:31:59,320 --> 00:32:07,800 Ampak, če ste ročno izdelavo z Jek, potem boste morali iti in tudi, da je g-zastavo. 382 00:32:07,800 --> 00:32:10,310 >> Na tej točki, sedaj imamo GDB poziv, 383 00:32:10,310 --> 00:32:12,310 to je zelo preprost za zagon programa. 384 00:32:12,310 --> 00:32:19,740 Mi lahko vnesete tek, ali mi lahko samo tip r. 385 00:32:19,740 --> 00:32:22,820 Večina ukazov GDB lahko skrajša. 386 00:32:22,820 --> 00:32:25,940 Ponavadi na samo enega ali nekaj pisem, ki je zelo lepo. 387 00:32:25,940 --> 00:32:30,980 Torej Saad, če vtipkate r in pritisnite tipko Enter, kaj se zgodi? 388 00:32:30,980 --> 00:32:39,390 [Saad] Imam SIGSEGV, segmentacija napako in nato vse to klobasanje. 389 00:32:39,390 --> 00:32:43,650 >> Ja. 390 00:32:43,650 --> 00:32:47,990 Kot vidimo na zaslonu takoj, in kot Saad je dejal, 391 00:32:47,990 --> 00:32:53,430 ko smo vnesite tek ali r in pritisnite tipko Enter, smo še vedno zaslužiti isto napako SEG. 392 00:32:53,430 --> 00:32:55,830 Torej z GDB ne reši naš problem. 393 00:32:55,830 --> 00:32:59,120 Ampak to nam daje neko klobasanje in se izkaže, da je to klobasanje 394 00:32:59,120 --> 00:33:03,080 dejansko ne pove, kje se dogaja. 395 00:33:03,080 --> 00:33:10,680 Razčleniti to malo, ta prvi bit je funkcija, pri kateri gre vse narobe. 396 00:33:10,680 --> 00:33:20,270 Tam je to __ strcmp_sse4_2, in to nam pove, da se to dogaja v tej datoteki 397 00:33:20,270 --> 00:33:29,450 imenovano sysdeps/i386, vse to spet neke vrste nered - ampak postavka 254. 398 00:33:29,450 --> 00:33:31,670 To je nekako težko razčleniti. Ponavadi, ko vidiš stvari, kot je ta, 399 00:33:31,670 --> 00:33:38,770 to pomeni, da je seg prelomnicah v eni od sistemskih knjižnic. 400 00:33:38,770 --> 00:33:43,220 Torej, kaj storiti s strcmp. Fantje so videli strcmp prej. 401 00:33:43,220 --> 00:33:52,730 Ne preveč noro, toda ali to pomeni, da je strcmp pokvarjen ali da je problem z strcmp? 402 00:33:52,730 --> 00:33:57,110 Kaj misliš, Alexander? 403 00:33:57,110 --> 00:34:04,890 [Aleksander] Je to - je 254 meja? In - ne binarna, vendar to ni njihova zgornje meje, 404 00:34:04,890 --> 00:34:10,590 in potem je tukaj še en jezik, za vsako funkcijo. Je to 254 v tej funkciji, ali -? 405 00:34:10,590 --> 00:34:21,460 >> To je linija 254. Izgleda, da v tej datoteki. Ih, zato je montaža številka verjetno. 406 00:34:21,460 --> 00:34:25,949 >> Ampak, mislim, bolj pereče je to, ker smo gotten SEG napako 407 00:34:25,949 --> 00:34:29,960 in izgleda, kot da prihaja iz strcmp funkcija, 408 00:34:29,960 --> 00:34:38,030 ali to pomeni, potem je pokvarjen, da strcmp? 409 00:34:38,030 --> 00:34:42,290 To ne bi smel, upam. Torej, samo zato, ker imate Napaka pri razčlenjenosti 410 00:34:42,290 --> 00:34:49,480 v eni od sistemskih funkcij, običajno to pomeni, da ste jo pravkar ne imenuje pravilno. 411 00:34:49,480 --> 00:34:52,440 Najhitrejša stvar, da ugotovimo, kaj se pravzaprav dogaja 412 00:34:52,440 --> 00:34:55,500 ko boste videli nekaj norega, kot je ta, ko vidiš SEG napako 413 00:34:55,500 --> 00:34:59,800 še posebej, če imate program, ki je z več kot samo glavni, 414 00:34:59,800 --> 00:35:03,570 je uporaba povratno sledenje. 415 00:35:03,570 --> 00:35:13,080 Jaz Skrajšati povratno sledenje s pisanjem bt, v nasprotju s celotno besedo povratno sledenje. 416 00:35:13,080 --> 00:35:16,510 Ampak Charlotte, kaj se zgodi, ko vnašate bt in pritisnite tipko Enter? 417 00:35:16,510 --> 00:35:23,200 [Charlotte] To mi pokaže dve liniji, linija 0 in 1 vrstica. 418 00:35:23,200 --> 00:35:26,150 >> Ja. Torej linija 0 in 1 vrstica. 419 00:35:26,150 --> 00:35:34,560 To so dejanski odvodnikom okviri, ki so trenutno v igri, ko je vaš program sesul. 420 00:35:34,560 --> 00:35:42,230 Izhajajoč iz vrhunskega okvirja, okvir 0, in bo v spodnjem največ, kar je okvir 1. 421 00:35:42,230 --> 00:35:45,140 Naša vrhunska okvir je strcmp okvir. 422 00:35:45,140 --> 00:35:50,080 Si lahko zamislite, da je to podobno tega problema smo pravkar počne na kvizu s kazalci, 423 00:35:50,080 --> 00:35:54,890 , kjer smo zamenjali žetonov okvir na vrhu glavnim dimnik, 424 00:35:54,890 --> 00:35:59,700 in smo imeli spremenljivke, ki se je s pomočjo zamenjave na vrhu spremenljivk, ki je bila glavna uporabljajo. 425 00:35:59,700 --> 00:36:08,440 Tu naša nesreča se je zgodilo v naši strcmp funkcija, ki je bila sklicana za naše delovanje, 426 00:36:08,440 --> 00:36:14,370 in 'backtrace nam daje ne samo funkcije, ki stvari ni uspela, 427 00:36:14,370 --> 00:36:16,440 ampak to je tudi nam pove, kje vse je klical. 428 00:36:16,440 --> 00:36:18,830 Torej, če sem se pomaknite čez Malo bolj na desno, 429 00:36:18,830 --> 00:36:26,110 lahko vidimo, da ja, bili smo na liniji 254 tega strcmp-sse4.s datoteke. 430 00:36:26,110 --> 00:36:32,540 Vendar je bil poziv na buggy1.c, linija 6. 431 00:36:32,540 --> 00:36:35,960 Torej to pomeni, da ne moremo storiti - je lahko greva pogledat in videl, kaj se dogaja 432 00:36:35,960 --> 00:36:39,930 V buggy1.c, linija 6. 433 00:36:39,930 --> 00:36:43,780 Again, obstaja nekaj načinov, da to storijo. Ena je, da izhod iz gdb 434 00:36:43,780 --> 00:36:49,460 ali ima vaša koda odprla v novem oknu in navzkrižno sklicevanje. 435 00:36:49,460 --> 00:36:54,740 To pa samo po sebi, je zelo priročno, saj zdaj, če ste na uradnih ur 436 00:36:54,740 --> 00:36:57,220 in imaš SEG napako in vaše TF se je spraševal, kje vse je bil zlom, 437 00:36:57,220 --> 00:36:59,710 lahko samo rečem: "Oh, linija 6. Ne vem, kaj se dogaja, 438 00:36:59,710 --> 00:37:03,670 ampak nekaj linije 6, ki povzroča moj program, da bi prekinil. " 439 00:37:03,670 --> 00:37:10,430 Drugi način za to je, da lahko uporabite ta ukaz, imenovano seznam gdb. 440 00:37:10,430 --> 00:37:13,650 Prav tako ga lahko skrči v l. 441 00:37:13,650 --> 00:37:18,910 Torej, če smo zadeti l, na kaj smo prišli sem? 442 00:37:18,910 --> 00:37:21,160 Smo dobili cel kup čudnih stvari. 443 00:37:21,160 --> 00:37:26,030 To je dejansko montažo koda 444 00:37:26,030 --> 00:37:29,860 , ki je v strcmp_sse4_2. 445 00:37:29,860 --> 00:37:32,440 To zgleda funky, 446 00:37:32,440 --> 00:37:36,520 in zato smo dobili to zato, ker prav zdaj, 447 00:37:36,520 --> 00:37:40,160 GDB nam je v okvirju 0. 448 00:37:40,160 --> 00:37:43,070 >> Torej, kadarkoli pogledamo spremenljivk, kadar koli se ozremo na izvorno kodo, 449 00:37:43,070 --> 00:37:50,530 smo iskali na kodi, ki se nanaša na dimnik okvirja smo trenutno noter 450 00:37:50,530 --> 00:37:53,200 Torej, da bi dobili ničesar pomembnega, moramo 451 00:37:53,200 --> 00:37:57,070 premakniti na kup okvir, ki omogoča bolj smiselno. 452 00:37:57,070 --> 00:38:00,180 V tem primeru bi bila glavni okvir sklad bi malo bolj smiselno, 453 00:38:00,180 --> 00:38:02,680 ker je to dejansko kodo, ki smo pisali. 454 00:38:02,680 --> 00:38:05,330 Ne strcmp kodo. 455 00:38:05,330 --> 00:38:08,650 Tako boste lahko premikate med okvirji, v tem primeru, saj imamo 2, 456 00:38:08,650 --> 00:38:10,430 imamo 0 in 1, 457 00:38:10,430 --> 00:38:13,650 vam, da s gor in dol ukazov. 458 00:38:13,650 --> 00:38:18,480 Če sem premakniti za eno okvir, 459 00:38:18,480 --> 00:38:21,770 Zdaj sem v glavnem okvirju dimnika. 460 00:38:21,770 --> 00:38:24,330 Ne morem premakniti navzdol, da gredo tja, kjer sem bil, 461 00:38:24,330 --> 00:38:32,830 šel spet nazaj dol in se znova dvignila. 462 00:38:32,830 --> 00:38:39,750 Če boste kdaj narediti svoj program v gdb, boste dobili crash, boste dobili povratno sledenje, 463 00:38:39,750 --> 00:38:42,380 in boste videli, da je v neki datoteki, ki ne veste, kaj se dogaja. 464 00:38:42,380 --> 00:38:45,460 Poiskusite seznam koda ne izgleda poznano, 465 00:38:45,460 --> 00:38:48,150 da pogled na vaše okvirjev in ugotoviti, kje se nahajate. 466 00:38:48,150 --> 00:38:51,010 Verjetno si na napačnem okviru dimnika. 467 00:38:51,010 --> 00:38:58,760 Ali pa vsaj, da si v okviru dimnik, ki ni tista, ki lahko zares debug. 468 00:38:58,760 --> 00:39:03,110 Zdaj, ko smo v okviru ustreznega dimnika, smo v glavnem 469 00:39:03,110 --> 00:39:08,100 Zdaj lahko uporabite seznam ukaz, da ugotovimo, kaj je bila črta. 470 00:39:08,100 --> 00:39:13,590 In lahko vidite, jo natisne za nas tukaj. 471 00:39:13,590 --> 00:39:19,470 Lahko pa smo zadeli seznam vseh enak, in seznam daje nam to lepo izpisa 472 00:39:19,470 --> 00:39:23,920 dejanske izvorne kode, ki se dogaja v tukaj. 473 00:39:23,920 --> 00:39:26,420 >> Še posebej, smo lahko ogledate na liniji 6. 474 00:39:26,420 --> 00:39:29,330 Vidimo lahko, kaj se dogaja tukaj. 475 00:39:29,330 --> 00:39:31,250 In izgleda, da delamo niz primerjavo 476 00:39:31,250 --> 00:39:41,050 Med niz "CS50 skale" in argv [1]. 477 00:39:41,050 --> 00:39:45,700 Nekaj ​​o tem je bil treskav. 478 00:39:45,700 --> 00:39:54,120 Torej, Missy, imate kakšne misli o tem, kaj bi se tukaj dogaja? 479 00:39:54,120 --> 00:39:59,400 [Missy] Ne vem, zakaj se treskav. >> Ne vem, zakaj se treskav? 480 00:39:59,400 --> 00:40:02,700 Jimmy, vse misli? 481 00:40:02,700 --> 00:40:06,240 [Jimmy] Nisem povsem prepričan, ampak nazadnje, ko smo uporabili niz primerjavo, 482 00:40:06,240 --> 00:40:10,260 ali strcmp smo imeli kot treh primerih v skladu s tem. 483 00:40:10,260 --> 00:40:12,800 Nismo imeli ==, jaz ne mislim, prav v tej prvi vrstici. 484 00:40:12,800 --> 00:40:16,700 Namesto tega je bil razdeljen na tri, ena pa je bila == 0, 485 00:40:16,700 --> 00:40:19,910 eden je bil <0, mislim, ena pa je bila> 0. 486 00:40:19,910 --> 00:40:22,590 Mogoče kaj takega? >> Ja. Torej je to vprašanje 487 00:40:22,590 --> 00:40:27,200 z dne delamo primerjave pravilno? 488 00:40:27,200 --> 00:40:31,660 Stella? Vsak misli? 489 00:40:31,660 --> 00:40:38,110 [Stella] Nisem prepričan. >> Ne vem. Daniel? Misli? Ok. 490 00:40:38,110 --> 00:40:44,770 Izkazalo se je, kaj se dogaja tukaj, ko smo zagnali program, 491 00:40:44,770 --> 00:40:48,370 in imamo SEG napako, ko ste zagnali program za prvič, Daniel 492 00:40:48,370 --> 00:40:50,800 si ji vse argumente v ukazni vrstici? 493 00:40:50,800 --> 00:40:58,420 [Daniel] No No >> V tem primeru, kaj je vrednost argv [1]? 494 00:40:58,420 --> 00:41:00,920 >> Ni vrednota. >> Desno. 495 00:41:00,920 --> 00:41:06,120 No, ni primerno vrednost niza. 496 00:41:06,120 --> 00:41:10,780 Vendar pa obstaja nekaj vrednosti. Kakšna je vrednost, ki se shrani v tam? 497 00:41:10,780 --> 00:41:15,130 >> Smeti vrednost? >> To je bodisi smeti vrednost ali, v tem primeru, 498 00:41:15,130 --> 00:41:19,930 konec niza argv se vedno zaključi z nično. 499 00:41:19,930 --> 00:41:26,050 Torej, kaj se je dejansko dobil shranjene tam je nična. 500 00:41:26,050 --> 00:41:30,810 Drugi način za reševanje tega, namesto da bi razmišljal prek 501 00:41:30,810 --> 00:41:33,420 je, da ga poskusite tiskanje. 502 00:41:33,420 --> 00:41:35,880 To je, če sem rekel, da je uporaba gdb je super, 503 00:41:35,880 --> 00:41:40,640 saj si lahko natisnete vse spremenljivke, vse vrednosti, ki jih želite 504 00:41:40,640 --> 00:41:43,230 uporabo te priročne-Dandy p ukaz. 505 00:41:43,230 --> 00:41:48,520 Torej, če sem tip P in potem vnesite vrednost spremenljivke ali ime spremenljivke, 506 00:41:48,520 --> 00:41:55,320 pravijo, argc, vidim, da argc je 1. 507 00:41:55,320 --> 00:42:01,830 Če hočem izpisati argv [0], lahko to storite kar tako. 508 00:42:01,830 --> 00:42:04,840 In kot smo videli, argv [0], je vedno ime vašega programa, 509 00:42:04,840 --> 00:42:06,910 Vedno je ime izvršljiv. 510 00:42:06,910 --> 00:42:09,740 Tukaj lahko vidite, da je dobil polno ime poti. 511 00:42:09,740 --> 00:42:15,920 Lahko tudi natisnete argv [1], in videli, kaj se bo zgodilo. 512 00:42:15,920 --> 00:42:20,890 >> Tu imamo takšno mistične vrednosti. 513 00:42:20,890 --> 00:42:23,890 Imamo to 0x0. 514 00:42:23,890 --> 00:42:27,850 Ne pozabite na začetku mandata, ko smo govorili o šestnajstiških številk? 515 00:42:27,850 --> 00:42:34,680 Ali pa, da malo vprašanje na koncu pset 0 o tem, kako se predstavljajo 50 v hex? 516 00:42:34,680 --> 00:42:39,410 Pot smo napisali hex številke v CS, samo, da ne bomo zamenjali 517 00:42:39,410 --> 00:42:46,080 z decimalno številko, je, da smo jih vedno predpono 0x. 518 00:42:46,080 --> 00:42:51,420 Torej, to 0X vedno pomeni le razlago naslednjo številko kot šestnajstiško število, 519 00:42:51,420 --> 00:42:57,400 ne kot niz in ne kot decimalno število, ne pa kot binarno število. 520 00:42:57,400 --> 00:43:02,820 Ker je število 5-0 je veljavna številka v šestnajstiško. 521 00:43:02,820 --> 00:43:06,240 In to je število v decimalni, 50. 522 00:43:06,240 --> 00:43:10,050 Torej, to je samo, kako bomo nerazdvoumljajo. 523 00:43:10,050 --> 00:43:14,860 Torej 0x0 pomeni šestnajstiško 0, kar je tudi decimalno 0, 0 binarni. 524 00:43:14,860 --> 00:43:17,030 To je samo vrednost 0. 525 00:43:17,030 --> 00:43:22,630 Izkazalo se je, da je to tisto, kar je nična, pravzaprav v spominu. 526 00:43:22,630 --> 00:43:25,940 Nič je samo 0. 527 00:43:25,940 --> 00:43:37,010 Tu element shranjen v argv [1], je nična. 528 00:43:37,010 --> 00:43:45,220 Torej bomo poskušali primerjati naše "CS50 kamenje" niz v ničelni niz. 529 00:43:45,220 --> 00:43:48,130 Torej Dereferenciranje nično, poskuša dostopati do stvari null, 530 00:43:48,130 --> 00:43:55,050 ki se običajno dogaja, da povzročajo neke vrste napake segmentacije ali drugih slabih stvari dogajajo. 531 00:43:55,050 --> 00:43:59,350 In izkazalo se je, da strcmp ne preverite 532 00:43:59,350 --> 00:44:04,340 ali ste opravili v vrednosti, ki je nična. 533 00:44:04,340 --> 00:44:06,370 Nasprotno, gre samo naprej, poskuša narediti svoje stvari, 534 00:44:06,370 --> 00:44:14,640 in če seg napake, je seg napake, in to je tvoj problem. Moraš iti popraviti. 535 00:44:14,640 --> 00:44:19,730 Res hitro, kako bi lahko rešili ta problem? Charlotte? 536 00:44:19,730 --> 00:44:23,540 [Charlotte] lahko preverite, če uporabljate. 537 00:44:23,540 --> 00:44:32,240 Torej, če argv [1], null, == 0, vrne 1, ali kaj [nerazumljivo]. 538 00:44:32,240 --> 00:44:34,590 >> Ja. Torej, to je en odličen način, da to storite, saj bomo lahko preverite, 539 00:44:34,590 --> 00:44:39,230 Vrednost bomo kmalu preide v strcmp, argv [1], je null? 540 00:44:39,230 --> 00:44:45,830 Če je nična, potem lahko rečemo, ok, prekine. 541 00:44:45,830 --> 00:44:49,450 >> Pogostejši način za to je, da uporabite argc vrednost. 542 00:44:49,450 --> 00:44:52,040 Ogledate si lahko tukaj na začetku main, 543 00:44:52,040 --> 00:44:58,040 Izpustili smo, da je prvi poskus, ki smo ponavadi storite, ko bomo uporabili argumente v ukazni vrstici, 544 00:44:58,040 --> 00:45:05,240 ki je preizkusiti, ali ni naša argc vrednost je tisto, kar smo pričakovali. 545 00:45:05,240 --> 00:45:10,290 V tem primeru smo pričakovali vsaj dva argumenta, 546 00:45:10,290 --> 00:45:13,660 ime programa in en drugega. 547 00:45:13,660 --> 00:45:17,140 Ker smo tik pred uporabo drugega argumenta tukaj. 548 00:45:17,140 --> 00:45:21,350 Torej imajo neke vrste preizkus vnaprej, pred našim klicem strcmp 549 00:45:21,350 --> 00:45:37,390 da se preizkusi, ali je argv najmanj 2, bi tudi storijo enako stvari. 550 00:45:37,390 --> 00:45:40,620 Vidimo lahko, če to deluje tako, da zaženete program. 551 00:45:40,620 --> 00:45:45,610 Vedno lahko ponovno zagnati program v gdb, ki je res lepo. 552 00:45:45,610 --> 00:45:49,310 Lahko bežiš, in ko se boste peljali v argumentih v vaš program, 553 00:45:49,310 --> 00:45:53,060 jih prenese v trenutku, ko zaženete klic, ne, ko škorenj ki gre gor GDB. 554 00:45:53,060 --> 00:45:57,120 Na ta način lahko obdržite sklicuje svoj program z različnimi argumenti vsakič. 555 00:45:57,120 --> 00:46:08,080 Torej teči, ali še lahko vpišem r, in poglejmo, kaj se zgodi, če vpišemo "zdravo". 556 00:46:08,080 --> 00:46:11,140 To bo vedno vas prosim, če želite, da ga začeti od začetka znova. 557 00:46:11,140 --> 00:46:17,490 Ponavadi, če res želite, da ga začeti od začetka znova. 558 00:46:17,490 --> 00:46:25,010 In na tej točki se znova zažene znova, se natisne 559 00:46:25,010 --> 00:46:28,920 Program, ki ga uporabljate, buggy1, z argumentom, zdravo, 560 00:46:28,920 --> 00:46:32,720 in natisne te standardne ven, pravi: "Dobiš D," žalostno podobo. 561 00:46:32,720 --> 00:46:37,610 Toda nismo seg napake. To je dejal, da je proces izstopilo običajno. 562 00:46:37,610 --> 00:46:39,900 Tako, da izgleda precej dobro. 563 00:46:39,900 --> 00:46:43,050 Nič več seg napake, smo pa preteklost, 564 00:46:43,050 --> 00:46:48,190 tako da izgleda kot da je res kriv segment napako, da smo dobili. 565 00:46:48,190 --> 00:46:51,540 Žal pa nam pove, da smo dobili D. 566 00:46:51,540 --> 00:46:54,090 >> Lahko gremo nazaj in pogledate kodo in videli, kaj se dogaja tam 567 00:46:54,090 --> 00:46:57,980 da ugotovimo, kaj je - zakaj je nam povedali, da imamo D. 568 00:46:57,980 --> 00:47:03,690 Pa poglejmo, tu je ta printf rekel, da imaš D. 569 00:47:03,690 --> 00:47:08,540 Če vpišemo seznama, kot ste obdržati tipkanje seznam, ohranja ponavljanjem navzdol po programu, 570 00:47:08,540 --> 00:47:10,940 tako da bomo vam pokaže prvih nekaj vrstic vašega programa. 571 00:47:10,940 --> 00:47:15,450 Potem pa je pokazal v naslednjih nekaj vrstic in naslednji in naslednji kos kos. 572 00:47:15,450 --> 00:47:18,240 In da bomo trudili, da gredo dol. 573 00:47:18,240 --> 00:47:21,180 In sedaj bomo prišli do "linijo številka 16 je izven območja." 574 00:47:21,180 --> 00:47:23,940 Ker ima le 15 vrstic. 575 00:47:23,940 --> 00:47:30,310 Če prideš do te točke in da je vaš sprašujete: "Kaj naj storim?" lahko uporabite ukaz za pomoč. 576 00:47:30,310 --> 00:47:34,340 Uporabite pomoč, nato pa ji je ime ukaza. 577 00:47:34,340 --> 00:47:36,460 In vidite GDB nam vse te vrste stvari. 578 00:47:36,460 --> 00:47:43,870 Pravi: "brez argumentov, navaja 10 več linij po ali okoli prejšnji seznam. 579 00:47:43,870 --> 00:47:47,920 Seznam - seznam 10 vrstic, preden - " 580 00:47:47,920 --> 00:47:52,960 Torej poskusite s seznama minus. 581 00:47:52,960 --> 00:47:57,000 In da našteva 10 vrstic prejšnji, si lahko igral s seznamom malo. 582 00:47:57,000 --> 00:48:02,330 To lahko naredite seznam, seznam opravil -, lahko celo dal seznam številke, kot je seznam 8, 583 00:48:02,330 --> 00:48:07,500 in da bomo seznam 10 vrstic okoli 8. vrstici. 584 00:48:07,500 --> 00:48:10,290 In si lahko ogledate, kaj se dogaja tu imaš preprost, če drugje. 585 00:48:10,290 --> 00:48:13,980 Če vnesete v CS50 skalah, da natisne "Dobiš A." 586 00:48:13,980 --> 00:48:16,530 V nasprotnem primeru se izpiše "Dobiš D." 587 00:48:16,530 --> 00:48:23,770 Škoda mesto. V redu. Ja? 588 00:48:23,770 --> 00:48:26,730 >> [Daniel] Torej, ko sem se potrudil početje CS50 kamenje brez narekovajev, 589 00:48:26,730 --> 00:48:29,290 pravi: "Dobiš D." 590 00:48:29,290 --> 00:48:32,560 Potreboval sem narekovaje, da dobim delo, zakaj je to? 591 00:48:32,560 --> 00:48:38,490 >> Ja. Izkazalo se je, da ko - to je še ena zabavna malo Malčice - 592 00:48:38,490 --> 00:48:47,900 Ko zaženete program, če ga vodijo in vpišemo v CS50 skale, 593 00:48:47,900 --> 00:48:50,800 tako kot je rekel Daniel je naredil, in ga pritisnite tipko Enter, 594 00:48:50,800 --> 00:48:52,870 je še vedno pravi, da smo dobili D. 595 00:48:52,870 --> 00:48:55,580 In vprašanje je, zakaj je to? 596 00:48:55,580 --> 00:49:02,120 In izkazalo se je, da sta naš terminal in GDB razčleniti to v obliki dveh ločenih argumentov. 597 00:49:02,120 --> 00:49:04,800 Ker, ko obstaja prostor, ki je pomenila, kot 598 00:49:04,800 --> 00:49:08,730 Prvi argument je končalo, je naslednji argument se bo kmalu začela. 599 00:49:08,730 --> 00:49:13,260 Pot do kombinirate na dva dela, ali pa nam v eno trditev, 600 00:49:13,260 --> 00:49:18,510 je uporaba narekovajev. 601 00:49:18,510 --> 00:49:29,560 Torej, zdaj, če bi ga dal v narekovaje in ga ponovno zagnati, dobimo A. 602 00:49:29,560 --> 00:49:38,780 Torej, samo da povzamem, so brez narekovajev, CS50 in čeri razčleniti kot dve ločeni argumentov. 603 00:49:38,780 --> 00:49:45,320 Z narekovaji, to je razčlenjen kot en argument v celoti. 604 00:49:45,320 --> 00:49:53,070 >> To lahko vidimo z mejnimi vrednostmi. 605 00:49:53,070 --> 00:49:54,920 Do sedaj smo bili teče naš program, in to je bilo tekmovanje v teku 606 00:49:54,920 --> 00:49:58,230 dokler se bodisi seg napak ali Zadetkov napako 607 00:49:58,230 --> 00:50:05,930 ali, dokler se ne prekine in vse je bilo povsem v redu. 608 00:50:05,930 --> 00:50:08,360 To ni nujno najbolj koristna stvar, ker včasih 609 00:50:08,360 --> 00:50:11,840 imate napako v programu, vendar je ne povzroča segmentacijo napako. 610 00:50:11,840 --> 00:50:16,950 To ne povzroča vaš program ustaviti ali kaj podobnega. 611 00:50:16,950 --> 00:50:20,730 Način, da dobite GDB, da prekinete vaš program na določenem mestu 612 00:50:20,730 --> 00:50:23,260 je določiti odmerka. 613 00:50:23,260 --> 00:50:26,520 Lahko naredite tako, da nastavite prekinitveno točko na ime funkcije 614 00:50:26,520 --> 00:50:30,770 ali si lahko nastavite prekinitveno točko na nekem kode. 615 00:50:30,770 --> 00:50:34,450 Všeč mi je, da nastavite prekinitvene točke na funkcijo imen, ker - težko zapomniti, 616 00:50:34,450 --> 00:50:37,700 in če si dejansko šel in ga spremenite izvorno kodo gor malo, 617 00:50:37,700 --> 00:50:42,020 potem bo vaš Ustavljanje dejansko bivanje na istem mestu v kodi. 618 00:50:42,020 --> 00:50:44,760 Ker če uporabljate številke vrstic in številke vrstic sprememb 619 00:50:44,760 --> 00:50:51,740 ker si dodati ali izbrisati nekaj kode, potem so vaši Prelomne točke vsi popolnoma zajebali. 620 00:50:51,740 --> 00:50:58,590 Eden od najpogostejših stvari, ki sem storiti, je nastaviti odmerka za glavno funkcijo. 621 00:50:58,590 --> 00:51:05,300 Pogosto bom zagnati GDB, bom tipa B Main, pritisnite tipko Enter, in da bomo nastavite prekinitveno točko 622 00:51:05,300 --> 00:51:10,630 o glavnih funkcij, ki samo pravi, "zaustavite program takoj, ko se začnejo izvajati," 623 00:51:10,630 --> 00:51:17,960 in na ta način, ko sem teči moj program z, recimo, CS50 skale dva argumenta 624 00:51:17,960 --> 00:51:24,830 in pritisnite tipko Enter, da postane na glavno funkcijo in se ne ustavi takoj na zelo prvi vrstici, 625 00:51:24,830 --> 00:51:30,620 tik preden se ocenjuje strcmp funkcijo. 626 00:51:30,620 --> 00:51:34,940 >> Ker sem jaz zaustavljena, zdaj lahko začnem mucking okoli in videli, kaj se dogaja 627 00:51:34,940 --> 00:51:40,250 z vsemi različnimi spremenljivkami, ki pride v mojem programu. 628 00:51:40,250 --> 00:51:43,670 Tu lahko natisnete argc in videli, kaj se dogaja. 629 00:51:43,670 --> 00:51:50,030 Glej, da argc je 3, saj ima 3 različne vrednosti v njem. 630 00:51:50,030 --> 00:51:54,060 To je dobil ime programa, to je dobil prvi argument in drugega argumenta. 631 00:51:54,060 --> 00:52:09,330 Mi lahko natisnete tistih, ki jih je videti na argv [0], argv [1], in argv [2]. 632 00:52:09,330 --> 00:52:12,030 Sedaj lahko vidite tudi, zakaj ta klic strcmp se dogaja, da ne, 633 00:52:12,030 --> 00:52:21,650 saj vidiš, da se je to razdelilo CS50 in kamenje v dveh ločenih argumentov. 634 00:52:21,650 --> 00:52:27,250 Na tej točki, ko ste zadeli odmerka, lahko nadaljujete s korakom po programu 635 00:52:27,250 --> 00:52:32,920 Po vrsticah, v primerjavi z začetkom vaš program znova. 636 00:52:32,920 --> 00:52:35,520 Torej, če ne želite, da začnete program znova in samo nadaljujemo od tukaj, 637 00:52:35,520 --> 00:52:41,970 lahko uporabite ukaz še naprej in še bo potekal program do konca. 638 00:52:41,970 --> 00:52:45,010 Tako kot je to storila tukaj. 639 00:52:45,010 --> 00:52:54,880 Vendar, če sem ponovno zagnati program, CS50 kamenje, se dotakne mojega odmerka enkrat, 640 00:52:54,880 --> 00:52:59,670 in tokrat, če ne želim, da pojdi vso pot skozi preostanek programa, 641 00:52:59,670 --> 00:53:08,040 Lahko uporabite naslednji ukaz, ki je prav tako skrajšujejo s n. 642 00:53:08,040 --> 00:53:12,960 In ta korak v celotnem programskem po vrsticah. 643 00:53:12,960 --> 00:53:17,530 Torej si lahko ogledate v stvari, izvajajo, kot spremenljivke sprememb, saj se posodablja stvari. 644 00:53:17,530 --> 00:53:21,550 Kar je zelo lepo. 645 00:53:21,550 --> 00:53:26,570 Druga stvar je kul, ne pa ponavljanje istega ukaz znova in znova in znova, 646 00:53:26,570 --> 00:53:30,670 Če pritisnite tipko Enter - tako da tukaj vidite, nisem vnesli v nič - 647 00:53:30,670 --> 00:53:33,780 če sem pritisnite tipko Enter, se bo ponovil prejšnji ukaz, 648 00:53:33,780 --> 00:53:36,900 ali prejšnji ukaz GDB, da sem dal noter 649 00:53:36,900 --> 00:53:56,000 Lahko da pritisnemo Enter in se bomo še naprej okrepiti z mojo kodo po vrsticah. 650 00:53:56,000 --> 00:53:59,310 Spodbudil bi vi iti preverite druge programe buggy kot dobro. 651 00:53:59,310 --> 00:54:01,330 Nimamo časa, da bi se skozi vse od njih danes v oddelku. 652 00:54:01,330 --> 00:54:05,890 Izvorna koda je tam, tako da lahko nekako videli, kaj se dogaja 653 00:54:05,890 --> 00:54:07,730 V zakulisju, če se res zaljubljen, 654 00:54:07,730 --> 00:54:11,940 ampak vsaj, vadili le škorenj ki gre gor GDB, 655 00:54:11,940 --> 00:54:13,940 vodenje programa, dokler se ne zlomi na vas, 656 00:54:13,940 --> 00:54:18,260 dobili povratno sledenje, poskušal ugotoviti, kaj deluje crash bil, 657 00:54:18,260 --> 00:54:24,450 kaj postavka je bila na, tiskanje na nekatere spremenljive vrednosti, 658 00:54:24,450 --> 00:54:30,140 samo zato, da boste dobili občutek za to, ker bo to res pomagalo greš naprej. 659 00:54:30,140 --> 00:54:36,340 Na tej točki se bomo nehal iz gdb, ki vam z uporabo prenehati ali pa q. 660 00:54:36,340 --> 00:54:40,460 Če je vaš program sredi teče vedno, in je ni zapustil, 661 00:54:40,460 --> 00:54:43,510 da bo vedno vprašajte: "Ali ste prepričani, da res želite končati?" 662 00:54:43,510 --> 00:54:48,770 Lahko samo zadeti ja. 663 00:54:48,770 --> 00:54:55,250 >> Zdaj bomo pogled na naslednjo težavo imamo, ki je mačka program. 664 00:54:55,250 --> 00:54:59,880 Če si gledal na kratko preusmerjanje in cevi, boste videli, da je Tommy uporablja ta program 665 00:54:59,880 --> 00:55:07,540 da v bistvu natisne vse izhod v datoteko na zaslon. 666 00:55:07,540 --> 00:55:12,660 Torej, če sem teči mačko, to je dejansko vgrajen program za naprave, 667 00:55:12,660 --> 00:55:16,860 in če imate Mac, lahko to na vašem Mac Tudi, če ste odprli terminal. 668 00:55:16,860 --> 00:55:25,630 In mi - mačka, recimo, cp.c in pritisnite tipko Enter. 669 00:55:25,630 --> 00:55:29,640 Kaj je to storil, če se pomaknite malo nazaj in videli, kje smo zagnali linijo, 670 00:55:29,640 --> 00:55:40,440 ali kadar smo naleteli ukaza cat, je dobesedno samo izpisal vsebino cp.c naše zaslonu. 671 00:55:40,440 --> 00:55:44,140 Lahko ga ponovno zaženete in jo lahko dal v več datotek skupaj. 672 00:55:44,140 --> 00:55:49,880 Torej, lahko to storite mačka cp.c, in potem bomo lahko tudi spenjanje cat.c datoteko 673 00:55:49,880 --> 00:55:53,250 katere je program bomo o tem pisati, 674 00:55:53,250 --> 00:55:58,140 in ti jo natisne obe datoteki na hrbtni strani naše zaslonu. 675 00:55:58,140 --> 00:56:05,490 Torej, če se pomaknete navzgor malo vidimo, da ko sva tekla ta mačka cp.c, cat.c, 676 00:56:05,490 --> 00:56:17,110 Sprva je natisnjen CP datoteko, in nato pod njo, je natisnjen ven cat.c datoteko prav tukaj. 677 00:56:17,110 --> 00:56:19,650 Bomo uporabite to le dobili naše noge mokre. 678 00:56:19,650 --> 00:56:25,930 Poigrajte se z enostavnim tiskanje na terminalu, da vidite, kako deluje. 679 00:56:25,930 --> 00:56:39,170 Če vi odprli z gedit cat.c, pritisnite tipko Enter, 680 00:56:39,170 --> 00:56:43,760 si lahko ogledate program, da smo o tem pisati. 681 00:56:43,760 --> 00:56:48,980 Vključili smo to lepo kotla ploščo, tako da nam ni treba izgubljati časa tipkanje vse to. 682 00:56:48,980 --> 00:56:52,310 Prav tako preverite število argumentov opravili noter 683 00:56:52,310 --> 00:56:56,910 Mi natisnete lepo navada sporočilo. 684 00:56:56,910 --> 00:57:00,950 >> To je reč, da spet, kot smo se pogovarjali o tem, 685 00:57:00,950 --> 00:57:04,490 to je skoraj tako, kot podzavestno. 686 00:57:04,490 --> 00:57:07,190 Zapomnite si, da delaš isto vrsto stvari 687 00:57:07,190 --> 00:57:11,310 in vedno tiskanje neke vrste koristnih sporočilo 688 00:57:11,310 --> 00:57:17,670 tako da ljudje vedo, kako teči vaš program. 689 00:57:17,670 --> 00:57:21,630 Z mačko, to je zelo preprost, da smo le, da bo treba iti skozi vse različne argumente 690 00:57:21,630 --> 00:57:24,300 , ki so bili sprejeti v naš program, in gremo za tiskanje 691 00:57:24,300 --> 00:57:29,950 poudarja, da je njihova vsebina na zaslonu 1 naenkrat. 692 00:57:29,950 --> 00:57:35,670 Za tiskanje datotek ven na zaslonu, da bomo narediti nekaj zelo podobnega 693 00:57:35,670 --> 00:57:38,120 s tem, kar smo naredili na koncu kviza. 694 00:57:38,120 --> 00:57:45,350 Na koncu kviza, ki zaposlujejo programa, smo morali odpreti datoteko, 695 00:57:45,350 --> 00:57:48,490 in potem smo morali tiskati z njim. 696 00:57:48,490 --> 00:57:54,660 V tem primeru, bomo odprli datoteko, in gremo brati iz nje namesto tega. 697 00:57:54,660 --> 00:58:00,630 Potem bomo natisniti, namesto v datoteko, bomo za tiskanje na zaslonu. 698 00:58:00,630 --> 00:58:05,830 Torej, tiskanje na zaslonu, ki ste jih opravili vse prej z printf. 699 00:58:05,830 --> 00:58:08,290 Tako, da to ni preveč nor. 700 00:58:08,290 --> 00:58:12,190 Toda branje datoteke je čudno. 701 00:58:12,190 --> 00:58:17,300 Šli bomo skozi to malo naenkrat. 702 00:58:17,300 --> 00:58:20,560 Če greste nazaj na ta zadnji problem na kvizu, problemski 33, 703 00:58:20,560 --> 00:58:27,280 v prvi vrstici, da bomo na tem mestu, da odprete datoteko, je zelo podobno temu, kar smo tam. 704 00:58:27,280 --> 00:58:36,370 Torej, Stella, kaj to linijo izgledal, ko smo odprli datoteko? 705 00:58:36,370 --> 00:58:47,510 [Stella] Capital FILE * datoteka - >> redu. >> - Je enako fopen. >> Ja. 706 00:58:47,510 --> 00:58:55,980 Ki je v tem primeru? To je v komentarju. 707 00:58:55,980 --> 00:59:06,930 >> To je v komentarju? argv [i] in r? 708 00:59:06,930 --> 00:59:11,300 >> Točno tako. Tako. Torej, Stella je popolnoma v redu. 709 00:59:11,300 --> 00:59:13,720 To je tisto, kar je linija izgleda. 710 00:59:13,720 --> 00:59:19,670 Bomo dobili spremenljivko datoteko tok, ga shranite v datoteko *, tako da so vsi pokrovčki, 711 00:59:19,670 --> 00:59:25,720 Slika, *, in ime te spremenljivke bo datoteka. 712 00:59:25,720 --> 00:59:32,250 Lahko bi ga pokličete, kar smo želeli. Temu bi lahko rekli, da first_file ali file_i, kar bi radi. 713 00:59:32,250 --> 00:59:37,590 In potem je ime datoteke, sprejet v ukazni vrstici na ta program. 714 00:59:37,590 --> 00:59:44,450 Torej je shranjena v argv [i,] in potem bomo odprli to datoteko v načinu branja. 715 00:59:44,450 --> 00:59:48,100 Zdaj, ko smo odprli datoteko, v čem je stvar, ki jo moramo vedno pozabite narediti 716 00:59:48,100 --> 00:59:52,230 ko smo odprli datoteko? Zapri. 717 00:59:52,230 --> 00:59:57,220 Torej, Missy, kako bomo zaprli datoteko? 718 00:59:57,220 --> 01:00:01,020 [Missy] fclose (datoteka) >> fclose (datoteka). Točno tako. 719 01:00:01,020 --> 01:00:05,340 Čudovito. Ok. Če pogledamo to storiti komentar tukaj, 720 01:00:05,340 --> 01:00:11,940 pravi: "Odpri argv [i] in tiskanje vsebine na stdout." 721 01:00:11,940 --> 01:00:15,460 >> Standardna ven je čudno ime. Stdout je samo naš način rek 722 01:00:15,460 --> 01:00:22,880 želimo, da ga natisnete na terminalu, želimo, da ga natisnete na standardni izhodni tok. 723 01:00:22,880 --> 01:00:26,450 Mi lahko dejansko znebiti tega komentarja tukaj. 724 01:00:26,450 --> 01:00:36,480 Bom ga kopirajte in prilepite, ker to je tisto, kar smo storili. 725 01:00:36,480 --> 01:00:41,290 Na tej točki moramo zdaj, preberite datoteko korak za korakom. 726 01:00:41,290 --> 01:00:46,300 Smo razpravljali nekaj načinov za branje datotek. 727 01:00:46,300 --> 01:00:51,830 Katere so vaše priljubljene tako daleč? 728 01:00:51,830 --> 01:00:57,960 Kateri način ste videli, ali se spomnite, da se glasi datoteke? 729 01:00:57,960 --> 01:01:04,870 [Daniel] fread? >> Fread? Torej fread je ena. Jimmy, veš vse druge? 730 01:01:04,870 --> 01:01:12,150 [Jimmy] No >> redu. Ne. Charlotte? Alexander? Vsi ostali? Ok. 731 01:01:12,150 --> 01:01:20,740 Torej, ostale pa so fgetc, je tisti, ki bomo uporabili veliko. 732 01:01:20,740 --> 01:01:26,410 Tam je tudi fscanf, vi vidite vzorec tukaj? 733 01:01:26,410 --> 01:01:29,170 Vsi so začeli s f. Kaj storiti z datoteko. 734 01:01:29,170 --> 01:01:35,260 Tam je fread, fgetc, fscanf. To so vse funkcije branja. 735 01:01:35,260 --> 01:01:49,120 Za pisanje smo fwrite, imamo fputc namesto fgetc. 736 01:01:49,120 --> 01:01:58,250 Imamo tudi ovrednotenj, kot smo videli na kvizu. 737 01:01:58,250 --> 01:02:01,680 Ker je to težava, ki vključuje branje iz datoteke, 738 01:02:01,680 --> 01:02:04,940 bomo z enim od teh treh nalog. 739 01:02:04,940 --> 01:02:10,890 Ne bomo Te funkcije tukaj. 740 01:02:10,890 --> 01:02:14,880 Te funkcije so vsi na voljo v standardni knjižnici I / O. 741 01:02:14,880 --> 01:02:17,510 Torej, če pogledaš na vrhu tega programa, 742 01:02:17,510 --> 01:02:24,110 Kot lahko vidite, smo že vključeni v glavi datoteko za standardne knjižnice I / O. 743 01:02:24,110 --> 01:02:27,120 Če želimo ugotoviti, katero želimo uporabiti, 744 01:02:27,120 --> 01:02:29,690 vedno lahko odprli man strani. 745 01:02:29,690 --> 01:02:34,350 Tako smo lahko vnesete človek izravnalnik stdio 746 01:02:34,350 --> 01:02:43,180 in preberete vse o izravnalnik stdio vhodnih in izhodnih funkcij v C. 747 01:02:43,180 --> 01:02:49,870 In smo lahko že videli Oh, poglej. To je omeniti fgetc pa je omeniti fputc. 748 01:02:49,870 --> 01:02:57,220 Tako boste lahko v globino malo in poglej, recimo, fgetc 749 01:02:57,220 --> 01:03:00,060 in pogled na njegovo delovno strani. 750 01:03:00,060 --> 01:03:03,430 Vidite lahko, da gre skupaj z cel kup drugih funkcij: 751 01:03:03,430 --> 01:03:12,640 fgetc, fgets, getc, getchar, gets, ungetc in njegov vnos znakov in godala. 752 01:03:12,640 --> 01:03:19,180 Torej, to je, kako beremo v črkah in godala iz datotek iz standardnega vhoda, 753 01:03:19,180 --> 01:03:21,990 ki je v bistvu od uporabnika. 754 01:03:21,990 --> 01:03:24,780 In to je, kako to počnemo v dejanskem C. 755 01:03:24,780 --> 01:03:30,850 Torej, to se ne uporablja GetString in GetChar funkcije 756 01:03:30,850 --> 01:03:36,840 ki smo ga uporabili pri CS50 knjižnice. 757 01:03:36,840 --> 01:03:39,710 Mi smo naredili te težave v nekaj načinov 758 01:03:39,710 --> 01:03:43,430 tako da boste videli dva različna načine za njihovo početje. 759 01:03:43,430 --> 01:03:48,490 Tako fread funkcija, ki Daniel omenil in fgetc dobri poti, da to storite. 760 01:03:48,490 --> 01:03:53,790 Mislim, da fgetc je malo lažje, ker je le, kot vidite, 761 01:03:53,790 --> 01:03:59,660 en argument, FILE * da poskušamo prebrati znak iz, 762 01:03:59,660 --> 01:04:02,740 in njene vrnitve vrednost int. 763 01:04:02,740 --> 01:04:05,610 In to je malo zmedeno, kajne? 764 01:04:05,610 --> 01:04:11,450 >> Ker smo dobili znak, zakaj ne tak donos char? 765 01:04:11,450 --> 01:04:18,700 Vi imate ideje o tem, zakaj to ni mogoče vrniti char? 766 01:04:18,700 --> 01:04:25,510 [Missy odgovori, nerazumljiv] >> Ja. Torej, Missy je popolnoma v redu. 767 01:04:25,510 --> 01:04:31,570 Če je ASCII, potem bi to celo treba razporediti na dejansko char. 768 01:04:31,570 --> 01:04:33,520 Lahko bi bila ASCII, in to je prav. 769 01:04:33,520 --> 01:04:36,220 To je točno to, kar se dogaja. 770 01:04:36,220 --> 01:04:39,190 Mi smo z uporabo int preprosto zato, ker ima več bitov. 771 01:04:39,190 --> 01:04:44,750 To je večje kot znak, naš znak ima samo 8 bitov, da je 1 bajt na naše 32-bitne računalnike. 772 01:04:44,750 --> 01:04:48,520 In int je vredno vsega 4 bajti "prostora. 773 01:04:48,520 --> 01:04:50,940 In izkazalo se je, da je način fgetc dela, 774 01:04:50,940 --> 01:04:53,940 če se pomaknite navzdol na naši strnjen v tem človekom strani malo, 775 01:04:53,940 --> 01:05:05,000 pomaknite vso pot navzdol. Izkazalo se je, da jih uporabljajo te posebne vrednosti, imenovano EOF. 776 01:05:05,000 --> 01:05:09,640 To je posebna konstantne povratno vrednost fgetc funkcije 777 01:05:09,640 --> 01:05:14,570 ko ste zadeli konec datoteke, ali če se pojavi napaka. 778 01:05:14,570 --> 01:05:18,170 In izkazalo se je, da se teh primerjav z EOF pravilno, 779 01:05:18,170 --> 01:05:24,060 želite imeti, da ekstra količino informacij, ki jih imate v notr 780 01:05:24,060 --> 01:05:28,420 v nasprotju z uporabo char spremenljivko. 781 01:05:28,420 --> 01:05:32,130 Čeprav fgetc dejansko dobili znak iz datoteke, 782 01:05:32,130 --> 01:05:38,450 hočeš, da se spomnimo, da se vrača nekaj, kar je int tip za vas. 783 01:05:38,450 --> 01:05:41,360 To je dejal, da je dokaj enostaven za uporabo. 784 01:05:41,360 --> 01:05:44,960 To se dogaja, da nam značaj, tako da je vse, kar moramo storiti je, da asking datoteko 785 01:05:44,960 --> 01:05:48,440 "Daj mi naslednji znak, da mi naslednji znak, da mi naslednji znak" 786 01:05:48,440 --> 01:05:51,400 dokler ne pridemo do konca datoteke. 787 01:05:51,400 --> 01:05:54,730 In to bo potegnite v en znak naenkrat iz naše dokumentacije, 788 01:05:54,730 --> 01:05:56,250 in potem bomo lahko delali, kar smo želeli z njim. 789 01:05:56,250 --> 01:06:00,160 Lahko ga shranite, ga lahko dodate v nizu, lahko ga natisnete. 790 01:06:00,160 --> 01:06:04,630 Ali nič od tega. 791 01:06:04,630 --> 01:06:09,600 >> Povečevanje nazaj in šel nazaj na našo cat.c programa, 792 01:06:09,600 --> 01:06:16,170 če hočemo uporabljati fgetc, 793 01:06:16,170 --> 01:06:21,710 kako bi lahko začeli reševati ta naslednjo vrstico kode? 794 01:06:21,710 --> 01:06:26,020 Bomo za uporabo - fread bo naredil nekaj malo drugačnega. 795 01:06:26,020 --> 01:06:32,600 In tokrat smo le, da bo uporabila fgetc, da bi dobili en znak naenkrat. 796 01:06:32,600 --> 01:06:40,910 Za obdelavo celotno sliko, kaj bi mi morali narediti? 797 01:06:40,910 --> 01:06:44,030 Koliko znaki obstajajo v datoteki? 798 01:06:44,030 --> 01:06:47,390 Obstaja veliko. Torej, boste verjetno želeli, da bi dobili eno 799 01:06:47,390 --> 01:06:49,860 nato pa dobil drugo in dobil drugo in dobil drugo. 800 01:06:49,860 --> 01:06:53,330 Kakšen algoritem misliš, da bi moral tukaj uporabljati? 801 01:06:53,330 --> 01:06:55,470 Kakšne vrste -? [Aleksander] za zanko? >> Točno tako. 802 01:06:55,470 --> 01:06:57,500 Nekatere vrste zanke. 803 01:06:57,500 --> 01:07:03,380 Zanka se je pravzaprav velika, v tej zadevi. 804 01:07:03,380 --> 01:07:08,620 In kot si rekel, to zveni kot želite zanko čez celoten spis, 805 01:07:08,620 --> 01:07:11,820 dobili znak naenkrat. 806 01:07:11,820 --> 01:07:13,850 Vse predloge o tem, kaj bi lahko izgledal? 807 01:07:13,850 --> 01:07:22,090 [Alexander, nerazumljiv] 808 01:07:22,090 --> 01:07:30,050 >> Ok, povej mi v angleščini, kaj hočeš, da storim? [Alexander, nerazumljiv] 809 01:07:30,050 --> 01:07:36,270 Torej v tem primeru, to zveni, kot da smo samo poskušam zanko skozi celoten spis. 810 01:07:36,270 --> 01:07:45,330 [Aleksander] Torej i > Velikost -? 811 01:07:45,330 --> 01:07:49,290 Mislim, da je velikost datoteke, kajne? Velikost - Bomo samo napisati, da, kot je ta. 812 01:07:49,290 --> 01:07:57,470 Velikost datoteke zaenkrat, i + +. 813 01:07:57,470 --> 01:08:04,610 Tako se izkaže, da je način, kako to narediti z fgetc in je to novo, 814 01:08:04,610 --> 01:08:10,460 je, da ni enostaven način, da bi dobili samo velikost datoteke 815 01:08:10,460 --> 01:08:16,979 s tem "tipa", tip gradnje, ki ste jih videli. 816 01:08:16,979 --> 01:08:20,910 Ko bomo uporabili, da fgetc funkcijo, bomo uvedbo neke vrste 817 01:08:20,910 --> 01:08:29,069 Nova, funky sintakso za ta zanka, kjer namesto samo osnovno števec 818 01:08:29,069 --> 01:08:33,920 iti po znakih, bomo vleči en znak naenkrat, 819 01:08:33,920 --> 01:08:37,120 en znak naenkrat, in način, kako vemo, da smo na koncu 820 01:08:37,120 --> 01:08:41,290 ne, ko smo se šteje določeno število znakov, 821 01:08:41,290 --> 01:08:49,939 ko pa smo znak potegnite je, da se posebna konec značaja datoteke. 822 01:08:49,939 --> 01:08:58,689 Tako bomo lahko storite tako, da - Kličem te ch, in gremo za inicializacijo 823 01:08:58,689 --> 01:09:08,050 Naš prvi poziv, da bi dobili prvi znak iz datoteke. 824 01:09:08,050 --> 01:09:14,979 Torej, ta del prav tukaj, to se dogaja, da bi dobili znak iz datoteke 825 01:09:14,979 --> 01:09:20,840 in ga shranite v spremenljivko ch. 826 01:09:20,840 --> 01:09:25,420 Bomo vztrajati početje to, dokler ne pridemo do konca datoteke, 827 01:09:25,420 --> 01:09:41,170 ki mi jih testiranje za lik ni bila enaka tisti posebni znak EOF. 828 01:09:41,170 --> 01:09:48,750 In potem namesto da delaš ch + +, ki bi samo prirastek vrednosti, 829 01:09:48,750 --> 01:09:52,710 tako da, če bomo prebrali A financiran iz spisa, kapital, recimo, 830 01:09:52,710 --> 01:09:56,810 ch + + bi nam b, nato pa sva se C in nato d. 831 01:09:56,810 --> 01:09:59,310 To seveda ni tisto, kar si želimo. Kaj hočemo tukaj 832 01:09:59,310 --> 01:10:05,830 v tem zadnjem bit želimo, da bi dobili naslednji znak iz datoteke. 833 01:10:05,830 --> 01:10:09,500 >> Torej, kako bi lahko dobili naslednji znak iz datoteke? 834 01:10:09,500 --> 01:10:13,470 Kako bomo prišli prvi znak iz datoteke? 835 01:10:13,470 --> 01:10:17,200 [Študent] fgetfile? >> Fgetc, ali je žal, da si popolnoma prav. 836 01:10:17,200 --> 01:10:20,470 Sem jo napačno črkovana tam. Torej, ja. 837 01:10:20,470 --> 01:10:26,240 Tu namesto opravljanja ch + +, 838 01:10:26,240 --> 01:10:29,560 smo le, da bo poklical fgetc (datoteka) znova 839 01:10:29,560 --> 01:10:39,180 in shrani rezultat v našem iste spremenljivke pogl. 840 01:10:39,180 --> 01:10:43,730 [Student vprašanje, nerazumljiv] 841 01:10:43,730 --> 01:10:52,390 >> To je, če ti fantje * FILE nekaj posebnega. 842 01:10:52,390 --> 01:10:59,070 Tako se dela, da je - ko ste prvič odprli - ko prvič daste to fopen klic, 843 01:10:59,070 --> 01:11:04,260 FILE * dejansko služi kot kazalec na začetek datoteke. 844 01:11:04,260 --> 01:11:12,830 In potem vsakič, ko pokličeš fgetc, premakne za en znak z datoteke. 845 01:11:12,830 --> 01:11:23,280 Torej, ko praviš temu, da ste povečevanje datoteke kazalec za en znak. 846 01:11:23,280 --> 01:11:26,210 In ko si enkrat fgetc, ste se gibljejo ga drug znak 847 01:11:26,210 --> 01:11:28,910 in še en znak in še en znak in znak. 848 01:11:28,910 --> 01:11:32,030 [Student vprašanje, nerazumljiv] >> In that - ja. 849 01:11:32,030 --> 01:11:34,810 To je nekako te čarovnije pod pokrovom. 850 01:11:34,810 --> 01:11:37,930 Vi se samo delajte povečevanje skozi. 851 01:11:37,930 --> 01:11:46,510 Na tej točki, ste lahko dejansko delajo z naravo. 852 01:11:46,510 --> 01:11:52,150 Torej, kako bi lahko natisnete ven na zaslonu, ki je zdaj? 853 01:11:52,150 --> 01:11:58,340 Mi lahko uporabite isti printf stvar, ki smo uporabljali. 854 01:11:58,340 --> 01:12:00,330 To smo se z vsemi semester. 855 01:12:00,330 --> 01:12:05,450 Lahko pokličete printf, 856 01:12:05,450 --> 01:12:21,300 in se peljemo v naravi kar tako. 857 01:12:21,300 --> 01:12:27,430 Drug način za to je, namesto z uporabo printf in da bi morali to storiti oblikovnega niza, 858 01:12:27,430 --> 01:12:29,490 lahko uporabite tudi eno od drugih funkcij. 859 01:12:29,490 --> 01:12:40,090 Mi lahko uporabite fputc, ki natisne znak na zaslonu, 860 01:12:40,090 --> 01:12:52,580 razen če se ozremo na fputc - Naj pomanjšanje malo. 861 01:12:52,580 --> 01:12:56,430 Bomo videli, kaj je lepo, je potrebno v naravi, ki jih je prebral z fgetc, 862 01:12:56,430 --> 01:13:05,100 ampak potem moramo dati tok, da tiskati. 863 01:13:05,100 --> 01:13:11,850 Lahko uporabite tudi putchar funkcijo, ki bodo neposredno postavi na izhod standardne. 864 01:13:11,850 --> 01:13:16,070 Torej, obstaja cel kup različnih možnosti, ki jih lahko uporabimo za tiskanje. 865 01:13:16,070 --> 01:13:19,580 Vsi so v standardni knjižnici I / O. 866 01:13:19,580 --> 01:13:25,150 Kadar želite natisniti - tako printf, ki ga privzeto, bo tiskanje na posebnem standardu od potoka, 867 01:13:25,150 --> 01:13:27,910 to je, da stdout. 868 01:13:27,910 --> 01:13:41,300 Tako smo lahko samo sklicujejo nanj kot na nekakšno te čarobne vrednosti, stdout tukaj. 869 01:13:41,300 --> 01:13:48,410 Ups. Daj podpičje zunaj. 870 01:13:48,410 --> 01:13:52,790 >> To je veliko novega, funky informacij tukaj. 871 01:13:52,790 --> 01:13:58,600 Veliko tega je zelo idiomatičen, v smislu, da je to koda 872 01:13:58,600 --> 01:14:05,700 , ki je napisana na ta način samo zato, ker je čista, da se glasi, enostaven za branje. 873 01:14:05,700 --> 01:14:11,520 Obstaja veliko različnih načinov, da to storite, več različnih funkcij, ki jih lahko uporabite, 874 01:14:11,520 --> 01:14:14,680 ampak smo nagnjeni k sledite tem iste vzorce znova in znova. 875 01:14:14,680 --> 01:14:20,180 Zato ne bodite presenečeni, če boste videli kodo, kot je ta prihajajo znova in znova. 876 01:14:20,180 --> 01:14:25,690 V redu. Na tej točki moramo prekiniti za ta dan. 877 01:14:25,690 --> 01:14:31,300 Hvala za obisk. Hvala za ogled, če ste v spletu. In se vidimo prihodnji teden. 878 01:14:31,300 --> 01:14:33,890 [CS50.TV]