1 00:00:00,000 --> 00:00:02,730 [Powered by Google Translate] [ODDIEL 5: menej komfortné] 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 Tak vitaj späť, chlapci. 5 00:00:11,690 --> 00:00:16,320 Vitajte v sekcii 5. 6 00:00:16,320 --> 00:00:20,220 V tomto bode, mať dokončil kvíz 0 a keď bola svedkom, ako si urobil, 7 00:00:20,220 --> 00:00:25,770 dúfajme, že budete cítiť naozaj dobre, pretože som bol veľmi zaujatý skóre v tejto sekcii. 8 00:00:25,770 --> 00:00:28,050 Pre naše on-line divákov, mali sme pár otázok 9 00:00:28,050 --> 00:00:33,680 o posledných dvoch problémov na problém súboru - alebo na teste, ale. 10 00:00:33,680 --> 00:00:39,690 Takže sme ísť cez tie naozaj rýchlo, takže každý vidí, čo sa stalo 11 00:00:39,690 --> 00:00:45,060 a ako prejsť skutočné riešenie, skôr než len prezeranie riešenie sám. 12 00:00:45,060 --> 00:00:50,330 Budeme ísť za posledných pár problémov naozaj rýchlo, 32 a 33. 13 00:00:50,330 --> 00:00:53,240 Len, znova, aby bolo možné v elektronickej diváci vidieť. 14 00:00:53,240 --> 00:00:59,080 >> Ak sa obrátite na vášho problému 32, ktorý je na strane 13, 15 00:00:59,080 --> 00:01:02,730 13 z 16, problém 32 je o swapov. 16 00:01:02,730 --> 00:01:05,010 Bolo to všetko o výmene dve celé čísla. 17 00:01:05,010 --> 00:01:08,740 Je to problém, ktorý sme si už za pár časov v prednáške. 18 00:01:08,740 --> 00:01:13,590 A tu, čo sme sa pýtali vás urobiť, je rýchlo pamäťová stopa. 19 00:01:13,590 --> 00:01:17,000 Ak chcete vyplniť v hodnotách premenných tak, ako sú vo fronte 20 00:01:17,000 --> 00:01:20,250 ako kód prechádza týmto odkladacie funkciu. 21 00:01:20,250 --> 00:01:24,500 Najmä, čo sa pozeráme na - Idem dať túto iPad dole - 22 00:01:24,500 --> 00:01:29,650 najmä, čo sa pozeráme na to je rada číslované 6 práve tu. 23 00:01:29,650 --> 00:01:36,740 A to očíslované 6 len za kontinuitu s predchádzajúcim problémom. 24 00:01:36,740 --> 00:01:41,720 To, čo chceme urobiť, je zobraziť alebo označiť stav pamäte 25 00:01:41,720 --> 00:01:46,090 ako je to v čase, keď sa vykonanie tohto riadku číslo 6, 26 00:01:46,090 --> 00:01:52,540 ktorý je účinne návrate z našej odkladacie funkciu tu. 27 00:01:52,540 --> 00:01:59,450 Ak by sme posunúť dole tu, sme videli, že adresy všetko v pamäti bola poskytnutá pre nás. 28 00:01:59,450 --> 00:02:02,540 To je veľmi kľúčový, budeme sa k nej vráti za chvíľu. 29 00:02:02,540 --> 00:02:09,240 A potom tu dole na dne, sme mali trochu pamäti diagram, ktorý budeme odkazovať. 30 00:02:09,240 --> 00:02:12,490 Som vlastne urobil sa na mojej Prípade. 31 00:02:12,490 --> 00:02:20,720 Takže budem striedať tam a späť medzi iPad a tento kód len pre referenciu. 32 00:02:20,720 --> 00:02:26,540 >> Poďme začať. Po prvé, poďme zamerať na prvých pár riadkov hlavného tady. 33 00:02:26,540 --> 00:02:30,220 Ak chcete začať, budeme inicializovať x na 1 a Y 2. 34 00:02:30,220 --> 00:02:33,040 Takže máme dve celočíselné premenné, oni obaja bude umiestnený na zásobníku. 35 00:02:33,040 --> 00:02:36,050 Budeme dať 1 a 2 v nich. 36 00:02:36,050 --> 00:02:43,150 Takže keď som otočiť k môjmu iPad, dúfajme, uvidíme - 37 00:02:43,150 --> 00:02:48,660 Apple TV zrkadlenie, a tam ideme. Dobre. 38 00:02:48,660 --> 00:02:51,670 Takže keď som otočiť k môjmu iPad, 39 00:02:51,670 --> 00:02:56,220 Chcem inicializovať x na 1 a Y 2. 40 00:02:56,220 --> 00:03:00,580 Robíme to jednoducho tým, že píše 1 do poľa označeného x 41 00:03:00,580 --> 00:03:07,730 a 2 v poli označené y. Pomerne jednoduché. 42 00:03:07,730 --> 00:03:11,620 Takže teraz sa vráťme k notebooku, uvidíme, čo sa bude diať ďalej. 43 00:03:11,620 --> 00:03:15,810 Takže to ďalší riadok je miesto, kde sa veci zložitejšie. 44 00:03:15,810 --> 00:03:28,110 Míňame adresu X a adresu y ako parametre a a b na odkladaciu funkciu. 45 00:03:28,110 --> 00:03:32,380 Sídlo x a adresou y sú veci, ktoré nemôžeme vypočítať 46 00:03:32,380 --> 00:03:36,360 bez odkázal na tieto bodoch tu dole. 47 00:03:36,360 --> 00:03:39,750 A našťastie, prvé dve zarážky nám presne to, čo sú odpovede. 48 00:03:39,750 --> 00:03:44,740 Sídlo x v pamäti je 10, a adresa y v pamäti je 14. 49 00:03:44,740 --> 00:03:51,870 Takže to sú hodnoty, ktoré sa dostanú odovzdaná ako a, b až hore v našej virtuálnej funkcie. 50 00:03:51,870 --> 00:04:00,760 Takže znova, prepnutie späť do nášho schémy, môžem napísať 10 v 51 00:04:00,760 --> 00:04:07,400 a 14 v b. 52 00:04:07,400 --> 00:04:11,610 Teraz, tento bod je miesto, kde budeme pokračovať s swapu. 53 00:04:11,610 --> 00:04:14,520 Tak obracející späť k prenosnému počítaču znova, 54 00:04:14,520 --> 00:04:21,079 vidíme, že spôsob, akým swap funguje, je som sa prvýkrát dereferencia a obchod výsledok v tmp. 55 00:04:21,079 --> 00:04:27,650 Takže dereferencia operátor hovorí, "Hey. Doprajte obsah premenné ako adresa. 56 00:04:27,650 --> 00:04:33,830 Prejsť na všetko, čo je uložené na tejto adrese, a tak ho nahrá. " 57 00:04:33,830 --> 00:04:41,720 Čo načítať z premennej sa bude uložený do nášho tmp premennej. 58 00:04:41,720 --> 00:04:45,150 Prehodiť späť na iPad. 59 00:04:45,150 --> 00:04:51,690 Ak pôjdeme k riešeniu 10, vieme, že adresa 10 je premenná x 60 00:04:51,690 --> 00:04:55,480 pretože nám bolo povedané, náš zarážky, že adresa x v pamäti je 10. 61 00:04:55,480 --> 00:05:00,180 Takže môžeme ísť tam, získať hodnotu toho, ktorý je 1, ako ich vidíme na našej iPad, 62 00:05:00,180 --> 00:05:06,300 a nahrať to do tmp. 63 00:05:06,300 --> 00:05:08,250 Opäť, toto nie je konečné obsah. 64 00:05:08,250 --> 00:05:14,350 Budeme prechádzať a my Vás budeme do nášho konečného stavu programu na konci. 65 00:05:14,350 --> 00:05:17,210 Ale teraz, máme hodnotu 1 uložené v tmp. 66 00:05:17,210 --> 00:05:19,210 >> A je tu rýchly dotaz tu. 67 00:05:19,210 --> 00:05:23,980 [Alexander] Je dereferencia prevádzkovateľ - to je len hviezda priamo pred premenné? 68 00:05:23,980 --> 00:05:27,600 Áno >>. Takže dereferencia prevádzkovateľ, ako sme otočiť späť do nášho notebooku znovu, 69 00:05:27,600 --> 00:05:33,780 Je to hviezda priamo pred hotelom. 70 00:05:33,780 --> 00:05:37,460 V tomto zmysle, to je - kontrastovať s operátorom násobenie 71 00:05:37,460 --> 00:05:42,400 ktoré si vyžaduje dve veci, dereferencia operátor je unární operátor. 72 00:05:42,400 --> 00:05:46,130 Len aplikovaný na jednej hodnoty na rozdiel od binárneho operátora, 73 00:05:46,130 --> 00:05:48,810 kde sa vzťahujú na dvoch rôznych hodnôt. 74 00:05:48,810 --> 00:05:52,080 Takže to je to, čo sa deje v tomto riadku. 75 00:05:52,080 --> 00:05:58,390 Naložili sme hodnotu 1 a uložené do našej dočasnej celočíselné premenné. 76 00:05:58,390 --> 00:06:05,800 Na ďalší riadok, uložíme obsah B do - 77 00:06:05,800 --> 00:06:12,630 alebo skôr, uložíme obsah, ktorý b ukazuje na do miesta, kde sa ukazuje. 78 00:06:12,630 --> 00:06:17,690 Analyzujeme Ak tento sprava doľava, budeme dereferencia b, 79 00:06:17,690 --> 00:06:23,580 budeme riešiť 14, budeme chytiť celé číslo, ktoré je tam, 80 00:06:23,580 --> 00:06:26,900 a potom sme sa ísť na adresu 10, 81 00:06:26,900 --> 00:06:34,240 a budeme hádzať výsledok našej dereferencia z B do tohto priestoru. 82 00:06:34,240 --> 00:06:40,080 Prehodiť späť k nášmu iPad, kde môžeme urobiť to trochu konkrétnejšie, 83 00:06:40,080 --> 00:06:44,070 to by mohlo pomôcť, keď napíšem čísla na všetky adresy tu. 84 00:06:44,070 --> 00:06:53,820 Takže vieme, že v y, sme na adrese 14, x je na adrese 10. 85 00:06:53,820 --> 00:07:00,180 Keď začneme u b, sme dereferencia b, budeme chytiť hodnotu 2. 86 00:07:00,180 --> 00:07:08,320 Budeme sa chytiť túto hodnotu, pretože to je hodnota, ktorá žije na adrese 14. 87 00:07:08,320 --> 00:07:15,700 A budeme dávať to do premennej, ktorá žije na adrese 10, 88 00:07:15,700 --> 00:07:19,160 ktorý je tu, zodpovedajúce našim premennej x. 89 00:07:19,160 --> 00:07:21,810 Takže môžeme urobiť trochu prepísanie tu 90 00:07:21,810 --> 00:07:35,380 kde sme sa zbaviť nášho 1 a namiesto toho sme napísať 2. 91 00:07:35,380 --> 00:07:39,560 Takže všetko je v poriadku a dobre na svete, aj keď máme prepisované X teraz. 92 00:07:39,560 --> 00:07:44,890 Máme uložené x starú hodnotu v našom tmp premennej. 93 00:07:44,890 --> 00:07:50,210 Takže môžeme dokončiť swapu s ďalším riadkom. 94 00:07:50,210 --> 00:07:53,030 Prehodiť späť k nášmu notebooku. 95 00:07:53,030 --> 00:07:58,150 Teraz všetko, čo zostáva, je, aby sa obsah z nášho dočasného celočíselné premenné 96 00:07:58,150 --> 00:08:05,630 a uložiť ich do premennej, ktorá žije na adresu, ktorá b drží. 97 00:08:05,630 --> 00:08:10,230 Takže budeme účinne dereferencia b získať prístup k premennej 98 00:08:10,230 --> 00:08:14,340 , Ktorý je na adrese, b drží v ňom, 99 00:08:14,340 --> 00:08:19,190 a budeme napchať hodnotu, ktorá tmp drží do neho. 100 00:08:19,190 --> 00:08:23,280 Prehodiť späť na iPad ešte raz. 101 00:08:23,280 --> 00:08:31,290 Môžem vymazať túto hodnotu tu, 2, 102 00:08:31,290 --> 00:08:41,010 a namiesto toho budeme kopírovať 1 právo do neho. 103 00:08:41,010 --> 00:08:43,059 Potom ďalší riadok, ktorý vykonáva, samozrejme - 104 00:08:43,059 --> 00:08:47,150 ak by sme otočiť späť do notebooku - je to bod 6, 105 00:08:47,150 --> 00:08:52,500 čo je bod, v ktorom sme chceli, aby naša schéma úplne vyplnené. 106 00:08:52,500 --> 00:08:58,940 Tak mizerný späť na iPad ešte raz, len tak môžete vidieť dokončenú diagram, 107 00:08:58,940 --> 00:09:06,610 môžete vidieť, že máme 10 v, 14 v B, 1 vo tmp, 2 v X, a 1 v y. 108 00:09:06,610 --> 00:09:11,000 Sú nejaké otázky ohľadom tohto? 109 00:09:11,000 --> 00:09:14,640 Dáva to väčší zmysel, keď išiel cez neho? 110 00:09:14,640 --> 00:09:24,850 Urobte menší zmysel? Dúfajme, že nie. Dobre. 111 00:09:24,850 --> 00:09:28,230 >> Ukazovatele sú veľmi zradné tému. 112 00:09:28,230 --> 00:09:33,420 Jeden z chalanov, s ktorými spolupracujeme má veľmi časté príslovie: 113 00:09:33,420 --> 00:09:36,590 "Aby sme pochopili ukazovatele, musíte najprv pochopiť ukazovatele." 114 00:09:36,590 --> 00:09:40,530 Čo myslím, že je to pravda. To robí to chvíľu trvať zvyknúť si na to. 115 00:09:40,530 --> 00:09:45,360 Kreslenie veľa obrázkov, losovanie pamäťových diagramov, ako je tento sú veľmi užitočné, 116 00:09:45,360 --> 00:09:49,480 a potom, čo prejdete napríklad po napríklad po príklade, 117 00:09:49,480 --> 00:09:54,450 to začnem robiť niečo väčší zmysel a trochu viac rozum a trochu väčší zmysel. 118 00:09:54,450 --> 00:10:01,560 A konečne, jeden deň, budete mať všetko úplne zvládol. 119 00:10:01,560 --> 00:10:13,800 Akékoľvek otázky skôr než prejdeme k ďalšiemu problému? Dobrá. 120 00:10:13,800 --> 00:10:18,840 Takže otočiť späť do notebooku. 121 00:10:18,840 --> 00:10:23,300 Ďalší problém, ktorý máme, je problém číslo 33 na súbor I / O. 122 00:10:23,300 --> 00:10:26,350 Zväčšenie na tomto trochu. 123 00:10:26,350 --> 00:10:28,710 Problém 33 - Áno? 124 00:10:28,710 --> 00:10:32,110 >> [Daniel] som mal rýchlu otázku. Táto hviezda, alebo hviezdička, 125 00:10:32,110 --> 00:10:35,590 je to tzv dereferencing pri použití hviezdičku pred. 126 00:10:35,590 --> 00:10:38,820 Ako sa to volá, keď použijete ampersand predtým? 127 00:10:38,820 --> 00:10:43,140 >> Znak ampersand skôr, než je adresa-prevádzkovateľa. 128 00:10:43,140 --> 00:10:45,880 Takže poďme sa posunúť späť. 129 00:10:45,880 --> 00:10:49,310 Chybička sa vlúdila. Som v režime zoom, takže nemôžem naozaj scroll. 130 00:10:49,310 --> 00:10:52,780 Ak sa pozrieme na tento kód naozaj rýchlo priamo tu, 131 00:10:52,780 --> 00:10:54,980 znovu, to isté sa deje. 132 00:10:54,980 --> 00:10:59,180 Ak sa pozrieme na tento kód priamo tu, na tomto riadku, kde robíme volanie vymeniť, 133 00:10:59,180 --> 00:11:10,460 ampersand len hovorí "dostať adresu, na ktorej premennej x životy." 134 00:11:10,460 --> 00:11:14,460 Keď váš kompilátor kompiluje kód, 135 00:11:14,460 --> 00:11:20,590 má skutočne fyzicky vytýčiť miesto v pamäti pre všetky vaše premenných žijú. 136 00:11:20,590 --> 00:11:24,910 A tak to, čo kompilátor potom môže robiť, keď je to všetko zostavený, 137 00:11:24,910 --> 00:11:31,110 to vie, "Oh, som dal x na adrese 10. som dal Y na adrese 14." 138 00:11:31,110 --> 00:11:34,640 To potom môže vyplniť tieto hodnoty pre vás. 139 00:11:34,640 --> 00:11:44,740 Takže si potom môžete - to potom odovzdať to v priechode a & y v i 140 00:11:44,740 --> 00:11:50,730 Títo chalani si adresu, ale tiež, keď je odovzdávať do odkladacej funkcie, 141 00:11:50,730 --> 00:11:55,690 tento typ informácií, to int * tu, hovorí kompilátora, 142 00:11:55,690 --> 00:12:01,350 "Dobre, budeme sa výkladu túto adresu ako adresu celočíselné premenné." 143 00:12:01,350 --> 00:12:05,900 Ako adresu int, ktorá je odlišná od adresy premennej znak 144 00:12:05,900 --> 00:12:09,930 pretože int zaberá, na 32-bit stroje, zaberá 4 bajty priestoru, 145 00:12:09,930 --> 00:12:13,310 vzhľadom k tomu, postava iba preberá 1 bajt priestoru. 146 00:12:13,310 --> 00:12:17,310 Takže je to dôležité vedieť aj to, čo je - to, čo žije, aký typ hodnoty 147 00:12:17,310 --> 00:12:20,340 žije na adresu, ktorú dostal prešla dovnútra 148 00:12:20,340 --> 00:12:22,020 Alebo adresu, ktorú čo do činenia. 149 00:12:22,020 --> 00:12:29,020 Tak, viete, koľko bytov informácií skutočne načítať z pamäte RAM. 150 00:12:29,020 --> 00:12:31,780 A potom, áno, to dereferencia operátor, ako vy ste sa pýtal, 151 00:12:31,780 --> 00:12:37,200 ide a pristupuje k informáciám na konkrétnu adresu. 152 00:12:37,200 --> 00:12:42,820 Tak to hovorí, s týmto premennou tu, liečiť obsah ako adresa, 153 00:12:42,820 --> 00:12:47,880 prejsť na túto adresu, a vytiahnuť, vložte do procesora, zaťaženie do registra 154 00:12:47,880 --> 00:12:56,340 skutočné hodnoty alebo obsah, ktoré žijú na tejto adrese. 155 00:12:56,340 --> 00:12:59,620 Nejaké ďalšie otázky? To sú dobré otázky. 156 00:12:59,620 --> 00:13:01,650 Je to veľa novej terminológie príliš. 157 00:13:01,650 --> 00:13:09,800 Je to tiež trochu funky, vidieť a a * na rôznych miestach. 158 00:13:09,800 --> 00:13:13,180 >> Dobrá. 159 00:13:13,180 --> 00:13:18,530 Takže späť k problému 33, súbor I / O. 160 00:13:18,530 --> 00:13:22,540 To bol jeden z tých problémov, ktoré si myslím, že pár vecí sa stalo. 161 00:13:22,540 --> 00:13:25,400 Jeden, že je to celkom novú tému. 162 00:13:25,400 --> 00:13:30,590 To bol predložený čoskoro pred kvízu, 163 00:13:30,590 --> 00:13:33,400 a potom som, že to bolo niečo ako jeden z tých slovných úloh v matematike 164 00:13:33,400 --> 00:13:39,720 kde vám veľa informácií, ale v skutočnosti nechcete skončiť museli použiť veľa nej. 165 00:13:39,720 --> 00:13:44,060 Prvá časť tohto problému popisuje, čo súbor CSV je. 166 00:13:44,060 --> 00:13:50,620 Teraz, súbor CSV, podľa popisu, je oddelený čiarkami hodnoty súboru. 167 00:13:50,620 --> 00:13:55,300 Dôvodom sú vôbec zaujímavé, a dôvod, prečo ste niekedy použiť, 168 00:13:55,300 --> 00:14:00,800 je, pretože, ako mnohí z vás niekedy používajú veci, ako je Excel? 169 00:14:00,800 --> 00:14:03,240 Obrázok väčšina z vás, pravdepodobne bude alebo použitie pri určitom okamihu svojho života. 170 00:14:03,240 --> 00:14:06,430 Budete používať niečo ako Excel. 171 00:14:06,430 --> 00:14:10,940 S cieľom získať dáta z tabuľky programu Excel alebo robiť nejaký druh spracovania s ním, 172 00:14:10,940 --> 00:14:17,240 ak by ste chceli napísať program v jazyku C alebo Python program, Java programu, 173 00:14:17,240 --> 00:14:20,070 vysporiadať sa s dátami ste uložili tam, 174 00:14:20,070 --> 00:14:23,170 jedným z najčastejších spôsobov, ako dostať to je v súbore CSV. 175 00:14:23,170 --> 00:14:26,850 A môžete otvoriť Excel a keď idete na "Uložiť ako" dialóg, 176 00:14:26,850 --> 00:14:32,840 sa môžete dostať von skutočný súbor CSV. 177 00:14:32,840 --> 00:14:35,890 >> Handy vedieť, ako sa vysporiadať s týmito vecami. 178 00:14:35,890 --> 00:14:42,010 Spôsob, akým to funguje tak, že je to podobné - myslím, že to v podstate napodobňovanie tabuľky, 179 00:14:42,010 --> 00:14:47,590 kde, ako vidíme tu, vo veľmi najviac naľavo kus, 180 00:14:47,590 --> 00:14:49,910 máme všetky posledné názvy. 181 00:14:49,910 --> 00:14:54,670 Takže máme Malan, potom Hardison, a potom Bowden, MacWilliam, a potom Chan. 182 00:14:54,670 --> 00:14:59,470 Všetky posledné mená. A potom čiarka oddeľuje priezvisko z krstných mien. 183 00:14:59,470 --> 00:15:02,970 David, Nate, Rob, Tommy, a Zamyla. 184 00:15:02,970 --> 00:15:06,850 Vždy som zmiešať Robby a Toma. 185 00:15:06,850 --> 00:15:10,940 A potom, konečne, tretí stĺpec e-mailovej adresy. 186 00:15:10,940 --> 00:15:18,500 Akonáhle pochopíte, že zvyšok programu je pomerne jednoduché implementovať. 187 00:15:18,500 --> 00:15:23,850 Čo sme urobili, aby sa napodobniť rovnaký štruktúru v našom programe C 188 00:15:23,850 --> 00:15:27,510 je, že sme použili štruktúru. 189 00:15:27,510 --> 00:15:30,520 Začneme hrať s nimi trochu viac rovnako. 190 00:15:30,520 --> 00:15:35,790 Videli sme ich na prvý trochu v problému sade 3, keď sme boli zaoberajúca sa slovníky. 191 00:15:35,790 --> 00:15:40,290 Ale tento personál struct ukladá priezvisko, krstné meno, a e-mail. 192 00:15:40,290 --> 00:15:44,500 Rovnako ako náš súbor CSV bol skladovanie. 193 00:15:44,500 --> 00:15:47,950 Takže je to len konverzia z jedného formátu do druhého. 194 00:15:47,950 --> 00:15:54,630 Máme previesť, v tomto prípade, je personál struct do linky, 195 00:15:54,630 --> 00:15:59,060 oddelený čiarkami line, rovnako ako to. 196 00:15:59,060 --> 00:16:01,500 Dáva to zmysel? Vy všetci vziať kvíz, 197 00:16:01,500 --> 00:16:07,680 tak som si predstaviť, že máte aspoň nejaký čas na premýšľanie o tom. 198 00:16:07,680 --> 00:16:16,410 >> V prenájmu funkciu, problém nás žiada, aby sme sa v - Dáme snímke v tomto trochu - 199 00:16:16,410 --> 00:16:22,480 sa v personálu štruktúry, personálu struct, s meno s, 200 00:16:22,480 --> 00:16:30,900 a pripojiť jeho obsah do nášho súboru staff.csv. 201 00:16:30,900 --> 00:16:34,230 Ukazuje sa, že toto je pomerne jednoduchá na použitie. 202 00:16:34,230 --> 00:16:37,430 Budeme trochu pohrať s týmito funkciami trochu viac dnes. 203 00:16:37,430 --> 00:16:44,510 Avšak v tomto prípade, je fprintf funkcia je skutočne kľúčom. 204 00:16:44,510 --> 00:16:51,960 Takže s fprintf, môžeme tlačiť, rovnako ako vy boli pomocou printf celý tento termín. 205 00:16:51,960 --> 00:16:55,050 Môžete printf riadok do súboru. 206 00:16:55,050 --> 00:16:59,030 Takže namiesto toho, aby jednoducho robiť obvyklé printf hovor, kde si dať formátovací reťazec 207 00:16:59,030 --> 00:17:05,380 a potom nahradiť všetky premenné s nasledujúcimi tvrdeniami, 208 00:17:05,380 --> 00:17:11,290 s fprintf, vaše prvé tvrdenie je miesto toho súbor, ktorý chcete napísať. 209 00:17:11,290 --> 00:17:21,170 Ak by sme sa pozreli na to v zariadení, napríklad, človek fprintf, 210 00:17:21,170 --> 00:17:25,980 môžeme vidieť rozdiel medzi printf a fprintf. 211 00:17:25,980 --> 00:17:28,960 Budem priblížiť tu trochu. 212 00:17:28,960 --> 00:17:33,140 Takže s printf, dáme formátovací reťazec, a potom nasledujúce argumenty 213 00:17:33,140 --> 00:17:37,580 sú všetky premenné pre výmenu alebo nahradenie do nášho formátu reťazca. 214 00:17:37,580 --> 00:17:47,310 Vzhľadom k tomu, s fprintf, prvý argument je skutočne tento súbor * nazýva potok. 215 00:17:47,310 --> 00:17:51,800 >> Presun späť sem do nášho prenájmu, 216 00:17:51,800 --> 00:17:54,550 sme už dostali náš súbor * otvorený stream pre nás. 217 00:17:54,550 --> 00:17:57,810 To je to, čo tento prvý linka robí, že otvorí súbor staff.csv, 218 00:17:57,810 --> 00:18:01,690 sa otvorí v režime append, a všetko, čo zostalo pre nás urobiť, je 219 00:18:01,690 --> 00:18:08,640 napísať zamestnancov štruktúru do súboru. 220 00:18:08,640 --> 00:18:10,870 A uvidíme, nechcem používať iPad? 221 00:18:10,870 --> 00:18:17,900 Budem používať iPad. Máme za neplatné - poďme dať to na stôl, takže môžem napísať trochu lepšie - 222 00:18:17,900 --> 00:18:33,680 neplatnosť kolies a trvá do jedného argumentu, má personál štruktúru nazvanú s 223 00:18:33,680 --> 00:18:44,120 Mám naše rovnátka, máme náš súbor * s názvom súboru, 224 00:18:44,120 --> 00:18:48,380 máme fopen linku ktoré ste nám poskytli, 225 00:18:48,380 --> 00:18:51,890 a ja budem len písať ako bodky, pretože je už v pedia. 226 00:18:51,890 --> 00:19:00,530 A potom na naše ďalšie riadok, ak budeme volať do fprintf 227 00:19:00,530 --> 00:19:03,700 a budeme prechádzať v súbore, ktorý chceme tlačiť, 228 00:19:03,700 --> 00:19:10,290 a potom sa naše formátovací reťazec, ktorý - 229 00:19:10,290 --> 00:19:14,300 Nechám ste mi povedať, ako to vyzerá. 230 00:19:14,300 --> 00:19:20,500 Ako o vás, Stella? Viete, čo je prvá časť formátovacieho reťazca vyzerá? 231 00:19:20,500 --> 00:19:24,270 [Stella] Nie som si istý. >> Nebojte sa opýtať na Jimmyho. 232 00:19:24,270 --> 00:19:27,690 Viete, Jimmy? 233 00:19:27,690 --> 00:19:31,000 [Jimmy] Bolo by to jednoducho byť posledný? Neviem. Nie som si úplne istý. 234 00:19:31,000 --> 00:19:39,020 Dobre >>. Ako o tom, to niekto si to správne na skúšku? 235 00:19:39,020 --> 00:19:41,770 Nie poriadku. 236 00:19:41,770 --> 00:19:47,920 Ukazuje sa, že tu všetko, čo musíme urobiť, je chceme každú časť nášho personálu štruktúry 237 00:19:47,920 --> 00:19:53,290 ktoré majú byť vytlačené ako reťazec do nášho súboru. 238 00:19:53,290 --> 00:19:59,900 Práve sme použiť reťazec substitučná znaku tri rôzne časy, pretože máme priezvisko 239 00:19:59,900 --> 00:20:07,160 nasleduje čiarka, potom meno nasledovaný čiarkou, 240 00:20:07,160 --> 00:20:12,430 a potom konečne adresa, ktorá nasleduje - čo nie je 241 00:20:12,430 --> 00:20:15,140 montáž na mojej obrazovke - ale je to nasleduje znakom nového riadku. 242 00:20:15,140 --> 00:20:20,060 Takže budem písať to len tam. 243 00:20:20,060 --> 00:20:23,560 A potom po našej formátovací reťazec, 244 00:20:23,560 --> 00:20:27,880 jednoducho majú náhrady, ktoré sme prístup pomocou bodkovaný notácie 245 00:20:27,880 --> 00:20:31,370 ktorú sme videli v problému sade 3. 246 00:20:31,370 --> 00:20:48,820 Môžeme použiť s.last, s.first, a s.email 247 00:20:48,820 --> 00:20:58,990 nahradiť v týchto troch hodnôt do nášho formátovacieho reťazca. 248 00:20:58,990 --> 00:21:06,190 Tak ako to išlo? Zmysel? 249 00:21:06,190 --> 00:21:09,700 Áno? Nie? Možno? Dobre. 250 00:21:09,700 --> 00:21:14,180 >> Posledná vec, že ​​my potom, čo sme vytlačiť a potom, čo sme otvorili našu súbor: 251 00:21:14,180 --> 00:21:17,370 keď sme otvorili súbor, musíme vždy pamätať na jeho zatvorenie. 252 00:21:17,370 --> 00:21:19,430 Pretože inak skončíme úniku pamäte, 253 00:21:19,430 --> 00:21:22,500 použitie sa deskriptory súborov. 254 00:21:22,500 --> 00:21:25,950 Takže zatvorte ho, ktoré funkcie budeme používať? Daniel? 255 00:21:25,950 --> 00:21:30,120 [Daniel] fclose? >> Fclose, presne. 256 00:21:30,120 --> 00:21:37,520 Takže posledná časť tohto problému bolo riadne zatvorte súbor, pomocou fclose funkcie, 257 00:21:37,520 --> 00:21:40,370 ktorý práve vyzerá. 258 00:21:40,370 --> 00:21:43,880 Nie je príliš šialené. 259 00:21:43,880 --> 00:21:46,990 Cool. 260 00:21:46,990 --> 00:21:49,520 Tak to je problém 33 o teste. 261 00:21:49,520 --> 00:21:52,480 Budeme mať určite väčší súbor I / O prísť. 262 00:21:52,480 --> 00:21:55,130 Urobíme trochu viac v prednáške dnes, alebo v sekcii dnes, 263 00:21:55,130 --> 00:22:01,710 pretože to je to, čo sa deje tvoriť časť tejto nadchádzajúcej PSet. 264 00:22:01,710 --> 00:22:05,020 Poďme ďalej od testu v tomto bode. Áno? 265 00:22:05,020 --> 00:22:10,880 >> [Charlotte]] Prečo fclose (súbor) miesto fclose (staff.csv)? 266 00:22:10,880 --> 00:22:19,100 >> Ah. Vzhľadom k tomu, že sa ukáže, že - tak otázka, ktorá je veľký, 267 00:22:19,100 --> 00:22:27,800 je dôvod, prečo, keď píšeme fclose, píšeme fclose (súbor) star premennú 268 00:22:27,800 --> 00:22:33,680 na rozdiel od názvu súboru, staff.csv? Je to správne? Jo. 269 00:22:33,680 --> 00:22:39,570 Takže poďme sa pozrieť. Ak by som prejsť späť na mojom notebooku, 270 00:22:39,570 --> 00:22:45,040 a poďme sa pozrieť na fclose funkciu. 271 00:22:45,040 --> 00:22:51,460 Takže fclose funkcie uzatvára prúd a trvá na ukazovateľ na prúde, ktorý chceme uzavrieť, 272 00:22:51,460 --> 00:22:57,010 na rozdiel od skutočného názvu súboru, ktorý chceme uzavrieť. 273 00:22:57,010 --> 00:23:01,620 A to je preto, že v zákulisí, keď urobíte volanie fopen, 274 00:23:01,620 --> 00:23:12,020 keď si otvoríte súbor, ste vlastne prideľovanie pamäte pre ukladanie informácií o súbore. 275 00:23:12,020 --> 00:23:16,380 Takže máte súbor ukazovateľ, ktorý má informácie o súbore, 276 00:23:16,380 --> 00:23:23,080 ako je to otvorené, jeho veľkosť, kde sa v súčasnosti v súbore, 277 00:23:23,080 --> 00:23:29,100 takže si môžete urobiť čítanie a písanie volaní daného miesta v súbore. 278 00:23:29,100 --> 00:23:38,060 Môžete skončiť uzavretím ukazovateľ namiesto uzavretia názov súboru. 279 00:23:38,060 --> 00:23:48,990 >> Áno? [Daniel] Tak aby bolo možné používať prenájom, povedali by ste - ako to dostať užívateľský vstup? 280 00:23:48,990 --> 00:23:53,830 Má fprintf správať ako GetString v tom zmysle, že to bude len čakať na vstup od používateľa 281 00:23:53,830 --> 00:23:57,180 a požiadať, aby ste zadajte tento - alebo počkať na zadanie tieto tri veci? 282 00:23:57,180 --> 00:24:00,480 Alebo potrebujete použiť niečo realizovať prenájom? 283 00:24:00,480 --> 00:24:04,100 Jo >>. Takže nie sme - otázka bola, ako sa dostať vstup od používateľa 284 00:24:04,100 --> 00:24:09,220 za účelom vykonania nájom? A to, čo tu máme, je volajúci o prenájme, 285 00:24:09,220 --> 00:24:17,690 prešla v tomto pracovníkov struct so všetkými z dát uložených v struct už. 286 00:24:17,690 --> 00:24:22,990 Takže fprintf je schopný len napísať, že dáta priamo do súboru. 287 00:24:22,990 --> 00:24:25,690 Nie je potrebné čakať na vstup od užívateľa. 288 00:24:25,690 --> 00:24:32,110 Užívateľ je už daná vstup riadne vložením do tohto zamestnanca struct. 289 00:24:32,110 --> 00:24:36,510 A veci, samozrejme, by rozbiť, ak niektorý z týchto ukazovateľov boli null, 290 00:24:36,510 --> 00:24:40,370 tak sme sa posunúť späť a my pozrieť na našu struct. 291 00:24:40,370 --> 00:24:43,640 Máme reťazec naposledy, string prvý, string email. 292 00:24:43,640 --> 00:24:48,530 Teraz vieme, že všetci tí, naozaj, pod kapotou, sú char * premenné. 293 00:24:48,530 --> 00:24:53,470 To môže alebo nemusí byť nasmerovaná na null. 294 00:24:53,470 --> 00:24:55,800 Môžu smerovať do pamäte na halde, 295 00:24:55,800 --> 00:24:59,650 Možno pamäť na zásobníku. 296 00:24:59,650 --> 00:25:04,580 My naozaj nevieme, ale ak niektorý z týchto ukazovateľov sú null, alebo neplatné, 297 00:25:04,580 --> 00:25:08,120 že to určite havárii naša požičovňa funkciu. 298 00:25:08,120 --> 00:25:11,050 To bolo niečo, čo bolo trochu nad rámec skúšky. 299 00:25:11,050 --> 00:25:16,440 Nie sme starosti, že. 300 00:25:16,440 --> 00:25:22,170 Great. Dobre. Takže sa presunul od kvízu. 301 00:25:22,170 --> 00:25:25,760 >> Poďme zavrieť toho chlapa, a budeme sa pozerať na PSet 4. 302 00:25:25,760 --> 00:25:34,700 Takže ak ste sa pozrieť na spec PSet, akonáhle k nemu máte prístup, cs50.net/quizzes, 303 00:25:34,700 --> 00:25:42,730 sme ísť cez niekoľko sekcií problémov dnes. 304 00:25:42,730 --> 00:25:52,240 Ja rolovanie dole - časť otázok začína na tretej strane PSet špec. 305 00:25:52,240 --> 00:25:57,800 A prvá časť vás požiada ísť a pozerať sa na krátky na presmerovanie a potrubí. 306 00:25:57,800 --> 00:26:02,820 Čo bolo docela v pohode krátky, zobrazí niekoľko nových cool triky príkazového riadku, ktoré môžete použiť. 307 00:26:02,820 --> 00:26:06,050 A potom máme niekoľko otázok pre vás rovnako. 308 00:26:06,050 --> 00:26:10,860 Táto prvá otázka prúdy, ktoré printf píše v predvolenom nastavení, 309 00:26:10,860 --> 00:26:15,920 sme trochu dotkli len trochu pred chvíľou. 310 00:26:15,920 --> 00:26:22,380 To fprintf, že sme práve diskutovali berie v prúde súboru * ako jeho argument. 311 00:26:22,380 --> 00:26:26,580 fclose berie v prúde súboru * i, 312 00:26:26,580 --> 00:26:32,660 a návratová hodnota funkcie fopen vám súboru * prúd rovnako. 313 00:26:32,660 --> 00:26:36,060 Dôvod, prečo sme nevideli tie predtým, keď sme sa zaoberal printf 314 00:26:36,060 --> 00:26:39,450 Je tomu tak preto printf má predvolenú prúd. 315 00:26:39,450 --> 00:26:41,810 A predvolené prúd, na ktoré sa píše 316 00:26:41,810 --> 00:26:45,190 zistíš asi v krátkej. 317 00:26:45,190 --> 00:26:50,080 Takže určite sa na neho pozrieť. 318 00:26:50,080 --> 00:26:53,010 >> V dnešnej časti budeme hovoriť trochu o GDB, 319 00:26:53,010 --> 00:26:57,720 od viac ste oboznámení s tým, viac praxe dostanete s ním, 320 00:26:57,720 --> 00:27:01,390 lepšie schopný budete skutočne stopovať chyby vo vašom vlastnom kódu. 321 00:27:01,390 --> 00:27:05,540 To urýchľuje proces ladenia hore ohromne. 322 00:27:05,540 --> 00:27:09,230 Takže pomocou printf, zakaždým, keď to, že budete musieť rekompilovat kód, 323 00:27:09,230 --> 00:27:13,000 budete musieť spustiť znova, niekedy budete musieť presunúť printf hovor okolo, 324 00:27:13,000 --> 00:27:17,100 komentár mimo kód, zaberie to len chvíľku. 325 00:27:17,100 --> 00:27:20,850 Naším cieľom je pokúsiť sa presvedčiť, že s GDB, môžete v podstate 326 00:27:20,850 --> 00:27:26,810 printf niečo na ľubovoľnom mieste v kóde a už nikdy nebudete musieť prekompilovať ho. 327 00:27:26,810 --> 00:27:35,120 Už nikdy nebudete musieť začať a udržať hádať, kde printf ďalšie. 328 00:27:35,120 --> 00:27:40,910 Prvá vec, ktorú musíte urobiť, je skopírovať tento riadok a získať časť kódu preč webu. 329 00:27:40,910 --> 00:27:47,530 Som kopírovanie tento riadok kódu, ktorý hovorí, "wget ​​http://cdn.cs50.net". 330 00:27:47,530 --> 00:27:49,510 Budem ho kopírovať. 331 00:27:49,510 --> 00:27:55,950 Chystám sa ísť na moju spotrebiče, oddialenie, takže môžete vidieť, čo robím, 332 00:27:55,950 --> 00:28:01,890 vložiť to tam, a keď som stlačte klávesu Enter, táto wget príkaz doslova je web dostať. 333 00:28:01,890 --> 00:28:06,210 Bude to búrať tento súbor preč na internete, 334 00:28:06,210 --> 00:28:11,790 a bude to uložiť do aktuálneho adresára. 335 00:28:11,790 --> 00:28:21,630 Teraz, keď som zoznam svoju aktuálnu adresár môžete vidieť, že som dostal túto section5.zip súbor priamo tam. 336 00:28:21,630 --> 00:28:25,260 Spôsob, ako sa s tým vysporiadať chlap je rozbaliť ho, 337 00:28:25,260 --> 00:28:27,650 ktoré môžete urobiť v príkazovom riadku, rovnako ako to. 338 00:28:27,650 --> 00:28:31,880 Section5.zip. 339 00:28:31,880 --> 00:28:36,980 To bude rozbaľte ho, vytvorte zložku pre mňa, 340 00:28:36,980 --> 00:28:40,410 nafúknuť všetok obsah, dal ich tam. 341 00:28:40,410 --> 00:28:47,410 Takže teraz môžem ísť do môjho sekcie 5 adresára pomocou príkazu cd. 342 00:28:47,410 --> 00:28:58,310 Zrušte obrazovku pomocou jasné. Takže vyčistiť obrazovku. 343 00:28:58,310 --> 00:29:02,280 Teraz mám pekný čistý terminál riešiť. 344 00:29:02,280 --> 00:29:06,200 >> Teraz, keď som vypísať všetky súbory, ktoré vidím v tomto adresári, 345 00:29:06,200 --> 00:29:12,270 vidíte, že mám štyri súbory: buggy1, buggy2, buggy3, a buggy4. 346 00:29:12,270 --> 00:29:16,180 Ja som tiež dostal svoje zodpovedajúce. C súbory. 347 00:29:16,180 --> 00:29:20,400 Nebudeme sa pozerať na. Súbory C pre túto chvíľu. 348 00:29:20,400 --> 00:29:24,140 Namiesto toho, budeme používať je, keď sme sa otvoriť GDB. 349 00:29:24,140 --> 00:29:28,220 Sme držali je asi tak, že máme prístup k aktuálne zdrojový kód, keď sme pomocou GDB, 350 00:29:28,220 --> 00:29:32,740 ale cieľom tejto časti sekcie je pohrať si s GDB 351 00:29:32,740 --> 00:29:40,370 a uvidíte, ako môžeme použiť zistiť, čo sa deje zle s každou z týchto štyroch kočíka programov. 352 00:29:40,370 --> 00:29:43,380 Takže sme len tak po izbe naozaj rýchlo, 353 00:29:43,380 --> 00:29:47,000 a budem sa opýtať niekoho spustiť jednu z kočíka programov, 354 00:29:47,000 --> 00:29:54,730 a potom pôjdeme ako skupina prostredníctvom GDB, a uvidíme, čo môžeme urobiť pre to opraviť tieto programy, 355 00:29:54,730 --> 00:29:58,460 alebo aspoň zistiť, čo sa deje zle v každej z nich. 356 00:29:58,460 --> 00:30:04,760 Poďme začať znovu tu s Danielom. Spustíme buggy1? Poďme sa pozrieť, čo sa stane. 357 00:30:04,760 --> 00:30:09,470 [Daniel] To hovorí, že je to chyba aplikácie. Jo >>. Presne tak. 358 00:30:09,470 --> 00:30:12,460 Takže, keď spustím buggy1, dostanem seg poruchu. 359 00:30:12,460 --> 00:30:16,210 V tomto bode, som mohol ísť a otvoriť buggy1.c, 360 00:30:16,210 --> 00:30:19,450 vyskúšať a zistiť, čo sa deje zle, 361 00:30:19,450 --> 00:30:22,000 ale jeden z najviac nepríjemnými vecí na tomto seg poruchy chybe 362 00:30:22,000 --> 00:30:27,610 je to, že nemôžem povedať o tom, čo mnohé z programových vecí skutočne pokazilo a zlomil. 363 00:30:27,610 --> 00:30:29,880 Tak nejako sa pozrieť na kód 364 00:30:29,880 --> 00:30:33,990 a zistiť pomocou odhad a kontrolu alebo printf vidieť, čo sa deje zle. 365 00:30:33,990 --> 00:30:37,840 Jedna z najlepších vecí, o GDB je, že je to naozaj, ale naozaj jednoduché 366 00:30:37,840 --> 00:30:42,170 prísť na to, riadok, v ktorom váš program zrúti. 367 00:30:42,170 --> 00:30:46,160 Je to absolútne stojí za to ju používať, aj keď len na to. 368 00:30:46,160 --> 00:30:56,190 Takže naštartovať GDB, som typ GDB, a potom som jej dávajú cestu k spustiteľného súboru, ktorý chcem spustiť. 369 00:30:56,190 --> 00:31:01,960 Tu píšem gdb ./buggy1. 370 00:31:01,960 --> 00:31:06,600 Stlačte Enter. Dáva mi to všetko informácie o autorských právach, 371 00:31:06,600 --> 00:31:13,000 a tu uvidíte tento riadok, ktorý hovorí, "Čítanie symbolov z / home / 372 00:31:13,000 --> 00:31:17,680 jharvard/section5/buggy1. " 373 00:31:17,680 --> 00:31:22,060 A ak všetko pôjde dobre, uvidíte, že vytlačiť správu, ktorá vyzerá takto. 374 00:31:22,060 --> 00:31:25,500 Bude to čítať symboly, bude to hovoriť "Ja čítam symboly z vášho spustiteľného súboru," 375 00:31:25,500 --> 00:31:29,900 a potom to bude mať tento "Hotovo" správa tu. 376 00:31:29,900 --> 00:31:35,410 Ak vidíte iný variant tohto, alebo vidíte, že sa nepodarilo nájsť symboly 377 00:31:35,410 --> 00:31:41,460 alebo niečo také, čo to znamená, je to, že ste práve neboli pripravené na spustiteľný správne. 378 00:31:41,460 --> 00:31:49,980 Keď sme kompilovať programy pre použitie s GDB, musíme použiť túto špeciálnu g vlajkou, 379 00:31:49,980 --> 00:31:54,540 a že sa to robí v predvolenom nastavení, ak si skompilovať vaše programy, jednoduchým zadaním, aby 380 00:31:54,540 --> 00:31:59,320 alebo si kočík alebo sa zotaviť, každý z nich. 381 00:31:59,320 --> 00:32:07,800 Ale ak ste kompilácie ručne s Clang, potom budete musieť ísť a patrí to-g vlajkou. 382 00:32:07,800 --> 00:32:10,310 >> V tomto bode, teraz, keď máme GDB riadku, 383 00:32:10,310 --> 00:32:12,310 je to celkom jednoduché spustiť program. 384 00:32:12,310 --> 00:32:19,740 Môžeme buď zadať beh, alebo môžeme len typ R. 385 00:32:19,740 --> 00:32:22,820 Väčšina gdb príkazy môžu byť skrátené. 386 00:32:22,820 --> 00:32:25,940 Obvykle len na jednej alebo niekoľkých písmen, čo je docela pekné. 387 00:32:25,940 --> 00:32:30,980 Takže Saad, ak zadáte r a stlačte klávesu Enter, čo sa stane? 388 00:32:30,980 --> 00:32:39,390 [Saad] Mám SIGSEGV, Segmentation fault, a potom to všetko hatmatilka. 389 00:32:39,390 --> 00:32:43,650 Jo >>. 390 00:32:43,650 --> 00:32:47,990 Rovnako ako vidíme na obrazovke práve teraz, a ako Saad povedal, 391 00:32:47,990 --> 00:32:53,430 keď napíšeme beh alebo r a stlačte klávesu Enter, stále s rovnakou seg poruchu. 392 00:32:53,430 --> 00:32:55,830 Takže pomocou GDB nie je vyriešiť náš problém. 393 00:32:55,830 --> 00:32:59,120 Ale to nám dáva určité hatmatilka, a ukázalo sa, že to hatmatilka 394 00:32:59,120 --> 00:33:03,080 vlastne nám hovorí, kde sa to deje. 395 00:33:03,080 --> 00:33:10,680 Ak chcete analyzovať tento trochu, tento prvý bit je funkcia, v ktorej všetko zle. 396 00:33:10,680 --> 00:33:20,270 Tam je to __ strcmp_sse4_2, a to nám hovorí, že sa to deje v tomto súbore 397 00:33:20,270 --> 00:33:29,450 volal sysdeps/i386, to všetko opäť trochu neporiadok - ale linka 254. 398 00:33:29,450 --> 00:33:31,670 To je trochu ťažké analyzovať. Zvyčajne, keď vidíte veci, ako je tento, 399 00:33:31,670 --> 00:33:38,770 to znamená, že je to seg chyba v jednom z knižnice systému. 400 00:33:38,770 --> 00:33:43,220 Takže niečo do činenia s strcmp. Vy ste videl strcmp skôr. 401 00:33:43,220 --> 00:33:52,730 Nie je príliš bláznivé, ale znamená to, že strcmp je rozbité, alebo že je tu problém s strcmp? 402 00:33:52,730 --> 00:33:57,110 Čo si myslíte, Alexander? 403 00:33:57,110 --> 00:34:04,890 [Alexander] Je to - je 254 riadok? A - nie binárne, ale nie je to ich stropy, 404 00:34:04,890 --> 00:34:10,590 a potom je tu iný jazyk pre každú funkciu. Je to 254 v tejto funkcii, alebo -? 405 00:34:10,590 --> 00:34:21,460 >> Je to linka 254. Vyzerá to, že v tomto súbore. S., tak to je kód assembleri pravdepodobne. 406 00:34:21,460 --> 00:34:25,949 >> Ale myslím, že naliehavejšie vec je, pretože sme dostali seg poruchu, 407 00:34:25,949 --> 00:34:29,960 a vyzerá to, že to prichádza z strcmp funkcie, 408 00:34:29,960 --> 00:34:38,030 to neznamená, potom, je zle, že strcmp? 409 00:34:38,030 --> 00:34:42,290 To by nemalo, snáď. Takže len preto, že máte Segmentation fault 410 00:34:42,290 --> 00:34:49,480 v jednej z funkcií systému, zvyčajne to znamená, že ste práve Nevolal správne. 411 00:34:49,480 --> 00:34:52,440 Najrýchlejší vec urobiť, aby zistili, čo sa vlastne deje 412 00:34:52,440 --> 00:34:55,500 keď vidíte niečo šialeného, ​​ako to, keď vidíte seg poruchu, 413 00:34:55,500 --> 00:34:59,800 najmä ak máte program, ktorý je pomocou viac než len hlavné, 414 00:34:59,800 --> 00:35:03,570 je použiť backtrace. 415 00:35:03,570 --> 00:35:13,080 Aj skrátiť backtrace písaním BT, ako protichodný k plnému backtrace slovo. 416 00:35:13,080 --> 00:35:16,510 Ale Charlotte, čo sa stane, keď zadáte BT a stlačte klávesu Enter? 417 00:35:16,510 --> 00:35:23,200 [Charlotte] Ukazuje mi dva riadky, riadok 0 a 1. riadok. 418 00:35:23,200 --> 00:35:26,150 Jo >>. Takže riadok 0 a 1. riadok. 419 00:35:26,150 --> 00:35:34,560 Jedná sa o skutočné zásobníka zábery, ktoré sa v súčasnej dobe v hre, keď váš program havaroval. 420 00:35:34,560 --> 00:35:42,230 Počnúc najvyššej rámu, rámu 0, a bude k najspodnejšej, ktorá je rám 1. 421 00:35:42,230 --> 00:35:45,140 Naša najvyššia rám je strcmp rámu. 422 00:35:45,140 --> 00:35:50,080 Môžete myslieť na to, ako podobný k tomuto problému sme robili len to, na teste s ukazovateľmi, 423 00:35:50,080 --> 00:35:54,890 kde sme vymeniť zásobník rám na hornej časti hlavného zásobníka rámu, 424 00:35:54,890 --> 00:35:59,700 a my sme museli premenné tak, že prehodí sa pomocou na vrchole premenných, že hlavné je používať. 425 00:35:59,700 --> 00:36:08,440 Tu naše crash stalo v našej strcmp funkcie, ktoré sa hovorilo o našej hlavnou funkciou, 426 00:36:08,440 --> 00:36:14,370 a backtrace nám dáva nielen funkcie, v ktorých veci zlyhala, 427 00:36:14,370 --> 00:36:16,440 ale je to tiež nám hovorí, kde bolo všetko len z 428 00:36:16,440 --> 00:36:18,830 Takže ak som prejdite trochu viac vpravo, 429 00:36:18,830 --> 00:36:26,110 môžeme vidieť, že jo, my sme boli na linke 254 tohto strcmp-sse4.s súboru. 430 00:36:26,110 --> 00:36:32,540 Ale hovor bol robený na buggy1.c, riadok 6. 431 00:36:32,540 --> 00:36:35,960 Takže to znamená, že môžeme urobiť - je, že sme si jednoducho ísť pozrieť a zistiť, čo sa deje 432 00:36:35,960 --> 00:36:39,930 na buggy1.c, riadok 6. 433 00:36:39,930 --> 00:36:43,780 Opäť, existuje niekoľko spôsobov, ako to urobiť. Jedným z nich je ukončenie z GDB 434 00:36:43,780 --> 00:36:49,460 alebo mať váš kód otvorí v inom okne a cross referencie. 435 00:36:49,460 --> 00:36:54,740 To samo o sebe, je celkom užitočné, pretože teraz, keď ste na úradných hodín 436 00:36:54,740 --> 00:36:57,220 a máte seg poruchu a vaše TF sa divila, kde všetko bolo porušenie, 437 00:36:57,220 --> 00:36:59,710 stačí povedať, "Oh, linka 6. Neviem, čo sa deje, 438 00:36:59,710 --> 00:37:03,670 ale niečo riadku 6 je príčinou môj program prerušiť. " 439 00:37:03,670 --> 00:37:10,430 Iný spôsob, ako to urobiť, je, môžete použiť tento príkaz s názvom zoznam v GDB. 440 00:37:10,430 --> 00:37:13,650 Môžete tiež skrátiť s l 441 00:37:13,650 --> 00:37:18,910 Takže ak sme narazili l, čo sme sa sem dostali? 442 00:37:18,910 --> 00:37:21,160 Dostávame veľa podivné veci. 443 00:37:21,160 --> 00:37:26,030 To je skutočná zostava kód 444 00:37:26,030 --> 00:37:29,860 že je v strcmp_sse4_2. 445 00:37:29,860 --> 00:37:32,440 To vyzerá druh funky, 446 00:37:32,440 --> 00:37:36,520 a dôvod, prečo sme stále je to preto, že práve teraz, 447 00:37:36,520 --> 00:37:40,160 GDB má nás v ráme 0. 448 00:37:40,160 --> 00:37:43,070 >> Takže kedykoľvek sa pozrieme na premenné, kedykoľvek sa pozrieme na zdrojový kód, 449 00:37:43,070 --> 00:37:50,530 pozeráme zdrojového kódu, ktorý sa vzťahuje k zásobníku rámu sme práve nachádzate 450 00:37:50,530 --> 00:37:53,200 Tak, aby si niečo zmysluplného, ​​musíme 451 00:37:53,200 --> 00:37:57,070 prejsť na zásobníku rámu, ktorý dáva väčší zmysel. 452 00:37:57,070 --> 00:38:00,180 V tomto prípade by hlavný zásobník rám, aby trochu väčší zmysel, 453 00:38:00,180 --> 00:38:02,680 pretože to bol vlastne kód, ktorý sme napísali. 454 00:38:02,680 --> 00:38:05,330 Nie je strcmp kód. 455 00:38:05,330 --> 00:38:08,650 Spôsob, akým sa môžete pohybovať medzi snímky, v tomto prípade, pretože máme dve, 456 00:38:08,650 --> 00:38:10,430 máme 0 a 1, 457 00:38:10,430 --> 00:38:13,650 robíte, že sa hore a dole príkazov. 458 00:38:13,650 --> 00:38:18,480 Ak by som posunúť o jednu snímku, 459 00:38:18,480 --> 00:38:21,770 teraz som v hlavnom zásobníku ráme. 460 00:38:21,770 --> 00:38:24,330 Môžem sa pohybovať dole ísť tam, kde som bol, 461 00:38:24,330 --> 00:38:32,830 ísť znovu, ísť zase dole, a ísť znovu. 462 00:38:32,830 --> 00:38:39,750 Ak ste niekedy robiť program v GDB, dostanete havárii, získate backtrace, 463 00:38:39,750 --> 00:38:42,380 a zistíte, že je to v nejakom súbore, ktorý nevie, čo sa deje. 464 00:38:42,380 --> 00:38:45,460 Môžete skúsiť zoznamu, kód nevyzerá poznáte, 465 00:38:45,460 --> 00:38:48,150 pozrite sa na zoznam snímok a zistiť, kde ste. 466 00:38:48,150 --> 00:38:51,010 Pravdepodobne ste v zlom rámca frontu. 467 00:38:51,010 --> 00:38:58,760 Alebo aspoň, že si v zásobníku ráme, ktorý nie je ten, ktorý si môžete naozaj ladiť. 468 00:38:58,760 --> 00:39:03,110 Teraz, keď sme v príslušnej rámca frontu, sme v hlavnom, 469 00:39:03,110 --> 00:39:08,100 Teraz môžeme použiť príkaz list sa zistiť, čo linka bola. 470 00:39:08,100 --> 00:39:13,590 A vidíte to, to vytlačil pre nás tu. 471 00:39:13,590 --> 00:39:19,470 Ale môžeme zasiahnuť zoznam všetkých rovnaké, a zoznam nám dáva toto pekné výtlačok 472 00:39:19,470 --> 00:39:23,920 skutočného zdrojového kódu, čo sa deje tu. 473 00:39:23,920 --> 00:39:26,420 >> Najmä, môžeme sa pozrieť na riadku 6. 474 00:39:26,420 --> 00:39:29,330 Môžeme vidieť, čo sa deje tu. 475 00:39:29,330 --> 00:39:31,250 A vyzerá to, že robíme nákupný reťazcov 476 00:39:31,250 --> 00:39:41,050 medzi reťazcami "CS50 skál" a ArGV [1]. 477 00:39:41,050 --> 00:39:45,700 Niečo o tom padal. 478 00:39:45,700 --> 00:39:54,120 Takže Missy, máte nejaké myšlienky na to, čo by mohlo byť to tu deje? 479 00:39:54,120 --> 00:39:59,400 [Missy] Ja neviem, prečo to zhadzovať. >> Neviete prečo to zhadzovať? 480 00:39:59,400 --> 00:40:02,700 Jimmy, nejaké myšlienky? 481 00:40:02,700 --> 00:40:06,240 [Jimmy] Nie som si úplne istý, ale v poslednej dobe sme použili reťazec nákupný, 482 00:40:06,240 --> 00:40:10,260 alebo strcmp, mali sme ako tri rôzne prípady podľa nej. 483 00:40:10,260 --> 00:40:12,800 Nemali sme k ==, nemyslím si, že priamo v tej prvej línii. 484 00:40:12,800 --> 00:40:16,700 Namiesto toho bol rozdelený do troch a jedna == 0, 485 00:40:16,700 --> 00:40:19,910 jeden bol <0, myslím, a jeden bol> 0. 486 00:40:19,910 --> 00:40:22,590 Takže možno niečo také? Jo >>. Takže tam je to problém 487 00:40:22,590 --> 00:40:27,200 z robíme porovnaní správne? 488 00:40:27,200 --> 00:40:31,660 Stella? Akékoľvek myšlienky? 489 00:40:31,660 --> 00:40:38,110 [Stella] Nie som si istý. >> Nie som si istý. Daniel? Myšlienky? Dobre. 490 00:40:38,110 --> 00:40:44,770 Ukázalo sa, že to, čo sa deje tu, je, keď sme bežali program 491 00:40:44,770 --> 00:40:48,370 a my sme dostali seg poruchu, pri spustení programu po prvýkrát, Daniel, 492 00:40:48,370 --> 00:40:50,800 ste ho žiadne argumenty príkazového riadku? 493 00:40:50,800 --> 00:40:58,420 [Daniel] No >> č V tomto prípade, čo je hodnota ArGV [1]? 494 00:40:58,420 --> 00:41:00,920 >> Nie je žiadna hodnota. Právo >>. 495 00:41:00,920 --> 00:41:06,120 No, nie je vhodné hodnota reťazca. 496 00:41:06,120 --> 00:41:10,780 Ale tam je nejaká hodnota. Aká je hodnota, ktorá je uložená v tam? 497 00:41:10,780 --> 00:41:15,130 >> Odpadky hodnota? >> Je to buď odpadky hodnota alebo, v tomto prípade, 498 00:41:15,130 --> 00:41:19,930 koniec poľa ArGV je vždy ukončený s null. 499 00:41:19,930 --> 00:41:26,050 Takže, čo vlastne dostal v nich uložené, je null. 500 00:41:26,050 --> 00:41:30,810 Ďalší spôsob, ako vyriešiť tento, skôr ako myslenie cez, 501 00:41:30,810 --> 00:41:33,420 je pokúsiť vytlačiť to. 502 00:41:33,420 --> 00:41:35,880 To je miesto, kde som si hovoril, že používanie GDB je skvelé, 503 00:41:35,880 --> 00:41:40,640 pretože si môžete vytlačiť všetky premenné, všetky hodnoty, ktoré chcete 504 00:41:40,640 --> 00:41:43,230 pomocou tohto handy-dandy p príkazu. 505 00:41:43,230 --> 00:41:48,520 Takže ak som typ p a potom som zadajte hodnotu premennej alebo názov premennej, 506 00:41:48,520 --> 00:41:55,320 hovoria, argc, vidím, že argc je 1. 507 00:41:55,320 --> 00:42:01,830 Ak chcem vytlačiť ArGV [0], môžem tak urobiť len tak. 508 00:42:01,830 --> 00:42:04,840 A ako sme videli, ArGV [0] je vždy názov programu, 509 00:42:04,840 --> 00:42:06,910 vždy názov spustiteľného súboru. 510 00:42:06,910 --> 00:42:09,740 Tu môžete vidieť, že má úplný názov. 511 00:42:09,740 --> 00:42:15,920 Môžem tiež vytlačiť ArGV [1], a uvidíme, čo sa stane. 512 00:42:15,920 --> 00:42:20,890 >> Tu sme dostali tento druh mystickej hodnoty. 513 00:42:20,890 --> 00:42:23,890 Máme túto 0x0. 514 00:42:23,890 --> 00:42:27,850 Nezabudnite na začiatku semestra, kedy sme hovorili o hexadecimálne čísla? 515 00:42:27,850 --> 00:42:34,680 Alebo že malá otázka na konci PSet 0 o tom, ako reprezentovať 50 v hex? 516 00:42:34,680 --> 00:42:39,410 Spôsob, akým píšeme hex čísla v SK, len nepliesť sami 517 00:42:39,410 --> 00:42:46,080 s desatinnými číslami, je, že sme vždy prefix im 0x. 518 00:42:46,080 --> 00:42:51,420 Tak toto 0x prefix vždy len rozumie interpretovať nasledujúce číslo ako hexadecimálne číslo, 519 00:42:51,420 --> 00:42:57,400 nie ako reťazec, nie ako desatinné číslo, nie ako binárne číslo. 520 00:42:57,400 --> 00:43:02,820 Pretože počet 5-0 je platné číslo v šestnástkovej sústave. 521 00:43:02,820 --> 00:43:06,240 A to je číslo v desiatkovej sústave, 50. 522 00:43:06,240 --> 00:43:10,050 Takže to je to, ako sme disambiguate. 523 00:43:10,050 --> 00:43:14,860 Takže 0x0 prostriedky hexadecimálne 0, čo je tiež desatinné 0, binárne 0. 524 00:43:14,860 --> 00:43:17,030 Je to len hodnota 0. 525 00:43:17,030 --> 00:43:22,630 Ukazuje sa, že to je to, čo je null, vlastne, v pamäti. 526 00:43:22,630 --> 00:43:25,940 Null je len 0. 527 00:43:25,940 --> 00:43:37,010 Tu prvok uložený v ArGV [1] je nulový. 528 00:43:37,010 --> 00:43:45,220 Takže sa snažíme tieto naše "CS50 skaly" reťazec nulový reťazec. 529 00:43:45,220 --> 00:43:48,130 Takže dereferencing null, pokuse o prístup k veci na null, 530 00:43:48,130 --> 00:43:55,050 tie sú zvyčajne bude spôsobovať nejaké Segmentation fault alebo iné zlé veci sa dejú. 531 00:43:55,050 --> 00:43:59,350 A ukázalo sa, že strcmp nekontroluje vidieť 532 00:43:59,350 --> 00:44:04,340 či ste prešiel v hodnote, ktorá je null. 533 00:44:04,340 --> 00:44:06,370 Skôr to len ide dopredu, snažia sa robiť svoju vec, 534 00:44:06,370 --> 00:44:14,640 a ak seg chyby, to seg chyby, a je to tvoj problém. Musíš ísť opraviť. 535 00:44:14,640 --> 00:44:19,730 Naozaj rýchlo, môže ako tento problém vyriešiť? Charlotte? 536 00:44:19,730 --> 00:44:23,540 [Charlotte] môžete skontrolovať pomocou, ak. 537 00:44:23,540 --> 00:44:32,240 Takže ak ArGV [1] je null, == 0, potom sa vráťte 1, alebo niečo [nezrozumiteľné]. 538 00:44:32,240 --> 00:44:34,590 Jo >>. Takže to je jedna skvelý spôsob, ako to urobiť, ako môžeme skontrolovať, 539 00:44:34,590 --> 00:44:39,230 hodnota sa chystáme prejsť do strcmp, ArGV [1], je null? 540 00:44:39,230 --> 00:44:45,830 Ak je to null, potom môžeme povedať, v poriadku, potratiť. 541 00:44:45,830 --> 00:44:49,450 >> Bežnejšie spôsob, ako to urobiť, je použiť argc hodnotu. 542 00:44:49,450 --> 00:44:52,040 Môžete vidieť priamo tu na začiatku main, 543 00:44:52,040 --> 00:44:58,040 Vynechali sme, že prvý test, ktorý sme zvyčajne robiť, keď budeme používať argumenty príkazového riadku, 544 00:44:58,040 --> 00:45:05,240 ktorý je otestovať, či nie je naša argc hodnota je to, čo očakávame. 545 00:45:05,240 --> 00:45:10,290 V tomto prípade, čakáme najmenej dva argumenty, 546 00:45:10,290 --> 00:45:13,660 názov programu plus jeden ďalší. 547 00:45:13,660 --> 00:45:17,140 Pretože sa chystáme použiť druhý argument tu. 548 00:45:17,140 --> 00:45:21,350 Takže má nejaký skúšky vopred, pred naším strcmp hovoru 549 00:45:21,350 --> 00:45:37,390 že testy tiež ArGV je najmenej 2, by tiež urobiť rovnaký druh veci. 550 00:45:37,390 --> 00:45:40,620 Môžeme zistiť, či to funguje, spustením programu znovu. 551 00:45:40,620 --> 00:45:45,610 Vždy sa môžete reštartovať program do GDB, čo je naozaj pekné. 552 00:45:45,610 --> 00:45:49,310 Môžete spustiť, a pri odovzdaní v argumentoch do vášho programu, 553 00:45:49,310 --> 00:45:53,060 odovzdáte je, keď hovoríte spustenie, nie pri štarte GDB. 554 00:45:53,060 --> 00:45:57,120 Týmto spôsobom môžete mať vyvolanie programu s rôznymi argumentmi zakaždým. 555 00:45:57,120 --> 00:46:08,080 Tak bežte, alebo znovu, môžem Type R, a uvidíme, čo sa stane, keď napíšeme "ahoj". 556 00:46:08,080 --> 00:46:11,140 To bude vždy spýta, či chcete spustiť znova od začiatku. 557 00:46:11,140 --> 00:46:17,490 Obvykle si chcete spustiť znova od začiatku. 558 00:46:17,490 --> 00:46:25,010 A v tomto bode, to reštartuje to znovu, to vytlačí 559 00:46:25,010 --> 00:46:28,920 program, ktorý sme beh, buggy1, s argumentom ahoj, 560 00:46:28,920 --> 00:46:32,720 a vytlačí tento štandard von, hovorí, "Dostanete D," smutný tvár. 561 00:46:32,720 --> 00:46:37,610 Ale my sme to seg chyba. To hovoril, že proces ukončený normálne. 562 00:46:37,610 --> 00:46:39,900 Takže to vyzerá celkom dobre. 563 00:46:39,900 --> 00:46:43,050 Žiadne ďalšie seg chyba, sme to minulosť, 564 00:46:43,050 --> 00:46:48,190 takže to vyzerá, že je skutočne seg chyba chyba, že sme sa dostať. 565 00:46:48,190 --> 00:46:51,540 Bohužiaľ, to nám hovorí, že sme stále na D. 566 00:46:51,540 --> 00:46:54,090 >> Môžeme sa vrátiť a pozrieť sa na kód a vidieť, čo sa tam deje 567 00:46:54,090 --> 00:46:57,980 zistiť, čo bolo - prečo sa to nám hovorí, že máme D. 568 00:46:57,980 --> 00:47:03,690 Poďme sa pozrieť, tu bola táto printf hovorí, že máš D. 569 00:47:03,690 --> 00:47:08,540 Ak napíšeme zoznam, ako si udržať písanie zoznamu, udržuje iterácia sa prostredníctvom svojho programu, 570 00:47:08,540 --> 00:47:10,940 tak to vám ukážem niekoľko prvých riadkov programu. 571 00:47:10,940 --> 00:47:15,450 Potom vám ukážem niekoľko ďalších riadkov, a ďalší kus a ďalší kus. 572 00:47:15,450 --> 00:47:18,240 A to bude ďalej snažiť ísť dole. 573 00:47:18,240 --> 00:47:21,180 A teraz sa dostaneme "linku číslo 16 je mimo rozsah." 574 00:47:21,180 --> 00:47:23,940 Vzhľadom k tomu, že má len 15 riadkov. 575 00:47:23,940 --> 00:47:30,310 Ak sa dostanete do tohto bodu a vaše premýšľal, "Čo mám robiť?" môžete použiť príkaz help. 576 00:47:30,310 --> 00:47:34,340 Použite nápovedu a potom to meno príkazu. 577 00:47:34,340 --> 00:47:36,460 A vidíte, GDB nám dáva všetky takéto veci. 578 00:47:36,460 --> 00:47:43,870 To hovorí: "S žiadnym argumentom, uvádza ďalších desať liniek po alebo okolo predchádzajúceho zoznamu. 579 00:47:43,870 --> 00:47:47,920 Zoznam - uvádza desať riadky pred - " 580 00:47:47,920 --> 00:47:52,960 Tak poďme skúsiť pomocou zoznamu mínus. 581 00:47:52,960 --> 00:47:57,000 A, ktorý uvádza, že 10 riadkov predchádzajúcej, môžete pohrať so zoznamom trochu. 582 00:47:57,000 --> 00:48:02,330 Môžete to urobiť zoznam, zoznam -, môžete si dokonca dať vypísať číslo, ako je zoznam 8, 583 00:48:02,330 --> 00:48:07,500 a to bude zoznam 10 riadkov po riadku 8. 584 00:48:07,500 --> 00:48:10,290 A vidíte, čo sa tu deje je máš jednoduché, ak iný. 585 00:48:10,290 --> 00:48:13,980 Ak zadáte CS50 skalách, vypíše "Získate A." 586 00:48:13,980 --> 00:48:16,530 Inak to vytlačí "Dostanete D." 587 00:48:16,530 --> 00:48:23,770 Bummer mesto. Dobrá. Áno? 588 00:48:23,770 --> 00:48:26,730 >> [Daniel] Takže keď som sa snažil robiť CS50 kamene bez úvodzoviek, 589 00:48:26,730 --> 00:48:29,290 hovorí, že "Dostanete D." 590 00:48:29,290 --> 00:48:32,560 Potreboval som úvodzovky sa dostať do práce, prečo to je? 591 00:48:32,560 --> 00:48:38,490 Jo >>. Ukazuje sa, že keď - to je ďalší trochu zábavy lahôdku - 592 00:48:38,490 --> 00:48:47,900 pri spustení programu, ak by sme ho spustiť a my zadajte CS50 skalách, 593 00:48:47,900 --> 00:48:50,800 rovnako ako Daniel bol povedal, že áno, a stlačíte kláves Enter, 594 00:48:50,800 --> 00:48:52,870 stále hovorí, že sme si D. 595 00:48:52,870 --> 00:48:55,580 A otázka je, prečo to je? 596 00:48:55,580 --> 00:49:02,120 A ukázalo sa, že ako naše terminál a GDB analyzovať tieto ako dve samostatné argumenty. 597 00:49:02,120 --> 00:49:04,800 Vzhľadom k tomu, keď je priestor, ktorý je vyjadrený 598 00:49:04,800 --> 00:49:08,730 Prvý argument skončila, ďalší argument je asi začať. 599 00:49:08,730 --> 00:49:13,260 Spôsob skombinovať tie do dvoch, alebo ľúto, do jedného argumentu, 600 00:49:13,260 --> 00:49:18,510 je použiť úvodzovky. 601 00:49:18,510 --> 00:49:29,560 Takže teraz, keď dáme do úvodzoviek a spustite ho znova, dostaneme A. 602 00:49:29,560 --> 00:49:38,780 Takže len zhrnúť, žiadne citácie, CS50 a skaly analyzovať ako dve samostatné argumenty. 603 00:49:38,780 --> 00:49:45,320 S citáciami, je to analyzovať ako jeden argument úplne. 604 00:49:45,320 --> 00:49:53,070 >> Vidíme to s zarážka. 605 00:49:53,070 --> 00:49:54,920 Zatiaľ sme boli beží náš program, a to bol spustený 606 00:49:54,920 --> 00:49:58,230 kým buď seg závady alebo narazí na chybu 607 00:49:58,230 --> 00:50:05,930 alebo kým bol ukončený a všetky boli úplne v pohode. 608 00:50:05,930 --> 00:50:08,360 To nie je nevyhnutne najužitočnejšie vec, pretože niekedy 609 00:50:08,360 --> 00:50:11,840 Máte chybu v programe, ale to nie je spôsobenie Segmentation fault. 610 00:50:11,840 --> 00:50:16,950 Nie je to spôsobuje váš program zastaviť alebo niečo podobné. 611 00:50:16,950 --> 00:50:20,730 Spôsob, ako sa dostať GDB pozastaviť váš program na určitom mieste 612 00:50:20,730 --> 00:50:23,260 je nastaviť zarážku. 613 00:50:23,260 --> 00:50:26,520 Môžete buď vykonať nastavením zarážka na názov funkcie 614 00:50:26,520 --> 00:50:30,770 alebo môžete nastaviť zarážku na konkrétny riadok kódu. 615 00:50:30,770 --> 00:50:34,450 Páči sa mi nastaviť zarážky na názvy funkcií, pretože - ľahko zapamätateľné, 616 00:50:34,450 --> 00:50:37,700 a ak si skutočne ísť a zmeniť zdrojový kód do trochu, 617 00:50:37,700 --> 00:50:42,020 potom sa vaše breakpoint bude skutočne zostať na rovnakom mieste vo vašom kóde. 618 00:50:42,020 --> 00:50:44,760 Vzhľadom k tomu, ak používate čísla riadkov, a čísla riadkov zmení 619 00:50:44,760 --> 00:50:51,740 pretože pridáte alebo odstránite nejaký kód, potom sa vaše zarážky sú úplne posral. 620 00:50:51,740 --> 00:50:58,590 Jedným z najčastejších vecí, ktoré som urobiť, je nastaviť zarážku na hlavnú funkciu. 621 00:50:58,590 --> 00:51:05,300 Často som si naštartovať GDB, budem písať B Hlavné, stlačte klávesu Enter, a ktoré vám nastaviť zarážku 622 00:51:05,300 --> 00:51:10,630 na hlavnou funkciou, ktorú práve hovorí, "Pozastavenie programu, akonáhle začnú," 623 00:51:10,630 --> 00:51:17,960 a to tak, keď som spustiť svoj program, povedzme, CS50 skaly ako dva argumenty 624 00:51:17,960 --> 00:51:24,830 a stlačte klávesu Enter, sa dostane do hlavnej funkcie a zastaví sa na prvom riadku, 625 00:51:24,830 --> 00:51:30,620 tesne pred vyhodnocuje strcmp funkcie. 626 00:51:30,620 --> 00:51:34,940 >> Vzhľadom k tomu, som sa zastavil, teraz môžem začať odťaženia okolo a videl, čo sa deje 627 00:51:34,940 --> 00:51:40,250 so všetkými rôznymi premennými, ktoré sú odovzdávané do môjho programu. 628 00:51:40,250 --> 00:51:43,670 Tu môžem vytlačiť argc a vidieť, čo sa deje. 629 00:51:43,670 --> 00:51:50,030 Vidieť, že argc je 3, pretože je to má 3 rôzne hodnoty v ňom. 630 00:51:50,030 --> 00:51:54,060 Je to tu na názov programu, je to má prvý argument a druhý argument. 631 00:51:54,060 --> 00:52:09,330 Môžeme tlačiť tie z pohľadu na ArGV [0], ArGV [1], a ArGV [2]. 632 00:52:09,330 --> 00:52:12,030 Takže teraz môžete vidieť, prečo táto výzva strcmp bude na neúspech, 633 00:52:12,030 --> 00:52:21,650 pretože vidíte, že sa rozdelil CS50 a skaly do dvoch samostatných argumentov. 634 00:52:21,650 --> 00:52:27,250 V tomto okamihu, akonáhle ste hit zarážku, môžete pokračovať na krok prostredníctvom programu 635 00:52:27,250 --> 00:52:32,920 riadok po riadku, na rozdiel od spustenia programu znovu. 636 00:52:32,920 --> 00:52:35,520 Takže ak nechcete začať svoj program znovu a jednoducho pokračovať ďalej, 637 00:52:35,520 --> 00:52:41,970 môžete použiť príkaz continue a pokračovať bude spustite program až do konca. 638 00:52:41,970 --> 00:52:45,010 Rovnako ako to urobil tu. 639 00:52:45,010 --> 00:52:54,880 Avšak, keď som reštartovať program, CS50 skaly, to zasiahne moju zarážku znova, 640 00:52:54,880 --> 00:52:59,670 a tentoraz, keď nechcem, aby jednoducho ísť celú cestu cez zvyšok programu, 641 00:52:59,670 --> 00:53:08,040 Môžem použiť nasledujúci príkaz, ktorý som tiež skratka s n 642 00:53:08,040 --> 00:53:12,960 A to bude krok prostredníctvom programu riadok po riadku. 643 00:53:12,960 --> 00:53:17,530 , Takže môžete sledovať, ako sa veci vykonávať, ako zmeniť premenné, ako sa veci sa aktualizácie. 644 00:53:17,530 --> 00:53:21,550 Čo je celkom pekné. 645 00:53:21,550 --> 00:53:26,570 Druhá super vec je, skôr než opakovať rovnaký príkaz znova a znova a znova, 646 00:53:26,570 --> 00:53:30,670 ak ste jednoducho stlačiť Enter - tak tu vidíte, ja som napísal v ničom - 647 00:53:30,670 --> 00:53:33,780 keď som jednoducho stlačiť Enter, bude opakovať predchádzajúci príkaz, 648 00:53:33,780 --> 00:53:36,900 alebo predchádzajúci GDB príkaz, ktorý som dal dovnútra 649 00:53:36,900 --> 00:53:56,000 Môžem mať stlačení klávesu Enter a nechám krokovanie môj kód riadok po riadku. 650 00:53:56,000 --> 00:53:59,310 Chcel by som povzbudiť vy ísť pozrieť na ďalšie buggy programy rovnako. 651 00:53:59,310 --> 00:54:01,330 Nemáme čas sa dostať cez všetky z nich dnes v oddiele. 652 00:54:01,330 --> 00:54:05,890 Zdrojový kód je tam, takže môžete trochu vidieť, čo sa deje 653 00:54:05,890 --> 00:54:07,730 v zákulisí, ak vám naozaj prilepené, 654 00:54:07,730 --> 00:54:11,940 ale prinajmenšom, len cvičiť bootovanie GDB, 655 00:54:11,940 --> 00:54:13,940 spustenie programu, kým sa zlomí na vás, 656 00:54:13,940 --> 00:54:18,260 získanie backtrace, prísť na to, akú funkciu zrážka bola v, 657 00:54:18,260 --> 00:54:24,450 aký postoj to bolo na, tlač na niektoré hodnoty premenných, 658 00:54:24,450 --> 00:54:30,140 len tak budete mať pocit, pre to, pretože to bude naozaj pomôže do budúcnosti. 659 00:54:30,140 --> 00:54:36,340 V tomto bode, budeme ukončiť z GDB, ktorý sa pomocou skončiť, alebo len q. 660 00:54:36,340 --> 00:54:40,460 Ak váš program je uprostred behu stále, a to nie je ukončený, 661 00:54:40,460 --> 00:54:43,510 bude to vždy spýtať, "Ste si istí, že naozaj chcete skončiť?" 662 00:54:43,510 --> 00:54:48,770 Môžete stačí kliknúť áno. 663 00:54:48,770 --> 00:54:55,250 >> Teraz budeme pozerať na ďalší problém, ktorý máme, čo je mačka program. 664 00:54:55,250 --> 00:54:59,880 Ak sa budete pozerať krátky na presmerovanie a potrubia, uvidíte, že Tommy používa tento program 665 00:54:59,880 --> 00:55:07,540 že v podstate vytlačí všetky výstup súboru na obrazovku. 666 00:55:07,540 --> 00:55:12,660 Takže ak som bežať mačku, toto je vlastne vstavaný program spotrebiče, 667 00:55:12,660 --> 00:55:16,860 a ak budete mať Macintosha, môžete to urobiť na počítači Mac taky, ak si otvoríte terminál. 668 00:55:16,860 --> 00:55:25,630 A my - mačka, povedzme, cp.c, a stlačte klávesu Enter. 669 00:55:25,630 --> 00:55:29,640 Čo to urobili, keby sme posunúť hore trochu a pozrite sa, kde sme spustili linku, 670 00:55:29,640 --> 00:55:40,440 alebo tam, kde sme bežali príkazu cat, doslova len vytlačiť obsah cp.c našej obrazovke. 671 00:55:40,440 --> 00:55:44,140 Môžeme spustiť znovu a vy môžete dať do viacerých súborov dohromady. 672 00:55:44,140 --> 00:55:49,880 Takže si môžete urobiť mačacie cp.c, a potom môžeme tiež zreťaziť cat.c súbor, 673 00:55:49,880 --> 00:55:53,250 čo je program, chystáme písať, 674 00:55:53,250 --> 00:55:58,140 a to bude tlačiť na obe súbory späť k sebe do nášho obrazovku. 675 00:55:58,140 --> 00:56:05,490 Takže ak budeme pohybovať hore trochu, vidíme, že keď sme bežali túto mačka cp.c, cat.c, 676 00:56:05,490 --> 00:56:17,110 Najskôr to vytlačiť na cp súbor, a potom pod ním, to vytlačiť na cat.c súbor tu dole. 677 00:56:17,110 --> 00:56:19,650 Budeme používať toto len dostať naše nohy mokré. 678 00:56:19,650 --> 00:56:25,930 Pohrajte sa s jednoduchým potlačou na termináli, pozri, ako to funguje. 679 00:56:25,930 --> 00:56:39,170 Ak ste otvorení s gedit cat.c, Enter, 680 00:56:39,170 --> 00:56:43,760 môžete vidieť program, že sme o tom písať. 681 00:56:43,760 --> 00:56:48,980 Sme súčasťou toto pekné kotla dosku, takže nemusíte tráviť čas písať všetky tie von. 682 00:56:48,980 --> 00:56:52,310 Sme tiež skontrolovať počet argumentov odovzdaných palcov 683 00:56:52,310 --> 00:56:56,910 Sme vytlačiť pekné správu o použití. 684 00:56:56,910 --> 00:57:00,950 >> To je jedna z tých vecí, ktoré opäť, rovnako ako sme sa bavili, 685 00:57:00,950 --> 00:57:04,490 je to skoro ako svalovej pamäte. 686 00:57:04,490 --> 00:57:07,190 Len pamätajte, že robia rovnaký druh vecí 687 00:57:07,190 --> 00:57:11,310 a vždy vytlačiť nejaký užitočných správy 688 00:57:11,310 --> 00:57:17,670 tak, aby ľudia vedeli, ako spustiť svoj program. 689 00:57:17,670 --> 00:57:21,630 S mačkou, je to celkom jednoduché, my sme len ísť cez všetky rôzne argumenty 690 00:57:21,630 --> 00:57:24,300 , Ktoré boli odovzdané do nášho programu, a budeme tlačiť 691 00:57:24,300 --> 00:57:29,950 ich obsah na obrazovku po jednom. 692 00:57:29,950 --> 00:57:35,670 Ak chcete tlačiť súbory na obrazovku, budeme robiť niečo veľmi podobného 693 00:57:35,670 --> 00:57:38,120 čo sme na konci testu. 694 00:57:38,120 --> 00:57:45,350 Na konci kvízu, že najať programu, museli sme otvoriť súbor, 695 00:57:45,350 --> 00:57:48,490 a potom sme museli tlačiť. 696 00:57:48,490 --> 00:57:54,660 V tomto prípade, budeme otvoriť súbor, a budeme čítať z neho miesto. 697 00:57:54,660 --> 00:58:00,630 Potom budeme tlačiť, miesto do súboru, budeme tlačiť na obrazovku. 698 00:58:00,630 --> 00:58:05,830 Takže tlače na obrazovku, ktorú ste všetci urobil predtým s printf. 699 00:58:05,830 --> 00:58:08,290 Takže to nie je príliš bláznivé. 700 00:58:08,290 --> 00:58:12,190 Ale čítanie súboru je trochu divný. 701 00:58:12,190 --> 00:58:17,300 Prejdeme to trochu v čase. 702 00:58:17,300 --> 00:58:20,560 Ak ste sa vrátiť k poslednému problému na kvíz, problém 33, 703 00:58:20,560 --> 00:58:27,280 prvý riadok, ktorý budeme robiť tu, otvorenie súboru, je veľmi podobný tomu, čo sme robili tam. 704 00:58:27,280 --> 00:58:36,370 Takže Stella, čo robí, že riadok vyzerá takto, keď sme sa otvoriť súbor? 705 00:58:36,370 --> 00:58:47,510 [Stella] Capital FILE *, súbor - >> Dobre. >> - Je rovný fopen. Jo >>. 706 00:58:47,510 --> 00:58:55,980 Čo je v tomto prípade? Je to v komentári. 707 00:58:55,980 --> 00:59:06,930 >> Je to v komentári? ArGV [i] a r? 708 00:59:06,930 --> 00:59:11,300 Presne >>. Právo na. Takže Stella je úplne pravdu. 709 00:59:11,300 --> 00:59:13,720 To je to, čo linka vyzerá. 710 00:59:13,720 --> 00:59:19,670 Budeme si súbor prúd premenné, uložte ich do súboru *, takže všetky čiapky, 711 00:59:19,670 --> 00:59:25,720 FILE, *, a meno tejto premennej bude súbor. 712 00:59:25,720 --> 00:59:32,250 Sme mohli nazvať, čo sa nám páči. Mohli by sme hovoriť first_file, alebo file_i, čo sme chceli. 713 00:59:32,250 --> 00:59:37,590 A potom názov súboru bol prijatý v na príkazovom riadku k tomuto programu. 714 00:59:37,590 --> 00:59:44,450 Tak to sú uložené v ArGV [i,] a potom budeme tento súbor otvoriť v režime na čítanie. 715 00:59:44,450 --> 00:59:48,100 Teraz, keď sme otvorili súbor, čo je tá vec, že ​​musíme vždy pamätať na to 716 00:59:48,100 --> 00:59:52,230 keď sme otvorili súbor? Zatvorte ho. 717 00:59:52,230 --> 00:59:57,220 Tak Missy, ako sme zatvorenie súboru? 718 00:59:57,220 --> 01:00:01,020 [Missy] fclose (súbor) >> fclose (súbor). Presne tak. 719 01:00:01,020 --> 01:00:05,340 Great. Dobre. Ak sa pozrieme na to, aby to komentár tu, 720 01:00:05,340 --> 01:00:11,940 hovorí, "Open ArGV [i] a vytlačiť obsah na štandardný výstup." 721 01:00:11,940 --> 01:00:15,460 >> Štandardné out je divné meno. Stdout je len náš spôsob, ako povedať 722 01:00:15,460 --> 01:00:22,880 chceme tlačiť do terminálu, chceme vytlačiť na štandardné výstupný prúd. 723 01:00:22,880 --> 01:00:26,450 Môžeme skutočne zbaviť tento komentár tu. 724 01:00:26,450 --> 01:00:36,480 Budem skopírovať a vložiť ho pretože to je to, čo sme urobili. 725 01:00:36,480 --> 01:00:41,290 V tomto bode, teraz máme čítať súbor kúsok po kúsku. 726 01:00:41,290 --> 01:00:46,300 Sme diskutovali niekoľko spôsobov čítania súborov. 727 01:00:46,300 --> 01:00:51,830 Ktoré z nich sú vaše obľúbené tak ďaleko? 728 01:00:51,830 --> 01:00:57,960 Akými spôsobmi ste videli, alebo si pamätať, čítať? 729 01:00:57,960 --> 01:01:04,870 [Daniel] fread? >> Fread? Takže fread je jeden. Jimmy, viete nejaké ďalšie? 730 01:01:04,870 --> 01:01:12,150 [Jimmy] No >> Dobre. Nie. Charlotte? Alexander? Nejaké ďalšie? Dobre. 731 01:01:12,150 --> 01:01:20,740 Takže tie ostatné sú fgetc, je ten, ktorý budeme používať veľa. 732 01:01:20,740 --> 01:01:26,410 K dispozícii je tiež fscanf; vy vidieť vzor tu? 733 01:01:26,410 --> 01:01:29,170 Všetci začínajú s f Čokoľvek, čo robiť so súborom. 734 01:01:29,170 --> 01:01:35,260 Tam je fread, fgetc, fscanf. Toto sú všetky čítacích funkcií. 735 01:01:35,260 --> 01:01:49,120 Pre písanie máme fwrite, máme fputc miesto fgetc. 736 01:01:49,120 --> 01:01:58,250 Máme tiež fprintf ako sme videli na kvíz. 737 01:01:58,250 --> 01:02:01,680 Keďže sa jedná o problém, ktorý sa týka čítania zo súboru, 738 01:02:01,680 --> 01:02:04,940 budeme používať jeden z týchto troch funkcií. 739 01:02:04,940 --> 01:02:10,890 Nebudeme používať tieto funkcie tu dole. 740 01:02:10,890 --> 01:02:14,880 Tieto funkcie sú všetky nájdené v štandardnom I / O knižnice. 741 01:02:14,880 --> 01:02:17,510 Takže keď sa pozriete na hornej časti tohto programu, 742 01:02:17,510 --> 01:02:24,110 môžete vidieť, že sme už zahrnuté hlavičkový súbor pre štandardné I / O knižnice. 743 01:02:24,110 --> 01:02:27,120 Ak chceme zistiť, ktorý z nich chceme použiť, 744 01:02:27,120 --> 01:02:29,690 môžeme vždy otvoriť manuálové stránky. 745 01:02:29,690 --> 01:02:34,350 Takže môžeme písať man štádiách 746 01:02:34,350 --> 01:02:43,180 a prečítajte si všetko o štádiách vstupných a výstupných funkcií v C 747 01:02:43,180 --> 01:02:49,870 A už môžeme vidieť oh, pozri. Je to spomenúť fgetc, to spomenúť fputc. 748 01:02:49,870 --> 01:02:57,220 Takže môžete vŕtať sa trochu a pozrite sa na, povedzme, fgetc 749 01:02:57,220 --> 01:03:00,060 a pozrite sa na jeho manuálové stránke. 750 01:03:00,060 --> 01:03:03,430 Môžete vidieť, že to ide ruka v ruke s celou partiou ďalších funkcií: 751 01:03:03,430 --> 01:03:12,640 fgetc, fgets, getc, getchar, dostane, ungetc, a jeho vstupné postáv a reťazce. 752 01:03:12,640 --> 01:03:19,180 Tak to je, ako čítame v znakoch a reťazce zo súboru zo štandardného vstupu, 753 01:03:19,180 --> 01:03:21,990 ktorý je v podstate od užívateľa. 754 01:03:21,990 --> 01:03:24,780 A to je, ako to robíme v skutočnom C. 755 01:03:24,780 --> 01:03:30,850 Takže to nie je pomocou GetString a getchar funkcií 756 01:03:30,850 --> 01:03:36,840 že sme použili z CS50 knižnice. 757 01:03:36,840 --> 01:03:39,710 Budeme robiť tento problém v niekoľkými spôsobmi 758 01:03:39,710 --> 01:03:43,430 takže môžete vidieť dva rôzne spôsoby, ako robiť to. 759 01:03:43,430 --> 01:03:48,490 Ako fread funkcie, ktoré Daniel spomenul a fgetc sú dobré spôsoby, ako to urobiť. 760 01:03:48,490 --> 01:03:53,790 Myslím, že fgetc je trochu jednoduchšie, pretože je to len má, ako vidíte, 761 01:03:53,790 --> 01:03:59,660 jeden argument, súbor *, že sa snažíme čítať znak z, 762 01:03:59,660 --> 01:04:02,740 a jeho návratová hodnota je int. 763 01:04:02,740 --> 01:04:05,610 A to je trochu mätúce, že jo? 764 01:04:05,610 --> 01:04:11,450 >> Pretože sme stále charakter, tak prečo nie je tento návrat char? 765 01:04:11,450 --> 01:04:18,700 Vy máte nejaké nápady, prečo je toto nemusí vrátiť char? 766 01:04:18,700 --> 01:04:25,510 [Missy odpovede, nezrozumiteľné] >> Jo. Takže Missy je úplnú pravdu. 767 01:04:25,510 --> 01:04:31,570 Ak je to ASCII, potom celé číslo môže byť mapovaná na skutočné char. 768 01:04:31,570 --> 01:04:33,520 Mohlo by to byť ASCII znak, a to je pravda. 769 01:04:33,520 --> 01:04:36,220 To je presne to, čo sa deje. 770 01:04:36,220 --> 01:04:39,190 Používame int jednoducho preto, že má viac bitov. 771 01:04:39,190 --> 01:04:44,750 Je to väčšie ako char; naše char má iba 8 bitov, ktoré 1 byte na našich 32-bitových strojoch. 772 01:04:44,750 --> 01:04:48,520 A int má hodnotu všetkých 4 bytov "priestoru. 773 01:04:48,520 --> 01:04:50,940 A ukázalo sa, že spôsob, akým fgetc funguje, 774 01:04:50,940 --> 01:04:53,940 ak by sme posunúť nadol v našom prehľade v tejto manuálové stránke trochu, 775 01:04:53,940 --> 01:05:05,000 rolovať celú cestu dole. Ukazuje sa, že použitie tohto osobitného hodnotu s názvom EOF. 776 01:05:05,000 --> 01:05:09,640 Je to zvláštne konštantná ako návratová hodnota fgetc funkcie 777 01:05:09,640 --> 01:05:14,570 zakaždým, keď narazí na koniec súboru, alebo ak sa vyskytne chyba. 778 01:05:14,570 --> 01:05:18,170 A ukázalo sa, že robiť takéto porovnanie s EOF správne, 779 01:05:18,170 --> 01:05:24,060 Ak chcete mať extra množstvo informácií, ktoré máte v int 780 01:05:24,060 --> 01:05:28,420 na rozdiel od použitia char premenné. 781 01:05:28,420 --> 01:05:32,130 Aj keď fgetc je skutočne dostať znak zo súboru, 782 01:05:32,130 --> 01:05:38,450 si chcete zapamätať, že sa vracia niečo, čo je typu int na vás. 783 01:05:38,450 --> 01:05:41,360 To znamená, že je to celkom jednoduché. 784 01:05:41,360 --> 01:05:44,960 Je nám dá charakter, takže všetko, čo musíte urobiť, je stále pýtajú súbor, 785 01:05:44,960 --> 01:05:48,440 "Daj mi ďalší znak, daj mi ďalší znak, daj mi ďalší znak," 786 01:05:48,440 --> 01:05:51,400 kým sa na koniec súboru. 787 01:05:51,400 --> 01:05:54,730 A to bude ťahať v jednom znaku v dobe od nášho súboru, 788 01:05:54,730 --> 01:05:56,250 a potom môžeme robiť, čo chceme s ňou. 789 01:05:56,250 --> 01:06:00,160 Môžeme uložiť, môžeme pridať na reťazec, môžeme ju vytlačiť. 790 01:06:00,160 --> 01:06:04,630 Robiť nič z toho. 791 01:06:04,630 --> 01:06:09,600 >> Zväčšenie staré a ísť späť do nášho cat.c programu, 792 01:06:09,600 --> 01:06:16,170 ak budeme používať fgetc, 793 01:06:16,170 --> 01:06:21,710 ako by sme mohli pristupovať k tomuto ďalší riadok kódu? 794 01:06:21,710 --> 01:06:26,020 Budeme používať - ​​fread bude robiť niečo trochu iné. 795 01:06:26,020 --> 01:06:32,600 A tentoraz, sme len tak použiť fgetc dostať jeden znak v čase. 796 01:06:32,600 --> 01:06:40,910 Ak chcete spracovať celý súbor, možno to, čo máme robiť? 797 01:06:40,910 --> 01:06:44,030 Koľko znakov je tam v súbore? 798 01:06:44,030 --> 01:06:47,390 Existuje mnoho. Takže budete pravdepodobne chcieť, aby si jeden 799 01:06:47,390 --> 01:06:49,860 a potom sa ďalšie a získať ďalšie a získať ďalšie. 800 01:06:49,860 --> 01:06:53,330 Aký druh algoritmu si myslíš, že možno budeme musieť použiť tú? 801 01:06:53,330 --> 01:06:55,470 Aký typ -? [Alexander] pre sláčiky? Presne >>. 802 01:06:55,470 --> 01:06:57,500 Nejaký typ slučky. 803 01:06:57,500 --> 01:07:03,380 Pre slučky, je v skutočnosti veľký, v tomto prípade. 804 01:07:03,380 --> 01:07:08,620 A ako si hovoril, že to znie ako chcete slučku cez celý súbor, 805 01:07:08,620 --> 01:07:11,820 dostať po znakoch. 806 01:07:11,820 --> 01:07:13,850 Nejaké návrhy na to, čo by mohla vyzerať? 807 01:07:13,850 --> 01:07:22,090 [Alexander, nezrozumiteľným] 808 01:07:22,090 --> 01:07:30,050 Dobre >>, len mi povedz, v angličtine to, čo sa snažíte urobiť? [Alexander, nezrozumiteľným] 809 01:07:30,050 --> 01:07:36,270 Takže v tomto prípade, to znie, ako by sme len snažíte slučky cez celý súbor. 810 01:07:36,270 --> 01:07:45,330 [Alexander] Tak aj > Veľkosť -? 811 01:07:45,330 --> 01:07:49,290 Myslím, že veľkosť súboru, nie? Veľkosť - Dáme len napísať to takto. 812 01:07:49,290 --> 01:07:57,470 Veľkosť súboru pre bytie času, i + +. 813 01:07:57,470 --> 01:08:04,610 Tak to dopadá, že spôsob, akým to urobíte pomocou fgetc, a to je nové, 814 01:08:04,610 --> 01:08:10,460 je to, že neexistuje žiadny jednoduchý spôsob, ako len dostať veľkosť súboru 815 01:08:10,460 --> 01:08:16,979 s týmto "sizeof" typu konštrukcie, ktoré ste predtým nevideli. 816 01:08:16,979 --> 01:08:20,910 Keď použijeme túto fgetc funkciu, sme zavádza nejaký 817 01:08:20,910 --> 01:08:29,069 nové, funky syntax to pre sláčiky, kde namiesto použitia len základné počítadlo 818 01:08:29,069 --> 01:08:33,920 ísť znak po znaku, budeme ťahať jeden znak v čase, 819 01:08:33,920 --> 01:08:37,120 jeden znak v čase, a spôsob, akým my vieme, že sme na konci 820 01:08:37,120 --> 01:08:41,290 nie, keď sme napočítali určitý počet znakov, 821 01:08:41,290 --> 01:08:49,939 ale keď postava sa vytiahnuť, je, že osobitné koniec súboru znak. 822 01:08:49,939 --> 01:08:58,689 Tak sme to urobiť - ja ju nazývam túto ch, a budeme ju inicializovať 823 01:08:58,689 --> 01:09:08,050 s našou prvou výzvy, aby si prvý znak z súboru. 824 01:09:08,050 --> 01:09:14,979 Takže tejto časti priamo tu, to dostane znak z súboru 825 01:09:14,979 --> 01:09:20,840 a uložiť ho do premennej ch. 826 01:09:20,840 --> 01:09:25,420 Budeme to robiť tak dlho, kým sa dostaneme na koniec súboru, 827 01:09:25,420 --> 01:09:41,170 ktoré robíme pri testovaní na charaktere nesmie je rovná k tejto osobitnej povahe OSZ. 828 01:09:41,170 --> 01:09:48,750 A potom namiesto toho, aby robil ch + +, ktorý by len zvyšovať hodnotu, 829 01:09:48,750 --> 01:09:52,710 takže ak čítame o A von k súboru, kapitál, povedzme, 830 01:09:52,710 --> 01:09:56,810 ch + + by nám b, a potom by sme si C a potom d 831 01:09:56,810 --> 01:09:59,310 To zjavne nie je to, čo chceme. To, čo chceme tu 832 01:09:59,310 --> 01:10:05,830 v tomto poslednom bitu ich chceme získať ďalší znak zo súboru. 833 01:10:05,830 --> 01:10:09,500 >> Tak ako by sme mohli získať ďalší znak zo súboru? 834 01:10:09,500 --> 01:10:13,470 Ako sa dostať na prvý znak zo súboru? 835 01:10:13,470 --> 01:10:17,200 [Študent] fgetfile? >> Fgetc, alebo, je mi ľúto, že si úplnú pravdu. 836 01:10:17,200 --> 01:10:20,470 Aj chybne to tam. Tak jo. 837 01:10:20,470 --> 01:10:26,240 Tu miesto uskutočňovania ch + +, 838 01:10:26,240 --> 01:10:29,560 sme len tak zavolať fgetc (súbor) znovu 839 01:10:29,560 --> 01:10:39,180 a uložiť výsledok v našej rovnakom ch premenné. 840 01:10:39,180 --> 01:10:43,730 [Študent otázka, nezrozumiteľným] 841 01:10:43,730 --> 01:10:52,390 >> To je miesto, kde títo ľudia súbor * sú zvláštne. 842 01:10:52,390 --> 01:10:59,070 Spôsob ich práce je, že - pri prvom otvorení - pri prvom robiť, že fopen volanie, 843 01:10:59,070 --> 01:11:04,260 FILE * účinne slúži ako ukazovateľ na začiatok súboru. 844 01:11:04,260 --> 01:11:12,830 A potom zakaždým, keď volanie fgetc, to sa pohybuje jeden znak v súbore. 845 01:11:12,830 --> 01:11:23,280 Takže zakaždým, keď hovoríš, že ste zvyšovanie ukazovateľ súboru o jeden znak. 846 01:11:23,280 --> 01:11:26,210 A keď fgetc znova, sa sťahujete to iný charakter 847 01:11:26,210 --> 01:11:28,910 a iný charakter a iný charakter a iný znak. 848 01:11:28,910 --> 01:11:32,030 [Študent otázka, nezrozumiteľné] >> A to je - áno. 849 01:11:32,030 --> 01:11:34,810 Je to druh tejto mágie pod kapotou. 850 01:11:34,810 --> 01:11:37,930 Stačí držať zvyšovanie prostredníctvom. 851 01:11:37,930 --> 01:11:46,510 V tomto bode, ste schopní skutočne pracovať s charakterom. 852 01:11:46,510 --> 01:11:52,150 Tak ako by sme mohli vytlačiť na obrazovku, teraz? 853 01:11:52,150 --> 01:11:58,340 Môžeme použiť rovnaký printf vec, ktorú sme použili predtým. 854 01:11:58,340 --> 01:12:00,330 To sme boli s využitím všetkých semester. 855 01:12:00,330 --> 01:12:05,450 Môžeme zavolať printf, 856 01:12:05,450 --> 01:12:21,300 a môžeme odovzdať v charakteru, rovnako ako to. 857 01:12:21,300 --> 01:12:27,430 Ďalším spôsobom, ako to urobiť, je skôr než pomocou printf a majú čo do činenia tento formát reťazca, 858 01:12:27,430 --> 01:12:29,490 môžeme tiež použiť jeden z ďalších funkcií. 859 01:12:29,490 --> 01:12:40,090 Môžeme použiť fputc, ktorá tlačí znak na obrazovke, 860 01:12:40,090 --> 01:12:52,580 s výnimkou, ak sa pozrieme na fputc - dovoľte mi vzdialite trochu. 861 01:12:52,580 --> 01:12:56,430 Vidíme to, čo je pekné, je to má v povahe, že čítame s použitím fgetc, 862 01:12:56,430 --> 01:13:05,100 ale potom musíme dať jej prúd sa bude tlačiť. 863 01:13:05,100 --> 01:13:11,850 Môžeme tiež použiť putchar funkciu, ktorá bude klásť priamo na štandardný výstup. 864 01:13:11,850 --> 01:13:16,070 Takže tam sú celá partia rôznych možností, ktoré môžeme použiť pre tlač. 865 01:13:16,070 --> 01:13:19,580 Všetci sú v štandardnom I / O knižnice. 866 01:13:19,580 --> 01:13:25,150 Kedykoľvek budete chcieť vytlačiť - to printf, v predvolenom nastavení, bude tlačiť na špeciálny normy von prúdu, 867 01:13:25,150 --> 01:13:27,910 ktorý je, že stdout. 868 01:13:27,910 --> 01:13:41,300 Takže môžeme len odkazovať sa na to ako druh tohto kúzelného hodnoty, stdout tu. 869 01:13:41,300 --> 01:13:48,410 Chybička sa vlúdila. Dajte bodkočiarku mimo. 870 01:13:48,410 --> 01:13:52,790 >> To je veľa nových, funky informácií tu. 871 01:13:52,790 --> 01:13:58,600 Mnoho z toho je veľmi pozostáva z ustálených spojení, v tom zmysle, že je to kód 872 01:13:58,600 --> 01:14:05,700 , Ktorý je písaný táto cesta len preto, že je to čistý čítať, ľahko čitateľný. 873 01:14:05,700 --> 01:14:11,520 Existuje mnoho rôznych spôsobov, ako to urobiť, veľa rôznych funkcií, ktoré môžete použiť, 874 01:14:11,520 --> 01:14:14,680 ale máme tendenciu postupujte podľa nasledujúcich rovnaké vzorce znova a znova. 875 01:14:14,680 --> 01:14:20,180 Takže nebuďte prekvapení, keď uvidíte kód, ako to prichádza znovu a znovu. 876 01:14:20,180 --> 01:14:25,690 Dobrá. V tomto bode, musíme zlomiť na deň. 877 01:14:25,690 --> 01:14:31,300 Vďaka za že ste prišli. Vďaka za sledovanie, ak ste on-line. A uvidíme sa budúci týždeň. 878 01:14:31,300 --> 01:14:33,890 [CS50.TV]