1 00:00:00,000 --> 00:00:02,730 [Powered by Google Translate] [ODDÍL 5: méně 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 vítej zpět, kluci. 5 00:00:11,690 --> 00:00:16,320 Vítejte v sekci 5. 6 00:00:16,320 --> 00:00:20,220 V tomto bodě, mít dokončil kvíz 0 a když byla svědkem, jak jsi udělal, 7 00:00:20,220 --> 00:00:25,770 doufejme, že budete cítit opravdu dobře, protože jsem byl velmi zaujatý skóre v této sekci. 8 00:00:25,770 --> 00:00:28,050 Pro naše on-line diváky, měli jsme pár otázek 9 00:00:28,050 --> 00:00:33,680 o posledních dvou problémů na problém souboru - nebo na testu, ale. 10 00:00:33,680 --> 00:00:39,690 Takže jsme jít přes ty opravdu rychle, takže každý vidí, co se stalo 11 00:00:39,690 --> 00:00:45,060 a jak projít skutečné řešení, spíše než jen prohlížení řešení sám. 12 00:00:45,060 --> 00:00:50,330 Budeme jít za posledních pár problémů opravdu rychle, 32 a 33. 13 00:00:50,330 --> 00:00:53,240 Jen opět, může tak, že on-line diváci vidět. 14 00:00:53,240 --> 00:00:59,080 >> Pokud se obrátíte na vašeho problému 32, který je na straně 13, 15 00:00:59,080 --> 00:01:02,730 13 z 16, problém 32 je o swapů. 16 00:01:02,730 --> 00:01:05,010 Bylo to všechno o výměně dvě celá čísla. 17 00:01:05,010 --> 00:01:08,740 Je to problém, který jsme si už za pár časů v přednášce. 18 00:01:08,740 --> 00:01:13,590 A tady, co jsme se ptali vás udělat, je rychle paměťová stopa. 19 00:01:13,590 --> 00:01:17,000 Chcete-li vyplnit v hodnotách proměnných tak, jak jsou ve frontě 20 00:01:17,000 --> 00:01:20,250 jako kód prochází tímto odkládací funkci. 21 00:01:20,250 --> 00:01:24,500 Zejména, co se díváme na - Jdu dát tuto iPad dolů - 22 00:01:24,500 --> 00:01:29,650 zejména, co se díváme na to je řada číslovány 6 právě zde. 23 00:01:29,650 --> 00:01:36,740 A to očíslovány 6 jen za kontinuitu s předchozím problémem. 24 00:01:36,740 --> 00:01:41,720 To, co chceme udělat, je zobrazit nebo označit stav paměti 25 00:01:41,720 --> 00:01:46,090 jak je to v době, kdy se provedení tohoto řádku číslo 6, 26 00:01:46,090 --> 00:01:52,540 který je účinně návratu z naší odkládací funkci tady. 27 00:01:52,540 --> 00:01:59,450 Pokud bychom posunout dolů tady, jsme viděli, že adresy vše v paměti byla poskytnuta pro nás. 28 00:01:59,450 --> 00:02:02,540 To je velmi klíčový, budeme se k ní vrátí za chvíli. 29 00:02:02,540 --> 00:02:09,240 A pak tady dole na dně, jsme měli trochu paměti diagram, který budeme odkazovat. 30 00:02:09,240 --> 00:02:12,490 Jsem vlastně udělal se na mé IPAD. 31 00:02:12,490 --> 00:02:20,720 Takže budu střídat tam a zpět mezi iPad a tento kód jen pro referenci. 32 00:02:20,720 --> 00:02:26,540 >> Pojďme začít. Za prvé, pojďme zaměřit na prvních pár řádků hlavního tady. 33 00:02:26,540 --> 00:02:30,220 Chcete-li začít, budeme inicializovat x na 1 a Y 2. 34 00:02:30,220 --> 00:02:33,040 Takže máme dvě celočíselné proměnné, oni oba bude umístěn na zásobníku. 35 00:02:33,040 --> 00:02:36,050 Budeme dát 1 a 2 v nich. 36 00:02:36,050 --> 00:02:43,150 Takže když jsem otočit k mému iPad, doufejme, uvidíme - 37 00:02:43,150 --> 00:02:48,660 Apple TV zrcadlení, a tam jdeme. Dobře. 38 00:02:48,660 --> 00:02:51,670 Takže když jsem otočit k mému iPad, 39 00:02:51,670 --> 00:02:56,220 Chci inicializovat x na 1 a Y 2. 40 00:02:56,220 --> 00:03:00,580 Děláme to jednoduše tím, že píše 1 do pole označeného x 41 00:03:00,580 --> 00:03:07,730 a 2 v poli označeny y. Poměrně jednoduché. 42 00:03:07,730 --> 00:03:11,620 Takže teď se vraťme k notebooku, uvidíme, co se bude dít dál. 43 00:03:11,620 --> 00:03:15,810 Takže to další řádek je místo, kde se věci složitější. 44 00:03:15,810 --> 00:03:28,110 Míjíme adresu X a adresu y jako parametry a a b na odkládací funkci. 45 00:03:28,110 --> 00:03:32,380 Adresa x a adresou y jsou věci, které nemůžeme vypočítat 46 00:03:32,380 --> 00:03:36,360 aniž by odkázal na tyto bodech tady dole. 47 00:03:36,360 --> 00:03:39,750 A naštěstí, první dvě odrážky nám přesně to, co jsou odpovědi. 48 00:03:39,750 --> 00:03:44,740 Adresa 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 jsou hodnoty, které se dostanou předána jako a, b až nahoru v naší virtuální funkce. 50 00:03:51,870 --> 00:04:00,760 Takže znovu, přepnutí zpět do našeho schématu, mohu napsat 10 v 51 00:04:00,760 --> 00:04:07,400 a 14 v b.. 52 00:04:07,400 --> 00:04:11,610 Nyní, tento bod je místo, kde budeme pokračovat s swapu. 53 00:04:11,610 --> 00:04:14,520 Tak obracející zpět k přenosnému počítači znovu, 54 00:04:14,520 --> 00:04:21,079 vidíme, že způsob, jakým funguje, je odkládací jsem se poprvé dereference a obchod výsledkem tmp. 55 00:04:21,079 --> 00:04:27,650 Takže dereference operátor říká, "Hey. Dopřejte obsah proměnné jako adresa. 56 00:04:27,650 --> 00:04:33,830 Přejít na vše, co je uloženo na této adrese, a tak jej nahraje. " 57 00:04:33,830 --> 00:04:41,720 Co načíst z proměnné se bude uložen do našeho tmp proměnné. 58 00:04:41,720 --> 00:04:45,150 Přehodit zpět na iPad. 59 00:04:45,150 --> 00:04:51,690 Pokud půjdeme řešit 10, víme, že adresa 10 je proměnná x 60 00:04:51,690 --> 00:04:55,480 protože nám bylo řečeno, náš odrážky, že adresa x v paměti je 10. 61 00:04:55,480 --> 00:05:00,180 Takže můžeme jít tam, získat hodnotu toho, který je 1, jak je vidíme na naší iPad, 62 00:05:00,180 --> 00:05:06,300 a nahrát to do tmp. 63 00:05:06,300 --> 00:05:08,250 Opět, toto není konečné obsah. 64 00:05:08,250 --> 00:05:14,350 Budeme procházet a my Vás budeme do našeho konečného stavu programu na konci. 65 00:05:14,350 --> 00:05:17,210 Ale teď, máme hodnotu 1 uložené v tmp. 66 00:05:17,210 --> 00:05:19,210 >> A je tu rychlý dotaz tady. 67 00:05:19,210 --> 00:05:23,980 [Alexander] Je dereference provozovatel - to je jen hvězda přímo před proměnné? 68 00:05:23,980 --> 00:05:27,600 Ano >>. Takže dereference provozovatel, jak jsme otočit zpět do našeho notebooku znovu, 69 00:05:27,600 --> 00:05:33,780 Je to hvězda přímo před hotelem. 70 00:05:33,780 --> 00:05:37,460 V tomto smyslu, to je - kontrastovat s operátorem násobení 71 00:05:37,460 --> 00:05:42,400 které vyžaduje dvě věci, přičemž dereference operátor je unární operátor. 72 00:05:42,400 --> 00:05:46,130 Jen aplikován na jedné hodnoty na rozdíl od binárního operátoru, 73 00:05:46,130 --> 00:05:48,810 kde se vztahují na dvou různých hodnot. 74 00:05:48,810 --> 00:05:52,080 Takže to je to, co se děje v tomto řádku. 75 00:05:52,080 --> 00:05:58,390 Naložili jsme hodnotu 1 a uloženy do naší dočasné celočíselné proměnné. 76 00:05:58,390 --> 00:06:05,800 Na další řádek, uložíme obsah B do - 77 00:06:05,800 --> 00:06:12,630 nebo spíše, uložíme obsah, který b ukazuje na do místa, kde se ukazuje. 78 00:06:12,630 --> 00:06:17,690 Analyzujeme-li tento zprava doleva, budeme dereference b, 79 00:06:17,690 --> 00:06:23,580 budeme řešit 14, budeme chytit celé číslo, které je tam, 80 00:06:23,580 --> 00:06:26,900 a pak jsme se jít na adresu 10, 81 00:06:26,900 --> 00:06:34,240 a budeme házet výsledek naší dereference z B do tohoto prostoru. 82 00:06:34,240 --> 00:06:40,080 Přehodit zpět k našemu iPad, kde můžeme udělat to trochu konkrétnější, 83 00:06:40,080 --> 00:06:44,070 to by mohlo pomoci, když napíšu čísla na všechny adresy zde. 84 00:06:44,070 --> 00:06:53,820 Takže víme, že v y, jsme na adrese 14, x je na adrese 10. 85 00:06:53,820 --> 00:07:00,180 Když začneme u b, jsme dereference b, budeme chytit hodnotu 2. 86 00:07:00,180 --> 00:07:08,320 Budeme se chytit tuto hodnotu, protože to je hodnota, která žije na adrese 14. 87 00:07:08,320 --> 00:07:15,700 A budeme dávat to do proměnné, která žije na adrese 10, 88 00:07:15,700 --> 00:07:19,160 který je tady, odpovídající našim proměnné x. 89 00:07:19,160 --> 00:07:21,810 Takže můžeme udělat trochu přepsání zde 90 00:07:21,810 --> 00:07:35,380 kde jsme se zbavit našeho 1 a místo toho jsme napsat 2. 91 00:07:35,380 --> 00:07:39,560 Takže všechno je v pořádku a dobře na světě, i když máme přepisováno X nyní. 92 00:07:39,560 --> 00:07:44,890 Máme uloženy x starou hodnotu v našem tmp proměnné. 93 00:07:44,890 --> 00:07:50,210 Takže můžeme dokončit swapu s dalším řádkem. 94 00:07:50,210 --> 00:07:53,030 Přehodit zpět k našemu notebooku. 95 00:07:53,030 --> 00:07:58,150 Nyní vše, co zbývá, je, aby se obsah z našeho dočasného celočíselné proměnné 96 00:07:58,150 --> 00:08:05,630 a uložit je do proměnné, která žije na adresu, která b drží. 97 00:08:05,630 --> 00:08:10,230 Takže budeme účinně dereference b získat přístup k proměnné 98 00:08:10,230 --> 00:08:14,340 , který je na adrese, b drží v něm, 99 00:08:14,340 --> 00:08:19,190 a budeme se nacpat hodnotu, která tmp drží do něj. 100 00:08:19,190 --> 00:08:23,280 Přehodit zpět na iPad ještě jednou. 101 00:08:23,280 --> 00:08:31,290 Mohu vymazat tuto hodnotu zde, 2, 102 00:08:31,290 --> 00:08:41,010 a místo toho budeme kopírovat 1 právo do něj. 103 00:08:41,010 --> 00:08:43,059 Pak další řádek, který provádí, samozřejmě - 104 00:08:43,059 --> 00:08:47,150 pokud bychom otočit zpět do notebooku - je to bod 6, 105 00:08:47,150 --> 00:08:52,500 což je bod, ve kterém jsme chtěli, aby naše schéma zcela vyplněny. 106 00:08:52,500 --> 00:08:58,940 Tak mizerný zpět na iPad ještě jednou, jen tak můžete vidět dokončenou diagram, 107 00:08:58,940 --> 00:09:06,610 můžete vidět, že máme 10 v, 14 v B, 1 ve tmp, 2 v X, a 1 v y. 108 00:09:06,610 --> 00:09:11,000 Jsou nějaké otázky ohledně tohoto? 109 00:09:11,000 --> 00:09:14,640 Dává to větší smysl, když šel přes něj? 110 00:09:14,640 --> 00:09:24,850 Udělejte menší smysl? Doufejme, že ne. Dobře. 111 00:09:24,850 --> 00:09:28,230 >> Ukazatele jsou velmi ošidné téma. 112 00:09:28,230 --> 00:09:33,420 Jeden z kluků, se kterými spolupracujeme má velmi časté rčení: 113 00:09:33,420 --> 00:09:36,590 "Abychom pochopili ukazatele, musíte nejprve pochopit ukazatele." 114 00:09:36,590 --> 00:09:40,530 Což myslím, že je to pravda. To dělá to chvíli trvat zvyknout si na to. 115 00:09:40,530 --> 00:09:45,360 Kreslení spoustu obrázků, losování paměťových diagramů, jako je tento jsou velmi užitečné, 116 00:09:45,360 --> 00:09:49,480 a poté, co projdete například po například po příkladu, 117 00:09:49,480 --> 00:09:54,450 to začnu dělat něco větší smysl a trochu víc rozum a trochu větší smysl. 118 00:09:54,450 --> 00:10:01,560 A konečně, jeden den, budete mít vše úplně zvládl. 119 00:10:01,560 --> 00:10:13,800 Jakékoliv otázky dříve než přejdeme k dalšímu problému? Dobrá. 120 00:10:13,800 --> 00:10:18,840 Takže otočit zpět do notebooku. 121 00:10:18,840 --> 00:10:23,300 Další problém, který máme, je problém číslo 33 na soubor I / O. 122 00:10:23,300 --> 00:10:26,350 Zvětšení na tomto trochu. 123 00:10:26,350 --> 00:10:28,710 Problém 33 - Ano? 124 00:10:28,710 --> 00:10:32,110 >> [Daniel] jsem měl rychlou otázku. Tato hvězda, nebo hvězdička, 125 00:10:32,110 --> 00:10:35,590 je to tzv. dereferencing při použití hvězdičku před. 126 00:10:35,590 --> 00:10:38,820 Jak se to jmenuje, když použijete ampersand předtím? 127 00:10:38,820 --> 00:10:43,140 >> Znak ampersand dříve, než je adresa-provozovatele. 128 00:10:43,140 --> 00:10:45,880 Takže pojďme se posunout zpět. 129 00:10:45,880 --> 00:10:49,310 Chybička se vloudila. Jsem v režimu zoom, takže nemůžu opravdu scroll. 130 00:10:49,310 --> 00:10:52,780 Podíváme-li se na tento kód opravdu rychle přímo zde, 131 00:10:52,780 --> 00:10:54,980 znovu, to samé se děje. 132 00:10:54,980 --> 00:10:59,180 Podíváme-li se na tento kód přímo tady, na tomto řádku, kde děláme volání vyměnit, 133 00:10:59,180 --> 00:11:10,460 ampersand jen říká "dostat adresu, na které proměnné x životy." 134 00:11:10,460 --> 00:11:14,460 Když váš kompilátor kompiluje kód, 135 00:11:14,460 --> 00:11:20,590 má skutečně fyzicky vytýčit místo v paměti pro všechny vaše proměnných žijí. 136 00:11:20,590 --> 00:11:24,910 A tak to, co může kompilátor pak dělat, když je to sestavují všechno, 137 00:11:24,910 --> 00:11:31,110 to ví, "Oh, jsem dal x na adrese 10. jsem dal Y na adrese 14." 138 00:11:31,110 --> 00:11:34,640 To pak může vyplnit tyto hodnoty pro vás. 139 00:11:34,640 --> 00:11:44,740 Takže si pak můžete - to pak předat to v průchodu a & y v i. 140 00:11:44,740 --> 00:11:50,730 Tihle kluci si adresu, ale také, když je předávat do odkládací funkce, 141 00:11:50,730 --> 00:11:55,690 tento typ informací, to int * tady, říká kompilátoru, 142 00:11:55,690 --> 00:12:01,350 "Dobře, budeme se výkladu tuto adresu jako adresu celočíselné proměnné." 143 00:12:01,350 --> 00:12:05,900 Jako adresu int, která je odlišná od adresy proměnné znak 144 00:12:05,900 --> 00:12:09,930 protože int zabírá, na 32-bit stroje, zabírá 4 bajty prostoru, 145 00:12:09,930 --> 00:12:13,310 vzhledem k tomu, postava pouze přebírá 1 bajt prostoru. 146 00:12:13,310 --> 00:12:17,310 Takže je to důležité vědět i to, co je - to, co žije, jaký typ hodnoty 147 00:12:17,310 --> 00:12:20,340 žije na adresu, kterou dostal prošla dovnitř 148 00:12:20,340 --> 00:12:22,020 Nebo adresu, kterou co do činění. 149 00:12:22,020 --> 00:12:29,020 Tak, víte, kolik bytů informací skutečně načíst z paměti RAM. 150 00:12:29,020 --> 00:12:31,780 A pak, ano, to dereference operátor, jako vy jste se ptal, 151 00:12:31,780 --> 00:12:37,200 jde a přistupuje k informacím na konkrétní adresu. 152 00:12:37,200 --> 00:12:42,820 Tak to říká, s tímto proměnnou zde, léčit obsah jako adresa, 153 00:12:42,820 --> 00:12:47,880 přejít na tuto adresu, a vytáhnout, vložte do procesoru, zatížení do registru 154 00:12:47,880 --> 00:12:56,340 skutečné hodnoty nebo obsah, které žijí na této adrese. 155 00:12:56,340 --> 00:12:59,620 Nějaké další otázky? To jsou dobré otázky. 156 00:12:59,620 --> 00:13:01,650 Je to hodně nové terminologie příliš. 157 00:13:01,650 --> 00:13:09,800 Je to také trochu funky, vidět a a * na různých místech. 158 00:13:09,800 --> 00:13:13,180 >> Dobrá. 159 00:13:13,180 --> 00:13:18,530 Takže zpět k problému 33, soubor I / O. 160 00:13:18,530 --> 00:13:22,540 To byl jeden z těch problémů, které si myslím, že pár věcí se stalo. 161 00:13:22,540 --> 00:13:25,400 Jeden, že je to docela nové téma. 162 00:13:25,400 --> 00:13:30,590 To byl předložen brzy před kvízu, 163 00:13:30,590 --> 00:13:33,400 a pak jsem, že to bylo něco jako jeden z těch slovních úloh v matematice 164 00:13:33,400 --> 00:13:39,720 kde vám spoustu informací, ale ve skutečnosti nechcete skončit museli použít spoustu ní. 165 00:13:39,720 --> 00:13:44,060 První část tohoto problému popisuje, co soubor CSV je. 166 00:13:44,060 --> 00:13:50,620 Nyní, CSV souboru, podle popisu, je oddělený čárkami hodnoty souboru. 167 00:13:50,620 --> 00:13:55,300 Důvodem jsou vůbec zajímavé, a důvod, proč se někdy použít, 168 00:13:55,300 --> 00:14:00,800 je, protože, jak mnozí z vás někdy používají věci, jako je Excel? 169 00:14:00,800 --> 00:14:03,240 Obrázek většina z vás, pravděpodobně bude nebo použití při určitém okamžiku svého života. 170 00:14:03,240 --> 00:14:06,430 Budete používat něco jako Excel. 171 00:14:06,430 --> 00:14:10,940 S cílem získat data z tabulky aplikace Excel nebo dělat nějaký druh zpracování s ním, 172 00:14:10,940 --> 00:14:17,240 pokud byste chtěli napsat program v jazyce C nebo Python program, Java programu, 173 00:14:17,240 --> 00:14:20,070 vypořádat se s daty jste uložili tam, 174 00:14:20,070 --> 00:14:23,170 jedním z nejčastějších způsobů, jak dostat to je v souboru CSV. 175 00:14:23,170 --> 00:14:26,850 A můžete otevřít Excel a když jdete na "Uložit jako" dialog, 176 00:14:26,850 --> 00:14:32,840 se můžete dostat ven skutečný soubor CSV. 177 00:14:32,840 --> 00:14:35,890 >> Handy vědět, jak se vypořádat s těmito věcmi. 178 00:14:35,890 --> 00:14:42,010 Funguje to tak, že je to podobné - myslím, že to v podstatě napodobování tabulky, 179 00:14:42,010 --> 00:14:47,590 kde, jak vidíme zde, ve velmi nejvíce nalevo kus, 180 00:14:47,590 --> 00:14:49,910 máme všechny poslední názvy. 181 00:14:49,910 --> 00:14:54,670 Takže máme Malan, pak Hardison, a pak Bowden, MacWilliam, a pak Chan. 182 00:14:54,670 --> 00:14:59,470 Všechny poslední jména. A pak čárka odděluje příjmení z křestních jmen. 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ždycky jsem smíchat Robby a Toma. 185 00:15:06,850 --> 00:15:10,940 A pak, konečně, třetí sloupec e-mailové adresy. 186 00:15:10,940 --> 00:15:18,500 Jakmile pochopíte, že zbytek programu je poměrně jednoduché implementovat. 187 00:15:18,500 --> 00:15:23,850 Co jsme udělali, aby se napodobit stejný strukturu v našem programu C 188 00:15:23,850 --> 00:15:27,510 je, že jsme použili strukturu. 189 00:15:27,510 --> 00:15:30,520 Začneme hrát s nimi trochu více stejně. 190 00:15:30,520 --> 00:15:35,790 Viděli jsme je na první trochu v problému sadě 3, když jsme byli zabývající se slovníky. 191 00:15:35,790 --> 00:15:40,290 Ale tento personál struct ukládá příjmení, křestní jméno, a e-mail. 192 00:15:40,290 --> 00:15:44,500 Stejně jako náš soubor CSV byl skladování. 193 00:15:44,500 --> 00:15:47,950 Takže je to jen konverze z jednoho formátu do druhého. 194 00:15:47,950 --> 00:15:54,630 Máme převést, v tomto případě, je personál struct do linky, 195 00:15:54,630 --> 00:15:59,060 oddělený čárkami line, stejně jako to. 196 00:15:59,060 --> 00:16:01,500 Dává to smysl? Vy všichni vzít kvíz, 197 00:16:01,500 --> 00:16:07,680 tak jsem si představit, že máte alespoň nějaký čas na přemýšlení o tom. 198 00:16:07,680 --> 00:16:16,410 >> V pronájmu funkci, problém nás žádá, abychom se v - Dáme snímku v tomto trochu - 199 00:16:16,410 --> 00:16:22,480 se v personálu struktury, personálu struct, s jméno s, 200 00:16:22,480 --> 00:16:30,900 a připojit jeho obsah do našeho souboru staff.csv. 201 00:16:30,900 --> 00:16:34,230 Ukazuje se, že je to docela jednoduché použití. 202 00:16:34,230 --> 00:16:37,430 Budeme trochu pohrát s těmito funkcemi trochu více dnes. 203 00:16:37,430 --> 00:16:44,510 Avšak v tomto případě, fprintf funkce je skutečně klíčem. 204 00:16:44,510 --> 00:16:51,960 Takže s fprintf, můžeme tisknout, stejně jako vy byly pomocí printf celý tento termín. 205 00:16:51,960 --> 00:16:55,050 Můžete printf řádek do souboru. 206 00:16:55,050 --> 00:16:59,030 Takže místo toho, aby prostě dělat obvyklé printf hovor, kde si dát formátovací řetězec 207 00:16:59,030 --> 00:17:05,380 a pak nahradit všechny proměnné s následujícími argumenty, 208 00:17:05,380 --> 00:17:11,290 s fprintf, vaše první argument je místo toho soubor, který chcete napsat. 209 00:17:11,290 --> 00:17:21,170 Pokud bychom se podívali na to v zařízení, například, člověk fprintf, 210 00:17:21,170 --> 00:17:25,980 můžeme vidět rozdíl mezi printf a fprintf. 211 00:17:25,980 --> 00:17:28,960 Budu přiblížit tady trochu. 212 00:17:28,960 --> 00:17:33,140 Takže s printf, dáme formátovací řetězec, a pak následující argumenty 213 00:17:33,140 --> 00:17:37,580 jsou všechny proměnné pro výměnu nebo nahrazení do našeho formátu řetězce. 214 00:17:37,580 --> 00:17:47,310 Vzhledem k tomu, s fprintf, první argument je skutečně tento soubor * nazývá potok. 215 00:17:47,310 --> 00:17:51,800 >> Přesun zpět sem do našeho pronájmu, 216 00:17:51,800 --> 00:17:54,550 jsme již dostali náš soubor * otevřený stream pro nás. 217 00:17:54,550 --> 00:17:57,810 To je to, co tento první linka dělá, že otevře soubor staff.csv, 218 00:17:57,810 --> 00:18:01,690 se otevře v režimu append, a vše, co zbylo pro nás udělat, je 219 00:18:01,690 --> 00:18:08,640 napsat zaměstnanců strukturu do souboru. 220 00:18:08,640 --> 00:18:10,870 A uvidíme, nechci používat iPad? 221 00:18:10,870 --> 00:18:17,900 Budu používat iPad. Máme za neplatné - pojďme dát to na stůl, takže můžu napsat trochu lépe - 222 00:18:17,900 --> 00:18:33,680 neplatnost kol a trvá do jednoho argumentu, má personál strukturu nazvanou s. 223 00:18:33,680 --> 00:18:44,120 Mám naše rovnátka, máme náš soubor * s názvem souboru, 224 00:18:44,120 --> 00:18:48,380 máme fopen linku které jste nám poskytli, 225 00:18:48,380 --> 00:18:51,890 a já budu jen psát jako tečky, protože je již v pedia. 226 00:18:51,890 --> 00:19:00,530 A pak na naše další řádek, budeme-li volat do fprintf 227 00:19:00,530 --> 00:19:03,700 a budeme procházet v souboru, který chceme tisknout, 228 00:19:03,700 --> 00:19:10,290 a pak se naše formátovací řetězec, který - 229 00:19:10,290 --> 00:19:14,300 Nechám jste mi říct, jak to vypadá. 230 00:19:14,300 --> 00:19:20,500 Jak o vás, Stella? Víte, co první část formátovacího řetězce vypadá? 231 00:19:20,500 --> 00:19:24,270 [Stella] Nejsem si jistý. >> Nebojte se zeptat na Jimmyho. 232 00:19:24,270 --> 00:19:27,690 Víte, Jimmy? 233 00:19:27,690 --> 00:19:31,000 [Jimmy] Bylo by to prostě být poslední? Nevím. Nejsem si úplně jistý. 234 00:19:31,000 --> 00:19:39,020 Dobře >>. Jak o tom, to někdo si to správně na zkoušku? 235 00:19:39,020 --> 00:19:41,770 Ne pořádku. 236 00:19:41,770 --> 00:19:47,920 Ukazuje se, že tady všechno, co musíme udělat, je chceme každou část našeho personálu struktury 237 00:19:47,920 --> 00:19:53,290 které mají být vytištěny jako řetězec do našeho souboru. 238 00:19:53,290 --> 00:19:59,900 Právě jsme použít řetězec substituční znaku tři různé časy, protože máme příjmení 239 00:19:59,900 --> 00:20:07,160 následuje čárka, pak jméno následovaný čárkou, 240 00:20:07,160 --> 00:20:12,430 a pak konečně adresa, která následuje - což není 241 00:20:12,430 --> 00:20:15,140 montáž na mé obrazovce - ale je to následuje znakem nového řádku. 242 00:20:15,140 --> 00:20:20,060 Takže budu psát to jen tam. 243 00:20:20,060 --> 00:20:23,560 A pak po naší formátovací řetězec, 244 00:20:23,560 --> 00:20:27,880 prostě mají náhrady, které jsme přístup pomocí tečkové notace 245 00:20:27,880 --> 00:20:31,370 kterou jsme viděli v problému sadě 3. 246 00:20:31,370 --> 00:20:48,820 Můžeme použít s.last, s.first, a s.email 247 00:20:48,820 --> 00:20:58,990 nahradit v těchto tří hodnot do našeho formátovacího řetězce. 248 00:20:58,990 --> 00:21:06,190 Tak jak to šlo? Smysl? 249 00:21:06,190 --> 00:21:09,700 Ano? Ne? Možná? Dobře. 250 00:21:09,700 --> 00:21:14,180 >> Poslední věc, že ​​my poté, co jsme vytisknout a poté, co jsme otevřeli naši soubor: 251 00:21:14,180 --> 00:21:17,370 když jsme otevřeli soubor, musíme vždy pamatovat na jeho zavření. 252 00:21:17,370 --> 00:21:19,430 Protože jinak skončíme úniku paměti, 253 00:21:19,430 --> 00:21:22,500 použití se deskriptory souborů. 254 00:21:22,500 --> 00:21:25,950 Takže zavřete jej, které funkce budeme používat? Daniel? 255 00:21:25,950 --> 00:21:30,120 [Daniel] fclose? >> Fclose, přesně. 256 00:21:30,120 --> 00:21:37,520 Takže poslední část tohoto problému bylo řádně zavřete soubor, pomocí fclose funkce, 257 00:21:37,520 --> 00:21:40,370 který právě vypadá. 258 00:21:40,370 --> 00:21:43,880 Není příliš šílené. 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 testu. 261 00:21:49,520 --> 00:21:52,480 Budeme mít určitě větší soubor I / O přijít. 262 00:21:52,480 --> 00:21:55,130 Uděláme trochu víc v přednášce dnes, nebo v sekci dnes, 263 00:21:55,130 --> 00:22:01,710 protože to je to, co se děje tvořit část této nadcházející PSet. 264 00:22:01,710 --> 00:22:05,020 Pojďme dál od testu v tomto bodě. Ano? 265 00:22:05,020 --> 00:22:10,880 >> [Charlotte]] Proč fclose (soubor) místo fclose (staff.csv)? 266 00:22:10,880 --> 00:22:19,100 >> Ah. Vzhledem k tomu, že se ukáže, že - tak otázka, která je veliký, 267 00:22:19,100 --> 00:22:27,800 je důvod, proč, když píšeme fclose, píšeme fclose (soubor) star proměnnou 268 00:22:27,800 --> 00:22:33,680 na rozdíl od názvu souboru, staff.csv? Je to správně? Jo. 269 00:22:33,680 --> 00:22:39,570 Takže pojďme se podívat. Pokud bych přejít zpět na mém notebooku, 270 00:22:39,570 --> 00:22:45,040 a pojďme se podívat na fclose funkci. 271 00:22:45,040 --> 00:22:51,460 Takže fclose funkce uzavírá proud a trvá na ukazatel na proudu, který chceme uzavřít, 272 00:22:51,460 --> 00:22:57,010 na rozdíl od skutečného názvu souboru, který chceme uzavřít. 273 00:22:57,010 --> 00:23:01,620 A to je proto, že v zákulisí, když uděláte volání fopen, 274 00:23:01,620 --> 00:23:12,020 když si otevřete soubor, jste vlastně přidělování paměti pro ukládání informací o souboru. 275 00:23:12,020 --> 00:23:16,380 Takže máte ukazatel souboru, který obsahuje informace o souboru, 276 00:23:16,380 --> 00:23:23,080 jako je to otevřené, jeho velikost, kde se v současné době v souboru, 277 00:23:23,080 --> 00:23:29,100 takže si můžete udělat čtení a psaní volání daného místa v souboru. 278 00:23:29,100 --> 00:23:38,060 Můžete skončit uzavřením ukazatel namísto uzavření název souboru. 279 00:23:38,060 --> 00:23:48,990 >> Ano? [Daniel] Tak aby bylo možné používat pronájem, řekli byste - jak to dostat uživatelský vstup? 280 00:23:48,990 --> 00:23:53,830 Má fprintf chovat jako GetString v tom smyslu, že to bude jen čekat na vstup od uživatele 281 00:23:53,830 --> 00:23:57,180 a požádat, abyste zadejte tento - nebo počkat na zadání tyto tři věci? 282 00:23:57,180 --> 00:24:00,480 Nebo potřebujete použít něco realizovat pronájem? 283 00:24:00,480 --> 00:24:04,100 Jo >>. Takže nejsme - otázka byla, jak se dostat vstup od uživatele 284 00:24:04,100 --> 00:24:09,220 za účelem provedení nájem? A to, co tu máme, je volající o pronájmu, 285 00:24:09,220 --> 00:24:17,690 prošla v tomto pracovníků struct se všemi z dat uložených v struct již. 286 00:24:17,690 --> 00:24:22,990 Takže fprintf je schopen jen napsat, že data přímo do souboru. 287 00:24:22,990 --> 00:24:25,690 Není třeba čekat na vstup od uživatele. 288 00:24:25,690 --> 00:24:32,110 Tento uživatel je již dána vstup řádně vložením do tohoto zaměstnance struct. 289 00:24:32,110 --> 00:24:36,510 A věci, samozřejmě, by rozbít, pokud některý z těchto ukazatelů byly null, 290 00:24:36,510 --> 00:24:40,370 tak jsme se posunout zpět a my podívat na naši struct. 291 00:24:40,370 --> 00:24:43,640 Máme řetězec naposledy, string první, string email. 292 00:24:43,640 --> 00:24:48,530 Nyní víme, že všichni ti, opravdu, pod kapotou, jsou char * proměnné. 293 00:24:48,530 --> 00:24:53,470 To může nebo nemusí být nasměrována na null. 294 00:24:53,470 --> 00:24:55,800 Mohou směřovat do paměti na haldě, 295 00:24:55,800 --> 00:24:59,650 Možná paměť na zásobníku. 296 00:24:59,650 --> 00:25:04,580 My opravdu nevíme, ale pokud některý z těchto ukazatelů jsou null, nebo neplatné, 297 00:25:04,580 --> 00:25:08,120 že to určitě havárii naše půjčovna funkci. 298 00:25:08,120 --> 00:25:11,050 To bylo něco, co bylo trochu nad rámec zkoušky. 299 00:25:11,050 --> 00:25:16,440 Nejsme starosti, že. 300 00:25:16,440 --> 00:25:22,170 Great. Dobře. Takže se přesunul od kvízu. 301 00:25:22,170 --> 00:25:25,760 >> Pojďme zavřít toho chlapa, a budeme se dívat na PSet 4. 302 00:25:25,760 --> 00:25:34,700 Takže pokud jste se podívat na spec PSet, jakmile k němu máte přístup, cs50.net/quizzes, 303 00:25:34,700 --> 00:25:42,730 jsme jít přes několik sekcí problémů dnes. 304 00:25:42,730 --> 00:25:52,240 Já rolování dolů - část otázek začíná na třetí straně PSet spec. 305 00:25:52,240 --> 00:25:57,800 A první část vás požádá jít a dívat se na krátký na přesměrování a potrubí. 306 00:25:57,800 --> 00:26:02,820 Což bylo docela v pohodě krátký, zobrazí několik nových cool triky příkazového řádku, které můžete použít. 307 00:26:02,820 --> 00:26:06,050 A pak máme několik otázek pro vás stejně. 308 00:26:06,050 --> 00:26:10,860 Tato první otázka proudy, které printf píše ve výchozím nastavení, 309 00:26:10,860 --> 00:26:15,920 jsme trochu dotkli jen trochu před chvílí. 310 00:26:15,920 --> 00:26:22,380 To fprintf, že jsme právě diskutovali bere v proudu souboru * jako jeho argument. 311 00:26:22,380 --> 00:26:26,580 fclose bere v proudu souboru * i, 312 00:26:26,580 --> 00:26:32,660 a návratová hodnota funkce fopen vám souboru * proud stejně. 313 00:26:32,660 --> 00:26:36,060 Důvod, proč jsme neviděli ty předtím, když jsme se zabýval printf 314 00:26:36,060 --> 00:26:39,450 Je tomu tak proto printf má výchozí proud. 315 00:26:39,450 --> 00:26:41,810 A výchozí proud, na které se píše 316 00:26:41,810 --> 00:26:45,190 zjistíte informace o v krátké. 317 00:26:45,190 --> 00:26:50,080 Takže určitě se na něj podívat. 318 00:26:50,080 --> 00:26:53,010 >> V dnešní části budeme mluvit trochu o GDB, 319 00:26:53,010 --> 00:26:57,720 protože čím více jste obeznámeni s tím, že více praxe získáte s ní, 320 00:26:57,720 --> 00:27:01,390 lépe schopný budete skutečně stopovat chyby ve vašem vlastním kódu. 321 00:27:01,390 --> 00:27:05,540 To urychluje proces ladění nahoru ohromně. 322 00:27:05,540 --> 00:27:09,230 Takže pomocí printf, pokaždé, když to, že budete muset rekompilovat kód, 323 00:27:09,230 --> 00:27:13,000 budete muset spustit znovu, někdy budete muset přesunout printf hovor kolem, 324 00:27:13,000 --> 00:27:17,100 komentář mimo kód, zabere to jen chvilku. 325 00:27:17,100 --> 00:27:20,850 Naším cílem je pokusit se přesvědčit, že s GDB, můžete v podstatě 326 00:27:20,850 --> 00:27:26,810 printf něco na libovolném místě v kódu a už nikdy nebudete muset překompilovat ho. 327 00:27:26,810 --> 00:27:35,120 Už nikdy nebudete muset začít a udržet hádat, kde printf další. 328 00:27:35,120 --> 00:27:40,910 První věc, kterou musíte udělat, je zkopírovat tento řádek a získat část kódu pryč webu. 329 00:27:40,910 --> 00:27:47,530 Jsem kopírování tento řádek kódu, který říká, "wget ​​http://cdn.cs50.net". 330 00:27:47,530 --> 00:27:49,510 Budu ho kopírovat. 331 00:27:49,510 --> 00:27:55,950 Chystám se jít na moji spotřebiče, oddálení, takže můžete vidět, co dělám, 332 00:27:55,950 --> 00:28:01,890 vložit to tam, a když jsem stiskněte klávesu Enter, tato wget příkaz doslova je web dostat. 333 00:28:01,890 --> 00:28:06,210 Bude to bourat tento soubor pryč na internetu, 334 00:28:06,210 --> 00:28:11,790 a bude to uložit do aktuálního adresáře. 335 00:28:11,790 --> 00:28:21,630 Nyní, když jsem seznam svou aktuální adresář můžete vidět, že jsem dostal tuto section5.zip file přímo tam. 336 00:28:21,630 --> 00:28:25,260 Způsob, jak se s tím vypořádat chlap je rozbalit ho, 337 00:28:25,260 --> 00:28:27,650 které můžete udělat v příkazovém řádku, stejně jako to. 338 00:28:27,650 --> 00:28:31,880 Section5.zip. 339 00:28:31,880 --> 00:28:36,980 To bude rozbalte jej, vytvořte složku pro mě, 340 00:28:36,980 --> 00:28:40,410 nafouknout veškerý obsah, dal je tam. 341 00:28:40,410 --> 00:28:47,410 Takže teď můžu jít do mého sekce 5 adresáře pomocí příkazu cd. 342 00:28:47,410 --> 00:28:58,310 Zrušte obrazovku pomocí jasné. Takže vyčistit obrazovku. 343 00:28:58,310 --> 00:29:02,280 Teď mám pěkný čistý terminál řešit. 344 00:29:02,280 --> 00:29:06,200 >> Nyní, když jsem vypsat všechny soubory, které vidím v tomto adresáři, 345 00:29:06,200 --> 00:29:12,270 vidíte, že mám čtyři soubory: buggy1, buggy2, buggy3, a buggy4. 346 00:29:12,270 --> 00:29:16,180 Já jsem také dostal své odpovídající. C soubory. 347 00:29:16,180 --> 00:29:20,400 Nebudeme se dívat na. Soubory C pro tuto chvíli. 348 00:29:20,400 --> 00:29:24,140 Místo toho, budeme používat je, když jsme se otevřít GDB. 349 00:29:24,140 --> 00:29:28,220 Jsme drželi je asi tak, že máme přístup k aktuální zdrojový kód, když jsme pomocí GDB, 350 00:29:28,220 --> 00:29:32,740 ale cílem této části sekce je pohrát si s GDB 351 00:29:32,740 --> 00:29:40,370 a uvidíte, jak můžeme použít zjistit, co se děje špatně s každou z těchto čtyř kočárku programů. 352 00:29:40,370 --> 00:29:43,380 Takže jsme jen tak po pokoji opravdu rychle, 353 00:29:43,380 --> 00:29:47,000 a budu se zeptat někoho spustit jednu z kočárku programů, 354 00:29:47,000 --> 00:29:54,730 a pak půjdeme jako skupina prostřednictvím GDB, a uvidíme, co můžeme udělat pro to opravit tyto programy, 355 00:29:54,730 --> 00:29:58,460 nebo alespoň zjistit, co se děje špatně v každé z nich. 356 00:29:58,460 --> 00:30:04,760 Pojďme začít znovu tady s Danielem. Spustíme buggy1? Pojďme se podívat, co se stane. 357 00:30:04,760 --> 00:30:09,470 [Daniel] To říká, že je to chyba aplikace. Jo >>. Přesně tak. 358 00:30:09,470 --> 00:30:12,460 Takže, když spustím buggy1, dostanu seg poruchu. 359 00:30:12,460 --> 00:30:16,210 V tomto bodě, jsem mohl jít a otevřít buggy1.c, 360 00:30:16,210 --> 00:30:19,450 vyzkoušet a zjistit, co se děje špatně, 361 00:30:19,450 --> 00:30:22,000 ale jeden z nejvíce nepříjemnými věcí na tomto seg poruchy chybě 362 00:30:22,000 --> 00:30:27,610 je to, že nemůžu říct o tom, co řada z programových věcí skutečně pokazilo a zlomil. 363 00:30:27,610 --> 00:30:29,880 Tak nějak se podívat na kód 364 00:30:29,880 --> 00:30:33,990 a zjistit pomocí odhad a kontrolu nebo printf vidět, co se děje špatně. 365 00:30:33,990 --> 00:30:37,840 Jedna z nejlepších věcí, o GDB je, že je to opravdu, ale opravdu jednoduché 366 00:30:37,840 --> 00:30:42,170 přijít na to, řádek, ve kterém váš program zhroutí. 367 00:30:42,170 --> 00:30:46,160 Je to naprosto stojí za to ji používat, i když jen na to. 368 00:30:46,160 --> 00:30:56,190 Takže nastartovat GDB, jsem typ GDB, a pak jsem jí dávají cestu k spustitelného souboru, který chci spustit. 369 00:30:56,190 --> 00:31:01,960 Tady píšu gdb ./buggy1. 370 00:31:01,960 --> 00:31:06,600 Stiskněte Enter. Dává mi to všechno informace o autorských právech, 371 00:31:06,600 --> 00:31:13,000 a tady uvidíte tento řádek, který říká, "Čtení symbolů z / home / 372 00:31:13,000 --> 00:31:17,680 jharvard/section5/buggy1. " 373 00:31:17,680 --> 00:31:22,060 A pokud vše půjde dobře, uvidíte, že vytisknout zprávu, která vypadá takto. 374 00:31:22,060 --> 00:31:25,500 Bude to číst symboly, bude to říkat "Já čtu symboly z vašeho spustitelného souboru," 375 00:31:25,500 --> 00:31:29,900 a pak to bude mít tento "Hotovo" zpráva tady. 376 00:31:29,900 --> 00:31:35,410 Pokud vidíte jiný variantu tohoto, nebo vidíte, že se nepodařilo najít symboly 377 00:31:35,410 --> 00:31:41,460 nebo něco takového, co to znamená, je to, že jste právě nejsou sestaveny na spustitelný správně. 378 00:31:41,460 --> 00:31:49,980 Když jsme kompilovat programy pro použití s ​​GDB, musíme použít tuto speciální g vlajkou, 379 00:31:49,980 --> 00:31:54,540 a že se to dělá ve výchozím nastavení, pokud si zkompilovat vaše programy, pouhým zadáním, aby 380 00:31:54,540 --> 00:31:59,320 nebo si kočárek nebo se zotavit, každý z nich. 381 00:31:59,320 --> 00:32:07,800 Ale pokud jste kompilace ručně s Clang, pak budete muset jít a patří to-g vlajkou. 382 00:32:07,800 --> 00:32:10,310 >> V tomto bodě, teď, když máme GDB řádku, 383 00:32:10,310 --> 00:32:12,310 je to docela jednoduché spustit program. 384 00:32:12,310 --> 00:32:19,740 Můžeme buď zadat běh, nebo můžeme jen typ R. 385 00:32:19,740 --> 00:32:22,820 Většina gdb příkazy mohou být zkráceny. 386 00:32:22,820 --> 00:32:25,940 Obvykle jen na jedné nebo několika písmen, což je docela pěkné. 387 00:32:25,940 --> 00:32:30,980 Takže Saad, pokud zadáte r a stiskněte klávesu Enter, co se stane? 388 00:32:30,980 --> 00:32:39,390 [Saad] Mám SIGSEGV, Segmentation fault, a pak to všechno hatmatilka. 389 00:32:39,390 --> 00:32:43,650 Jo >>. 390 00:32:43,650 --> 00:32:47,990 Stejně jako vidíme na obrazovce právě teď, a jako Saad řekl, 391 00:32:47,990 --> 00:32:53,430 když napíšeme běh nebo r a stiskněte klávesu Enter, stále se stejnou seg poruchu. 392 00:32:53,430 --> 00:32:55,830 Takže pomocí GDB nevyřeší náš problém. 393 00:32:55,830 --> 00:32:59,120 Ale to nám dává určité hatmatilka, a ukázalo se, že to hatmatilka 394 00:32:59,120 --> 00:33:03,080 vlastně nám říká, kde se to děje. 395 00:33:03,080 --> 00:33:10,680 Chcete-li analyzovat tento trochu, tento první bit je funkce, v níž všechno špatně. 396 00:33:10,680 --> 00:33:20,270 Tam je to __ strcmp_sse4_2, a to nám říká, že se to děje v tomto souboru 397 00:33:20,270 --> 00:33:29,450 volal sysdeps/i386, to vše opět trochu nepořádek - ale linka 254. 398 00:33:29,450 --> 00:33:31,670 To je trochu těžké analyzovat. Obvykle, když vidíte věci, jako je tento, 399 00:33:31,670 --> 00:33:38,770 to znamená, že je to seg chybující v jednom z knihovny systému. 400 00:33:38,770 --> 00:33:43,220 Takže něco do činění s strcmp. Vy jste viděl strcmp dříve. 401 00:33:43,220 --> 00:33:52,730 Není příliš bláznivé, ale znamená to, že strcmp je rozbité, nebo že je tu problém s strcmp? 402 00:33:52,730 --> 00:33:57,110 Co si myslíte, Alexander? 403 00:33:57,110 --> 00:34:04,890 [Alexander] Je to - je 254 linka? A - není binární, ale není to jejich stropy, 404 00:34:04,890 --> 00:34:10,590 a pak je tu jiný jazyk pro každou funkci. Je to 254 v této funkci, nebo -? 405 00:34:10,590 --> 00:34:21,460 >> Je to linka 254. Vypadá to, že v tomto souboru. S., tak to je kód assembleru pravděpodobně. 406 00:34:21,460 --> 00:34:25,949 >> Ale myslím, že naléhavější věc je, protože jsme dostali seg poruchu, 407 00:34:25,949 --> 00:34:29,960 a vypadá to, že to přichází z strcmp funkce, 408 00:34:29,960 --> 00:34:38,030 to neznamená, pak, je špatně, že strcmp? 409 00:34:38,030 --> 00:34:42,290 To by nemělo, snad. Takže jen proto, že máte segmentation fault 410 00:34:42,290 --> 00:34:49,480 v jedné z funkcí systému, obvykle to znamená, že jste právě Nevolal správně. 411 00:34:49,480 --> 00:34:52,440 Nejrychlejší věc udělat, aby se zjistit, co se vlastně děje 412 00:34:52,440 --> 00:34:55,500 když vidíte něco šíleného, ​​jako to, když vidíte seg poruchu, 413 00:34:55,500 --> 00:34:59,800 zvláště pokud máte program, který je pomocí více než jen hlavní, 414 00:34:59,800 --> 00:35:03,570 je použít backtrace. 415 00:35:03,570 --> 00:35:13,080 I zkrátit backtrace psaním BT, jak protichůdný k plnému backtrace slovo. 416 00:35:13,080 --> 00:35:16,510 Ale Charlotte, co se stane, když zadáte BT a stiskněte klávesu Enter? 417 00:35:16,510 --> 00:35:23,200 [Charlotte] Ukazuje mi dva řádky, řádek 0 a 1. řádek. 418 00:35:23,200 --> 00:35:26,150 Jo >>. Takže řádek 0 a 1. řádek. 419 00:35:26,150 --> 00:35:34,560 Jedná se o skutečné zásobníku snímky, které se v současné době ve hře, když váš program havaroval. 420 00:35:34,560 --> 00:35:42,230 Počínaje nejvyšší rámu, rámu 0, a bude nejspodnější, která je rám 1. 421 00:35:42,230 --> 00:35:45,140 Naše nejvyšší rám je strcmp rámu. 422 00:35:45,140 --> 00:35:50,080 Můžete myslet na to, jak podobný k tomuto problému jsme dělali jen to, na testu s ukazateli, 423 00:35:50,080 --> 00:35:54,890 kde jsme vyměnit zásobník rám na horní části hlavního zásobníku rámu, 424 00:35:54,890 --> 00:35:59,700 a my jsme museli proměnné tak, že prohodí se pomocí na vrcholu proměnných, že hlavní je používat. 425 00:35:59,700 --> 00:36:08,440 Zde naše pád se stalo v našem strcmp funkce, které se říkalo o naší hlavní funkcí, 426 00:36:08,440 --> 00:36:14,370 a backtrace nám dává nejen funkce, ve kterých věci selhala, 427 00:36:14,370 --> 00:36:16,440 ale je to také nám říká, kde bylo vše jen z. 428 00:36:16,440 --> 00:36:18,830 Takže pokud jsem projděte trochu více vpravo, 429 00:36:18,830 --> 00:36:26,110 můžeme vidět, že jo, my jsme byli na lince 254 tohoto strcmp-sse4.s souboru. 430 00:36:26,110 --> 00:36:32,540 Ale hovor byl dělán na buggy1.c, řádek 6. 431 00:36:32,540 --> 00:36:35,960 Takže to znamená, že můžeme udělat - je, že jsme si prostě jít podívat a zjistit, co se děje 432 00:36:35,960 --> 00:36:39,930 na buggy1.c, řádek 6. 433 00:36:39,930 --> 00:36:43,780 Opět, existuje několik způsobů, jak to udělat. Jedním z nich je ukončení z GDB 434 00:36:43,780 --> 00:36:49,460 nebo mít váš kód otevře v jiném okně a cross reference. 435 00:36:49,460 --> 00:36:54,740 To samo o sobě, je docela užitečné, protože teď, když jste na úředních hodin 436 00:36:54,740 --> 00:36:57,220 a máte seg poruchu a vaše TF se divila, kde všechno bylo porušení, 437 00:36:57,220 --> 00:36:59,710 stačí říct, "Oh, linka 6. Nevím, co se děje, 438 00:36:59,710 --> 00:37:03,670 ale něco řádku 6 je příčinou můj program přerušit. " 439 00:37:03,670 --> 00:37:10,430 Jiný způsob, jak to udělat, je, můžete použít tento příkaz s názvem seznam v GDB. 440 00:37:10,430 --> 00:37:13,650 Můžete také zkrátit s l. 441 00:37:13,650 --> 00:37:18,910 Takže pokud jsme narazili l, co jsme se sem dostali? 442 00:37:18,910 --> 00:37:21,160 Dostáváme spoustu podivné věci. 443 00:37:21,160 --> 00:37:26,030 To je skutečná sestava 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 vypadá druh funky, 446 00:37:32,440 --> 00:37:36,520 a důvod, proč jsme stále je to proto, že právě teď, 447 00:37:36,520 --> 00:37:40,160 GDB má nás v rámu 0. 448 00:37:40,160 --> 00:37:43,070 >> Takže kdykoliv se podíváme na proměnné, kdykoli se podíváme na zdrojový kód, 449 00:37:43,070 --> 00:37:50,530 díváme zdrojového kódu, který se vztahuje k zásobníku rámu jsme právě nacházíte 450 00:37:50,530 --> 00:37:53,200 Tak, aby si něco smysluplného, ​​musíme 451 00:37:53,200 --> 00:37:57,070 přejít na zásobníku rámu, který dává větší smysl. 452 00:37:57,070 --> 00:38:00,180 V tomto případě by hlavní zásobník rám, aby trochu větší smysl, 453 00:38:00,180 --> 00:38:02,680 protože to byl vlastně kód, který jsme napsali. 454 00:38:02,680 --> 00:38:05,330 Není strcmp kód. 455 00:38:05,330 --> 00:38:08,650 Jak se můžete pohybovat mezi snímky, v tomto případě, protože máme dvě, 456 00:38:08,650 --> 00:38:10,430 máme 0 a 1, 457 00:38:10,430 --> 00:38:13,650 děláte, že se nahoru a dolů příkazů. 458 00:38:13,650 --> 00:38:18,480 Pokud bych posunout o jeden snímek, 459 00:38:18,480 --> 00:38:21,770 teď jsem v hlavním zásobníku rámu. 460 00:38:21,770 --> 00:38:24,330 Mohu se pohybovat dolů jít tam, kde jsem byl, 461 00:38:24,330 --> 00:38:32,830 jít znovu, jít zase dolů, a jít znovu. 462 00:38:32,830 --> 00:38:39,750 Pokud jste někdy dělat program v GDB, dostanete havárii, získáte backtrace, 463 00:38:39,750 --> 00:38:42,380 a zjistíte, že je to v nějakém souboru, který neví, co se děje. 464 00:38:42,380 --> 00:38:45,460 Můžete zkusit seznamu, kód nevypadá znáte, 465 00:38:45,460 --> 00:38:48,150 podívejte se na seznam snímků a zjistit, kde jste. 466 00:38:48,150 --> 00:38:51,010 Pravděpodobně jste ve špatném rámce fronty. 467 00:38:51,010 --> 00:38:58,760 Nebo alespoň, že jsi v zásobníku rámu, který není ten, který si můžete opravdu ladit. 468 00:38:58,760 --> 00:39:03,110 Teď, když jsme v příslušné rámce fronty, jsme v hlavním, 469 00:39:03,110 --> 00:39:08,100 Nyní můžeme použít příkaz list zjistit, co byla linka. 470 00:39:08,100 --> 00:39:13,590 A vidíte to, to vytiskl pro nás tady. 471 00:39:13,590 --> 00:39:19,470 Ale můžeme zasáhnout seznam všech stejné, a seznam nám dává toto pěkné výtisk 472 00:39:19,470 --> 00:39:23,920 skutečného zdrojového kódu, co se děje tady. 473 00:39:23,920 --> 00:39:26,420 >> Zejména, můžeme se podívat na řádku 6. 474 00:39:26,420 --> 00:39:29,330 Můžeme vidět, co se děje tady. 475 00:39:29,330 --> 00:39:31,250 A vypadá to, že děláme porovnání řetězců 476 00:39:31,250 --> 00:39:41,050 mezi řetězci "CS50 skal" a argv [1]. 477 00:39:41,050 --> 00:39:45,700 Něco o tom padal. 478 00:39:45,700 --> 00:39:54,120 Takže Missy, máte nějaké myšlenky na to, co by mohlo být to tu děje? 479 00:39:54,120 --> 00:39:59,400 [Missy] Já nevím, proč to shazovat. >> Nevíte proč to shazovat? 480 00:39:59,400 --> 00:40:02,700 Jimmy, nějaké myšlenky? 481 00:40:02,700 --> 00:40:06,240 [Jimmy] Nejsem si úplně jistý, ale v poslední době jsme použili řetězec porovnání, 482 00:40:06,240 --> 00:40:10,260 nebo strcmp, měli jsme jako tři různé případy podle ní. 483 00:40:10,260 --> 00:40:12,800 Neměli jsme k ==, nemyslím si, že přímo v té první linii. 484 00:40:12,800 --> 00:40:16,700 Místo toho byl rozdělen do tří a jedna == 0, 485 00:40:16,700 --> 00:40:19,910 jeden byl <0, myslím, a jeden byl> 0. 486 00:40:19,910 --> 00:40:22,590 Takže možná něco takového? Jo >>. Takže tam je to problém 487 00:40:22,590 --> 00:40:27,200 z děláme srovnání správně? 488 00:40:27,200 --> 00:40:31,660 Stella? Jakékoliv myšlenky? 489 00:40:31,660 --> 00:40:38,110 [Stella] Nejsem si jistý. >> Nejsem si jistý. Daniel? Myšlenky? Dobře. 490 00:40:38,110 --> 00:40:44,770 Ukázalo se, že to, co se děje tady, je, když jsme běželi program 491 00:40:44,770 --> 00:40:48,370 a my jsme dostali seg poruchu, při spuštění programu poprvé, Daniel, 492 00:40:48,370 --> 00:40:50,800 jste jej žádné argumenty příkazového řádku? 493 00:40:50,800 --> 00:40:58,420 [Daniel] No >> č. V tomto případě, co je hodnota argv [1]? 494 00:40:58,420 --> 00:41:00,920 >> Není žádná hodnota. Právo >>. 495 00:41:00,920 --> 00:41:06,120 No, není vhodné řetězcová hodnota. 496 00:41:06,120 --> 00:41:10,780 Ale tam je nějaká hodnota. Jaká je hodnota, která je uložena v tam? 497 00:41:10,780 --> 00:41:15,130 >> Odpadky hodnota? >> Je to buď odpadky hodnota nebo, v tomto případě, 498 00:41:15,130 --> 00:41:19,930 konec pole argv je vždy ukončen s null. 499 00:41:19,930 --> 00:41:26,050 Takže, co vlastně dostal v nich uloženy, je null. 500 00:41:26,050 --> 00:41:30,810 Další způsob, jak vyřešit tento, spíše než myšlení přes, 501 00:41:30,810 --> 00:41:33,420 je pokusit vytisknout to. 502 00:41:33,420 --> 00:41:35,880 To je místo, kde jsem si říkal, že používání GDB je skvělé, 503 00:41:35,880 --> 00:41:40,640 protože si můžete vytisknout všechny proměnné, všechny hodnoty, které chcete 504 00:41:40,640 --> 00:41:43,230 pomocí tohoto handy-dandy p příkazu. 505 00:41:43,230 --> 00:41:48,520 Takže pokud jsem typ p a pak jsem zadejte hodnotu proměnné nebo název proměnné, 506 00:41:48,520 --> 00:41:55,320 říkají, argc, vidím, že argc je 1. 507 00:41:55,320 --> 00:42:01,830 Pokud chci vytisknout argv [0], mohu tak učinit jen tak. 508 00:42:01,830 --> 00:42:04,840 A jak jsme viděli, argv [0] je vždy název programu, 509 00:42:04,840 --> 00:42:06,910 vždy název spustitelného souboru. 510 00:42:06,910 --> 00:42:09,740 Zde můžete vidět, že má úplný název. 511 00:42:09,740 --> 00:42:15,920 Mohu také vytisknout argv [1], a uvidíme, co se stane. 512 00:42:15,920 --> 00:42:20,890 >> Zde jsme dostali tento druh mystické hodnoty. 513 00:42:20,890 --> 00:42:23,890 Máme tuto 0x0. 514 00:42:23,890 --> 00:42:27,850 Nezapomeňte na začátku semestru, kdy jsme mluvili o hexadecimální čísla? 515 00:42:27,850 --> 00:42:34,680 Nebo že malá otázka na konci PSet 0 o tom, jak reprezentovat 50 v hex? 516 00:42:34,680 --> 00:42:39,410 Způsob, jakým píšeme hex čísla v CS, jen neplést sami 517 00:42:39,410 --> 00:42:46,080 s desetinnými čísly, je, že jsme vždy prefix jim 0x. 518 00:42:46,080 --> 00:42:51,420 Tak tohle 0x prefix vždy jen rozumí interpretovat následující číslo jako hexadecimální číslo, 519 00:42:51,420 --> 00:42:57,400 ne jako řetězec, ne jako desetinné číslo, ne jako binární číslo. 520 00:42:57,400 --> 00:43:02,820 Protože počet 5-0 je platné číslo v šestnáctkové soustavě. 521 00:43:02,820 --> 00:43:06,240 A to je číslo v desítkové soustavě, 50. 522 00:43:06,240 --> 00:43:10,050 Takže to je to, jak jsme disambiguate. 523 00:43:10,050 --> 00:43:14,860 Takže 0x0 prostředky hexadecimální 0, což je také desetinné 0, binární 0. 524 00:43:14,860 --> 00:43:17,030 Je to jen hodnota 0. 525 00:43:17,030 --> 00:43:22,630 Ukazuje se, že to je to, co je null, vlastně, v paměti. 526 00:43:22,630 --> 00:43:25,940 Null je jen 0. 527 00:43:25,940 --> 00:43:37,010 Zde se prvek uložen v argv [1] je nulový. 528 00:43:37,010 --> 00:43:45,220 Takže se snažíme tyto naše "CS50 skály" řetězec nulový řetězec. 529 00:43:45,220 --> 00:43:48,130 Takže dereferencing null, pokusu o přístup k věci na null, 530 00:43:48,130 --> 00:43:55,050 ty jsou obvykle bude způsobovat nějaké segmentation fault nebo jiné špatné věci se dějí. 531 00:43:55,050 --> 00:43:59,350 A ukázalo se, že strcmp nekontroluje vidět 532 00:43:59,350 --> 00:44:04,340 zda jste prošel v hodnotě, která je null. 533 00:44:04,340 --> 00:44:06,370 Spíše, to jen jde dopředu, snaží se dělat svou věc, 534 00:44:06,370 --> 00:44:14,640 a pokud seg chyby, to seg chyby, a je to tvůj problém. Musíš jít opravit. 535 00:44:14,640 --> 00:44:19,730 Opravdu rychle, může jak tento problém vyřešit? Charlotte? 536 00:44:19,730 --> 00:44:23,540 [Charlotte] můžete zkontrolovat pomocí, pokud. 537 00:44:23,540 --> 00:44:32,240 Takže pokud argv [1] je null, == 0, pak se vraťte 1, nebo něco [nesrozumitelné]. 538 00:44:32,240 --> 00:44:34,590 Jo >>. Takže to je jedna skvělý způsob, jak to udělat, jak můžeme zkontrolovat, 539 00:44:34,590 --> 00:44:39,230 hodnota se chystáme projít do strcmp, argv [1], je null? 540 00:44:39,230 --> 00:44:45,830 Pokud je to null, pak můžeme říci, v pořádku, potratit. 541 00:44:45,830 --> 00:44:49,450 >> Běžnější způsob, jak to udělat, je použít argc hodnotu. 542 00:44:49,450 --> 00:44:52,040 Můžete vidět přímo zde na začátku main, 543 00:44:52,040 --> 00:44:58,040 Vynechali jsme, že první test, který jsme obvykle dělat, když budeme používat argumenty příkazového řádku, 544 00:44:58,040 --> 00:45:05,240 který je otestovat, zda není naše argc hodnota je to, co očekáváme. 545 00:45:05,240 --> 00:45:10,290 V tomto případě, čekáme nejméně dva argumenty, 546 00:45:10,290 --> 00:45:13,660 název programu plus jeden další. 547 00:45:13,660 --> 00:45:17,140 Protože se chystáme použít druhý argument tady. 548 00:45:17,140 --> 00:45:21,350 Takže má nějaký zkoušky předem, před naším strcmp hovoru 549 00:45:21,350 --> 00:45:37,390 že testy též argv je nejméně 2, by také udělat stejný druh věci. 550 00:45:37,390 --> 00:45:40,620 Můžeme zjistit, jestli to funguje, spuštěním programu znovu. 551 00:45:40,620 --> 00:45:45,610 Vždy se můžete restartovat program do GDB, což je opravdu pěkné. 552 00:45:45,610 --> 00:45:49,310 Můžete spustit, a při předání v argumentech do vašeho programu, 553 00:45:49,310 --> 00:45:53,060 předáte je, když říkáte spuštění, ne při startu GDB. 554 00:45:53,060 --> 00:45:57,120 Tímto způsobem můžete mít vyvolání programu s různými argumenty pokaždé. 555 00:45:57,120 --> 00:46:08,080 Tak běžte, nebo znovu, můžu Type R, a uvidíme, co se stane, když napíšeme "ahoj". 556 00:46:08,080 --> 00:46:11,140 To bude vždy zeptá, zda chcete spustit znovu od začátku. 557 00:46:11,140 --> 00:46:17,490 Obvykle si chcete spustit znovu od začátku. 558 00:46:17,490 --> 00:46:25,010 A v tomto bodě, to restartuje to znovu, to vytiskne 559 00:46:25,010 --> 00:46:28,920 program, který jsme běh, buggy1, s argumentem ahoj, 560 00:46:28,920 --> 00:46:32,720 a vytiskne tento standard ven, říká, "Dostanete D," smutný obličej. 561 00:46:32,720 --> 00:46:37,610 Ale my jsme to seg chyba. To říkal, že proces ukončen normálně. 562 00:46:37,610 --> 00:46:39,900 Takže to vypadá docela dobře. 563 00:46:39,900 --> 00:46:43,050 Žádné další seg chyba, jsme to minulost, 564 00:46:43,050 --> 00:46:48,190 takže to vypadá, že je skutečně seg chyba chyba, že jsme se dostat. 565 00:46:48,190 --> 00:46:51,540 Bohužel, to nám říká, že jsme stále na D. 566 00:46:51,540 --> 00:46:54,090 >> Můžeme se vrátit a podívat se na kód a vidět, co se tam děje 567 00:46:54,090 --> 00:46:57,980 zjistit, co bylo - proč se to nám říká, že máme D. 568 00:46:57,980 --> 00:47:03,690 Pojďme se podívat, zde byla tato printf říká, že máš D. 569 00:47:03,690 --> 00:47:08,540 Pokud napíšeme seznam, jak si udržet psaní seznamu, udržuje iterace se prostřednictvím svého programu, 570 00:47:08,540 --> 00:47:10,940 tak to vám ukážu několik prvních řádků programu. 571 00:47:10,940 --> 00:47:15,450 Pak vám ukážu několik dalších řádků, a další kus a další kus. 572 00:47:15,450 --> 00:47:18,240 A to bude dál snažit jít dolů. 573 00:47:18,240 --> 00:47:21,180 A teď se dostaneme "linku číslo 16 je mimo rozsah." 574 00:47:21,180 --> 00:47:23,940 Vzhledem k tomu, že má jen 15 řádků. 575 00:47:23,940 --> 00:47:30,310 Pokud se dostanete do tohoto bodu, a vaše přemýšlel, "Co mám dělat?" můžete použít příkaz help. 576 00:47:30,310 --> 00:47:34,340 Použijte nápovědu a pak to jméno příkazu. 577 00:47:34,340 --> 00:47:36,460 A vidíte GDB nám dává všechny takovéhle věci. 578 00:47:36,460 --> 00:47:43,870 To říká: "S žádným argumentem, uvádí dalších deset linek po nebo kolem předchozího seznamu. 579 00:47:43,870 --> 00:47:47,920 Seznam - uvádí deset řádky před - " 580 00:47:47,920 --> 00:47:52,960 Tak pojďme zkusit pomocí seznamu mínus. 581 00:47:52,960 --> 00:47:57,000 A, který uvádí, že 10 řádků předchozí, můžete pohrát se seznamem trochu. 582 00:47:57,000 --> 00:48:02,330 Můžete to udělat seznam, seznam -, můžete si dokonce dát vypsat číslo, jako je seznam 8, 583 00:48:02,330 --> 00:48:07,500 a to bude seznam 10 řádků po řádku 8. 584 00:48:07,500 --> 00:48:10,290 A vidíte, co se tady děje je máš jednoduché, pokud jiný. 585 00:48:10,290 --> 00:48:13,980 Pokud zadáte CS50 skalách, vypíše "Získáte A." 586 00:48:13,980 --> 00:48:16,530 Jinak to vytiskne "Dostanete D." 587 00:48:16,530 --> 00:48:23,770 Bummer město. Dobrá. Ano? 588 00:48:23,770 --> 00:48:26,730 >> [Daniel] Takže když jsem se snažil dělat CS50 kameny bez uvozovek, 589 00:48:26,730 --> 00:48:29,290 říká, že "Dostanete D." 590 00:48:29,290 --> 00:48:32,560 Potřeboval jsem uvozovky se dostat do práce, proč to je? 591 00:48:32,560 --> 00:48:38,490 Jo >>. Ukazuje se, že když - to je další trochu legrace lahůdku - 592 00:48:38,490 --> 00:48:47,900 při spuštění programu, pokud bychom jej spustit a my zadejte CS50 skalách, 593 00:48:47,900 --> 00:48:50,800 stejně jako Daniel byl řekl, že ano, a stisknete klávesu Enter, 594 00:48:50,800 --> 00:48:52,870 stále říká, že jsme si D. 595 00:48:52,870 --> 00:48:55,580 A otázka je, proč to je? 596 00:48:55,580 --> 00:49:02,120 A ukázalo se, že jak naše terminál a GDB analyzovat tyto jako dvě samostatné argumenty. 597 00:49:02,120 --> 00:49:04,800 Vzhledem k tomu, když je prostor, který je vyjádřen 598 00:49:04,800 --> 00:49:08,730 První argument skončila, další argument je asi začít. 599 00:49:08,730 --> 00:49:13,260 Způsob zkombinovat ty do dvou, nebo líto, do jednoho argumentu, 600 00:49:13,260 --> 00:49:18,510 je použít uvozovky. 601 00:49:18,510 --> 00:49:29,560 Takže teď, když dáme do uvozovek a spusťte jej znovu, dostaneme A. 602 00:49:29,560 --> 00:49:38,780 Takže jen shrnout, žádné citace, CS50 a skály analyzovat jako dvě samostatné argumenty. 603 00:49:38,780 --> 00:49:45,320 S citacemi, je to analyzovat jako jeden argument úplně. 604 00:49:45,320 --> 00:49:53,070 >> Vidíme to s zarážka. 605 00:49:53,070 --> 00:49:54,920 Zatím jsme byli běží náš program, a to byl spuštěn 606 00:49:54,920 --> 00:49:58,230 dokud buď seg závady nebo narazí na chybu 607 00:49:58,230 --> 00:50:05,930 nebo dokud byl ukončen a veškeré byla úplně v pohodě. 608 00:50:05,930 --> 00:50:08,360 To není nutně nejužitečnější věc, protože někdy 609 00:50:08,360 --> 00:50:11,840 Máte chybu v programu, ale to není způsobení segmentation fault. 610 00:50:11,840 --> 00:50:16,950 Není to způsobuje váš program zastavit nebo něco podobného. 611 00:50:16,950 --> 00:50:20,730 Způsob, jak dostat GDB pozastavit váš program na určitém místě 612 00:50:20,730 --> 00:50:23,260 je nastavit zarážku. 613 00:50:23,260 --> 00:50:26,520 Můžete buď provést nastavením zarážka na název funkce 614 00:50:26,520 --> 00:50:30,770 nebo můžete nastavit zarážku na konkrétní řádek kódu. 615 00:50:30,770 --> 00:50:34,450 Líbí se mi nastavit zarážky na názvy funkcí, protože - snadno zapamatovatelné, 616 00:50:34,450 --> 00:50:37,700 a pokud si skutečně jít a změnit zdrojový kód do trochu, 617 00:50:37,700 --> 00:50:42,020 pak se vaše breakpoint bude skutečně zůstat na stejném místě ve vašem kódu. 618 00:50:42,020 --> 00:50:44,760 Vzhledem k tomu, pokud používáte čísla řádků, a čísla řádků změní 619 00:50:44,760 --> 00:50:51,740 protože přidáte nebo odstraníte nějaký kód, pak se vaše zarážky jsou úplně posral. 620 00:50:51,740 --> 00:50:58,590 Jedním z nejčastějších věcí, které jsem udělat, je nastavit zarážku na hlavní funkci. 621 00:50:58,590 --> 00:51:05,300 Často jsem si nastartovat gdb, budu psát B Hlavní, stiskněte klávesu Enter, a které vám nastavit zarážku 622 00:51:05,300 --> 00:51:10,630 na hlavní funkcí, kterou právě říká, "Pozastavení programu, jakmile začnou," 623 00:51:10,630 --> 00:51:17,960 a to tak, když jsem spustit svůj program, řekněme, CS50 skály jako dva argumenty 624 00:51:17,960 --> 00:51:24,830 a stiskněte klávesu Enter, se dostane do hlavní funkce a zastaví se na prvním řádku, 625 00:51:24,830 --> 00:51:30,620 těsně před vyhodnocuje strcmp funkce. 626 00:51:30,620 --> 00:51:34,940 >> Vzhledem k tomu, jsem se zastavil, teď můžu začít odtěžení kolem a viděl, co se děje 627 00:51:34,940 --> 00:51:40,250 se všemi různými proměnnými, které jsou předávány do mého programu. 628 00:51:40,250 --> 00:51:43,670 Zde mohu vytisknout argc a vidět, co se děje. 629 00:51:43,670 --> 00:51:50,030 Vidět, že argc je 3, protože je to má 3 různé hodnoty v něm. 630 00:51:50,030 --> 00:51:54,060 Je to tu na název programu, je to má první argument a druhý argument. 631 00:51:54,060 --> 00:52:09,330 Můžeme tisknout ty z pohledu na argv [0], argv [1], a argv [2]. 632 00:52:09,330 --> 00:52:12,030 Takže nyní můžete vidět, proč tato výzva strcmp bude k nezdaru, 633 00:52:12,030 --> 00:52:21,650 protože vidíte, že se rozdělil CS50 a skály do dvou samostatných argumentů. 634 00:52:21,650 --> 00:52:27,250 V tomto okamžiku, jakmile jste hit zarážku, můžete pokračovat ke kroku prostřednictvím programu 635 00:52:27,250 --> 00:52:32,920 řádek po řádku, na rozdíl od spuštění programu znovu. 636 00:52:32,920 --> 00:52:35,520 Takže pokud nechcete začít svůj program znovu a prostě pokračovat dále, 637 00:52:35,520 --> 00:52:41,970 můžete použít příkaz continue a pokračovat bude spusťte program až do konce. 638 00:52:41,970 --> 00:52:45,010 Stejně jako to udělal tady. 639 00:52:45,010 --> 00:52:54,880 Nicméně, když jsem restartovat program, CS50 skály, zasáhne můj zarážku znovu, 640 00:52:54,880 --> 00:52:59,670 a tentokrát, když nechci prostě jít celou cestu přes zbytek programu, 641 00:52:59,670 --> 00:53:08,040 Mohu použít následující příkaz, který jsem také zkratka s n. 642 00:53:08,040 --> 00:53:12,960 A to bude krok prostřednictvím programu řádek po řádku. 643 00:53:12,960 --> 00:53:17,530 , Takže můžete sledovat, jak se věci vykonávat, jako změnit proměnné, jak se věci se aktualizace. 644 00:53:17,530 --> 00:53:21,550 Což je docela pěkné. 645 00:53:21,550 --> 00:53:26,570 Druhá super věc je, spíše než opakovat stejný příkaz znovu a znovu a znovu, 646 00:53:26,570 --> 00:53:30,670 pokud jste prostě zmáčknout Enter - tak tady vidíte, já jsem napsal v ničem - 647 00:53:30,670 --> 00:53:33,780 když jsem prostě zmáčknout Enter, bude opakovat předchozí příkaz, 648 00:53:33,780 --> 00:53:36,900 nebo předchozí GDB příkaz, který jsem dal dovnitř 649 00:53:36,900 --> 00:53:56,000 Můžu mít stisknutí klávesy Enter a nechám krokování můj kód řádek po řádku. 650 00:53:56,000 --> 00:53:59,310 Chtěl bych povzbudit vy jít podívat na další buggy programy stejně. 651 00:53:59,310 --> 00:54:01,330 Nemáme čas se dostat přes všechny z nich dnes v oddíle. 652 00:54:01,330 --> 00:54:05,890 Zdrojový kód je tam, takže můžete trochu vidět, co se děje 653 00:54:05,890 --> 00:54:07,730 v zákulisí, pokud vám opravdu přilepená, 654 00:54:07,730 --> 00:54:11,940 ale přinejmenším, jen cvičit bootování gdb, 655 00:54:11,940 --> 00:54:13,940 spuštění programu, dokud se zlomí na vás, 656 00:54:13,940 --> 00:54:18,260 získání backtrace, přijít na to, jakou funkci pád byl, 657 00:54:18,260 --> 00:54:24,450 jaký postoj to bylo na, tisk na některé hodnoty proměnných, 658 00:54:24,450 --> 00:54:30,140 jen tak budete mít pocit, pro to, protože to bude opravdu pomůže do budoucna. 659 00:54:30,140 --> 00:54:36,340 V tomto bodě, budeme ukončit z GDB, které udělat pomocí skončit, nebo jen q. 660 00:54:36,340 --> 00:54:40,460 Pokud váš program je uprostřed běhu stále, a to není ukončen, 661 00:54:40,460 --> 00:54:43,510 bude to vždy zeptat, "Jste si jisti, že opravdu chcete skončit?" 662 00:54:43,510 --> 00:54:48,770 Můžete stačí kliknout ano. 663 00:54:48,770 --> 00:54:55,250 >> Nyní budeme dívat na další problém, který máme, což je kočka program. 664 00:54:55,250 --> 00:54:59,880 Pokud se budete dívat z krátkodobého o přesměrování a potrubí, uvidíte, že Tommy používá tento program 665 00:54:59,880 --> 00:55:07,540 že v podstatě vytiskne všechny výstup souboru na obrazovku. 666 00:55:07,540 --> 00:55:12,660 Takže pokud jsem běžet kočku, tohle je vlastně vestavěný program spotřebiče, 667 00:55:12,660 --> 00:55:16,860 a pokud budete mít Macintoshe, můžete to udělat na počítači Mac taky, pokud si otevřete terminál. 668 00:55:16,860 --> 00:55:25,630 A my - kočka, řekněme, cp.c, a stiskněte klávesu Enter. 669 00:55:25,630 --> 00:55:29,640 Co to udělali, kdybychom posunout nahoru trochu a podívejte se, kde jsme spustili linku, 670 00:55:29,640 --> 00:55:40,440 nebo tam, kde jsme běželi příkazu cat, doslova jen vytisknout obsah cp.c naší obrazovce. 671 00:55:40,440 --> 00:55:44,140 Můžeme spustit znovu a vy můžete dát do více souborů dohromady. 672 00:55:44,140 --> 00:55:49,880 Takže si můžete udělat kočičí cp.c, a pak můžeme také zřetězit cat.c soubor, 673 00:55:49,880 --> 00:55:53,250 což je program, chystáme psát, 674 00:55:53,250 --> 00:55:58,140 a to bude tisknout na obě soubory zpět k sobě do našeho obrazovce. 675 00:55:58,140 --> 00:56:05,490 Takže pokud budeme pohybovat nahoru trochu, vidíme, že když jsme běželi tuto kočka cp.c, cat.c, 676 00:56:05,490 --> 00:56:17,110 Nejprve vytisknout ven cp soubor, a pak pod ním, to vytiskne se na cat.c soubor tady dole. 677 00:56:17,110 --> 00:56:19,650 Budeme používat toto jen dostat naše nohy mokré. 678 00:56:19,650 --> 00:56:25,930 Pohrajte si s jednoduchým potiskem na terminálu, viz, jak to funguje. 679 00:56:25,930 --> 00:56:39,170 Pokud jste otevření s gedit cat.c, Enter, 680 00:56:39,170 --> 00:56:43,760 můžete vidět program, že jsme o tom psát. 681 00:56:43,760 --> 00:56:48,980 Jsme součástí toto pěkné kotle desku, takže nemusíte trávit čas psát všechny ty ven. 682 00:56:48,980 --> 00:56:52,310 Jsme také zkontrolovat počet argumentů předaných palců 683 00:56:52,310 --> 00:56:56,910 Jsme vytisknout pěkné zprávu o použití. 684 00:56:56,910 --> 00:57:00,950 >> To je jedna z těch věcí, které opět, stejně jako jsme se bavili, 685 00:57:00,950 --> 00:57:04,490 je to skoro jako svalové paměti. 686 00:57:04,490 --> 00:57:07,190 Jen pamatujte, že dělají stejný druh věcí 687 00:57:07,190 --> 00:57:11,310 a vždy vytisknout nějaký užitečných zprávy 688 00:57:11,310 --> 00:57:17,670 tak, aby lidé věděli, jak spustit svůj program. 689 00:57:17,670 --> 00:57:21,630 S kočkou, je to docela jednoduché, my jsme jen jít přes všechny různé argumenty 690 00:57:21,630 --> 00:57:24,300 , které byly předány do našeho programu, a budeme tisknout 691 00:57:24,300 --> 00:57:29,950 jejich obsah na obrazovku po jednom. 692 00:57:29,950 --> 00:57:35,670 Chcete-li tisknout soubory na obrazovku, budeme dělat něco velmi podobného 693 00:57:35,670 --> 00:57:38,120 na to, co jsme na konci testu. 694 00:57:38,120 --> 00:57:45,350 Na konci kvízu, že najmout programu, museli jsme otevřít soubor, 695 00:57:45,350 --> 00:57:48,490 a pak jsme museli tisknout. 696 00:57:48,490 --> 00:57:54,660 V tomto případě, budeme otevřít soubor, a budeme číst z něj místo. 697 00:57:54,660 --> 00:58:00,630 Pak budeme tisknout, místo do souboru, budeme tisknout na obrazovku. 698 00:58:00,630 --> 00:58:05,830 Takže tisku na obrazovku, kterou jste všichni udělal předtím s printf. 699 00:58:05,830 --> 00:58:08,290 Takže to není příliš bláznivé. 700 00:58:08,290 --> 00:58:12,190 Ale čtení souboru je trochu divný. 701 00:58:12,190 --> 00:58:17,300 Projdeme to trochu v čase. 702 00:58:17,300 --> 00:58:20,560 Pokud jste se vrátit k poslednímu problému na kvíz, problém 33, 703 00:58:20,560 --> 00:58:27,280 první řádek, že budeme dělat tady, otevření souboru, je velmi podobný tomu, co jsme dělali tam. 704 00:58:27,280 --> 00:58:36,370 Takže Stella, co dělá, že řádka vypadá takto, když jsme se otevřít soubor? 705 00:58:36,370 --> 00:58:47,510 [Stella] Capital FILE *, soubor - >> Dobře. >> - Je roven fopen. Jo >>. 706 00:58:47,510 --> 00:58:55,980 Což je v tomto případě? Je to v komentáři. 707 00:58:55,980 --> 00:59:06,930 >> Je to v komentáři? argv [i] a r? 708 00:59:06,930 --> 00:59:11,300 Přesně >>. Právo na. Takže Stella je naprosto pravdu. 709 00:59:11,300 --> 00:59:13,720 To je to, co řádek vypadá. 710 00:59:13,720 --> 00:59:19,670 Budeme si soubor proud proměnné, uložte je do souboru *, takže všechny čepice, 711 00:59:19,670 --> 00:59:25,720 FILE, *, a jméno této proměnné bude soubor. 712 00:59:25,720 --> 00:59:32,250 Jsme mohli nazvat, co se nám líbí. Mohli bychom říkat first_file, nebo file_i, co jsme chtěli. 713 00:59:32,250 --> 00:59:37,590 A pak název souboru byl přijat v na příkazovém řádku k tomuto programu. 714 00:59:37,590 --> 00:59:44,450 Tak to jsou uloženy v argv [i,] a pak budeme tento soubor otevřít v režimu pro čtení. 715 00:59:44,450 --> 00:59:48,100 Nyní, když jsme otevřeli soubor, co je ta věc, že ​​musíme vždy pamatovat na to 716 00:59:48,100 --> 00:59:52,230 když jsme otevřeli soubor? Zavřete jej. 717 00:59:52,230 --> 00:59:57,220 Tak Missy, jak jsme zavření souboru? 718 00:59:57,220 --> 01:00:01,020 [Missy] fclose (soubor) >> fclose (soubor). Přesně tak. 719 01:00:01,020 --> 01:00:05,340 Great. Dobře. Podíváme-li se na to, aby to komentář tady, 720 01:00:05,340 --> 01:00:11,940 říká, "Open argv [i] a vytisknout obsah na standardní výstup." 721 01:00:11,940 --> 01:00:15,460 >> Standardní out je divné jméno. Stdout je jen náš způsob, jak říct 722 01:00:15,460 --> 01:00:22,880 chceme tisknout do terminálu, chceme vytisknout na standardní výstupní proud. 723 01:00:22,880 --> 01:00:26,450 Můžeme skutečně zbavit tento komentář tady. 724 01:00:26,450 --> 01:00:36,480 Budu zkopírovat a vložit jej protože to je to, co jsme udělali. 725 01:00:36,480 --> 01:00:41,290 V tomto bodě, teď máme číst soubor kousek po kousku. 726 01:00:41,290 --> 01:00:46,300 Jsme diskutovali několik způsobů čtení souborů. 727 01:00:46,300 --> 01:00:51,830 Které z nich jsou vaše oblíbené tak daleko? 728 01:00:51,830 --> 01:00:57,960 Jakými způsoby jste viděli, nebo si pamatovat, číst? 729 01:00:57,960 --> 01:01:04,870 [Daniel] fread? >> Fread? Takže fread je jeden. Jimmy, víte nějaké další? 730 01:01:04,870 --> 01:01:12,150 [Jimmy] No >> Dobře. Ne. Charlotte? Alexander? Nějaké další? Dobře. 731 01:01:12,150 --> 01:01:20,740 Takže ty ostatní jsou fgetc, je ten, který budeme používat hodně. 732 01:01:20,740 --> 01:01:26,410 K dispozici je také fscanf; vy vidět vzor zde? 733 01:01:26,410 --> 01:01:29,170 Všichni začínají s f. Cokoliv, co dělat se souborem. 734 01:01:29,170 --> 01:01:35,260 Tam je fread, fgetc, fscanf. Toto jsou všechny čtecích funkcí. 735 01:01:35,260 --> 01:01:49,120 Pro psaní máme fwrite, máme fputc místo fgetc. 736 01:01:49,120 --> 01:01:58,250 Máme také fprintf jako jsme viděli na kvíz. 737 01:01:58,250 --> 01:02:01,680 Jelikož se jedná o problém, který se týká čtení ze souboru, 738 01:02:01,680 --> 01:02:04,940 budeme používat jeden z těchto tří funkcí. 739 01:02:04,940 --> 01:02:10,890 Nebudeme používat tyto funkce tady dole. 740 01:02:10,890 --> 01:02:14,880 Tyto funkce jsou všechny nalezené ve standardním I / O knihovny. 741 01:02:14,880 --> 01:02:17,510 Takže když se podíváte na horní části tohoto programu, 742 01:02:17,510 --> 01:02:24,110 můžete vidět, že jsme již zahrnuty hlavičkový soubor pro standardní I / O knihovny. 743 01:02:24,110 --> 01:02:27,120 Chceme-li zjistit, který z nich chceme použít, 744 01:02:27,120 --> 01:02:29,690 můžeme vždy otevřít manuálové stránky. 745 01:02:29,690 --> 01:02:34,350 Takže můžeme psát man stdio 746 01:02:34,350 --> 01:02:43,180 a přečtěte si vše o stdio vstupních a výstupních funkcí v C 747 01:02:43,180 --> 01:02:49,870 A už můžeme vidět oh, podívej. Je to zmínit fgetc, to zmínit fputc. 748 01:02:49,870 --> 01:02:57,220 Takže můžete vrtat se trochu a podívejte se na, řekněme, fgetc 749 01:02:57,220 --> 01:03:00,060 a podívejte se na jeho manuálové stránce. 750 01:03:00,060 --> 01:03:03,430 Můžete vidět, že to jde ruku v ruce s celou partou dalších funkcí: 751 01:03:03,430 --> 01:03:12,640 fgetc, fgets, getc, getchar, dostane, ungetc, a jeho vstup znaků a řetězců. 752 01:03:12,640 --> 01:03:19,180 Tak to je, jak čteme ve znacích a řetězce ze souboru ze standardního vstupu, 753 01:03:19,180 --> 01:03:21,990 který je v podstatě od uživatele. 754 01:03:21,990 --> 01:03:24,780 A to je, jak to děláme ve skutečném C. 755 01:03:24,780 --> 01:03:30,850 Takže to nepoužívá GetString a getchar funkcí 756 01:03:30,850 --> 01:03:36,840 že jsme použili z CS50 knihovny. 757 01:03:36,840 --> 01:03:39,710 Budeme dělat tento problém v několika způsoby 758 01:03:39,710 --> 01:03:43,430 takže můžete vidět dva různé způsoby, jak dělat to. 759 01:03:43,430 --> 01:03:48,490 Oba fread funkce, které Daniel zmínil a fgetc jsou dobré způsoby, jak to udělat. 760 01:03:48,490 --> 01:03:53,790 Myslím, že fgetc je trochu jednodušší, protože je to jen má, jak vidíte, 761 01:03:53,790 --> 01:03:59,660 jeden argument, soubor *, že se snažíme číst 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 matoucí, že jo? 764 01:04:05,610 --> 01:04:11,450 >> Protože jsme stále charakter, tak proč není tento návrat char? 765 01:04:11,450 --> 01:04:18,700 Vy máte nějaké nápady, proč je toto nemusí vrátit char? 766 01:04:18,700 --> 01:04:25,510 [Missy odpovědi, nesrozumitelné] >> Jo. Takže Missy je naprostou pravdu. 767 01:04:25,510 --> 01:04:31,570 Pokud je to ASCII, pak celé číslo může být mapována na skutečné char. 768 01:04:31,570 --> 01:04:33,520 Mohlo by to být ASCII znak, a to je pravda. 769 01:04:33,520 --> 01:04:36,220 To je přesně to, co se děje. 770 01:04:36,220 --> 01:04:39,190 Používáme int prostě proto, že má více bitů. 771 01:04:39,190 --> 01:04:44,750 Je to větší než char; naše char má pouze 8 bitů, které 1 byte na našich 32-bitových strojích. 772 01:04:44,750 --> 01:04:48,520 A int má hodnotu všech 4 bytů "prostoru. 773 01:04:48,520 --> 01:04:50,940 A ukázalo se, že způsob, jakým fgetc funguje, 774 01:04:50,940 --> 01:04:53,940 pokud bychom posunout dolů v našem přehledu v této manuálové stránce trochu, 775 01:04:53,940 --> 01:05:05,000 rolovat celou cestu dolů. Ukazuje se, že použití tohoto zvláštního hodnotu s názvem EOF. 776 01:05:05,000 --> 01:05:09,640 Je to zvláštní konstantu jako návratová hodnota funkce fgetc 777 01:05:09,640 --> 01:05:14,570 když narazí na konec souboru, nebo pokud se vyskytne chyba. 778 01:05:14,570 --> 01:05:18,170 A ukázalo se, že k tomu tyto srovnání s EOF správně, 779 01:05:18,170 --> 01:05:24,060 Chcete-li mít extra množství informací, které máte v int 780 01:05:24,060 --> 01:05:28,420 na rozdíl od použití char proměnné. 781 01:05:28,420 --> 01:05:32,130 I když fgetc je skutečně dostat znak ze souboru, 782 01:05:32,130 --> 01:05:38,450 si chcete zapamatovat, že se vrací něco, co je typu int na vás. 783 01:05:38,450 --> 01:05:41,360 To znamená, že je to docela snadné. 784 01:05:41,360 --> 01:05:44,960 Je nám dá charakter, takže vše, co musíte udělat, je pořád ptají soubor, 785 01:05:44,960 --> 01:05:48,440 "Dej mi další znak, dej mi další znak, dej mi další znak," 786 01:05:48,440 --> 01:05:51,400 dokud se na konec souboru. 787 01:05:51,400 --> 01:05:54,730 A to bude tahat v jednom znaku v době od našeho souboru, 788 01:05:54,730 --> 01:05:56,250 a pak můžeme dělat, co chceme s ní. 789 01:05:56,250 --> 01:06:00,160 Můžeme uložit, můžeme přidat na řetězec, můžeme ji vytisknout. 790 01:06:00,160 --> 01:06:04,630 Dělat nic z toho. 791 01:06:04,630 --> 01:06:09,600 >> Zvětšení zpátky a jít zpátky do našeho cat.c programu, 792 01:06:09,600 --> 01:06:16,170 pokud budeme používat fgetc, 793 01:06:16,170 --> 01:06:21,710 jak bychom mohli přistupovat k tomuto další řádek kódu? 794 01:06:21,710 --> 01:06:26,020 Budeme používat - fread bude dělat něco trochu jiného. 795 01:06:26,020 --> 01:06:32,600 A tentokrát, jsme jen tak použít fgetc dostat jeden znak v čase. 796 01:06:32,600 --> 01:06:40,910 Chcete-li zpracovat celý soubor, možná to, co máme dělat? 797 01:06:40,910 --> 01:06:44,030 Kolik znaků je tam v souboru? 798 01:06:44,030 --> 01:06:47,390 Existuje mnoho. Takže budete pravděpodobně chtít, aby si jeden 799 01:06:47,390 --> 01:06:49,860 a pak se další a získat další a získat další. 800 01:06:49,860 --> 01:06:53,330 Jaký druh algoritmu si myslíš, že možná budeme muset použít tu? 801 01:06:53,330 --> 01:06:55,470 Jaký typ -? [Alexander] pro smyčce? Přesně >>. 802 01:06:55,470 --> 01:06:57,500 Nějaký typ smyčky. 803 01:06:57,500 --> 01:07:03,380 Pro smyčky, je ve skutečnosti velký, v tomto případě. 804 01:07:03,380 --> 01:07:08,620 A jak jsi říkal, že to zní jako chcete smyčku přes celý soubor, 805 01:07:08,620 --> 01:07:11,820 dostat po znacích. 806 01:07:11,820 --> 01:07:13,850 Nějaké návrhy na to, co by mohla vypadat? 807 01:07:13,850 --> 01:07:22,090 [Alexander, nesrozumitelným] 808 01:07:22,090 --> 01:07:30,050 Dobře >>, jen mi řekni, v angličtině to, co se snažíte udělat? [Alexander, nesrozumitelným] 809 01:07:30,050 --> 01:07:36,270 Takže v tomto případě, to zní, jako bychom jen snažíte smyčky přes celý soubor. 810 01:07:36,270 --> 01:07:45,330 [Alexander] Tak i > Velikost -? 811 01:07:45,330 --> 01:07:49,290 Myslím, že velikost souboru, ne? Velikost - Dáme jen napsat to takhle. 812 01:07:49,290 --> 01:07:57,470 Velikost souboru pro bytí času, i + +. 813 01:07:57,470 --> 01:08:04,610 Tak to dopadá, že způsob, jakým to uděláte pomocí fgetc, a to je nové, 814 01:08:04,610 --> 01:08:10,460 je to, že neexistuje žádný jednoduchý způsob, jak jen dostat velikost souboru 815 01:08:10,460 --> 01:08:16,979 s tímto "sizeof" typu konstrukce, které jste předtím neviděli. 816 01:08:16,979 --> 01:08:20,910 Když použijeme tuto fgetc funkci, jsme zavádí nějaký 817 01:08:20,910 --> 01:08:29,069 nové, funky syntax to pro smyčce, kde namísto použití jen základní počítadlo 818 01:08:29,069 --> 01:08:33,920 jít znak po znaku, budeme tahat jeden znak v době, 819 01:08:33,920 --> 01:08:37,120 jeden znak v době, a způsob, jakým my víme, že jsme na konci 820 01:08:37,120 --> 01:08:41,290 není, když jsme napočítali určitý počet znaků, 821 01:08:41,290 --> 01:08:49,939 ale když postava se vytáhnout, je, že zvláštní konec souboru znak. 822 01:08:49,939 --> 01:08:58,689 Tak jsme to udělat - já ji nazývám tuto ch, a budeme ji inicializovat 823 01:08:58,689 --> 01:09:08,050 s naší první výzvy, aby si první znak z souboru. 824 01:09:08,050 --> 01:09:14,979 Takže této části přímo zde, to dostane znak z souboru 825 01:09:14,979 --> 01:09:20,840 a uložit jej do proměnné ch. 826 01:09:20,840 --> 01:09:25,420 Budeme to dělat tak dlouho, dokud se dostaneme na konec souboru, 827 01:09:25,420 --> 01:09:41,170 které děláme při testování na charakteru nesmí je rovna k této zvláštní povaze OSZ. 828 01:09:41,170 --> 01:09:48,750 A pak místo toho, aby dělal ch + +, který by jen zvyšovat hodnotu, 829 01:09:48,750 --> 01:09:52,710 takže pokud čteme o A ven spisu, kapitál, řekněme, 830 01:09:52,710 --> 01:09:56,810 ch + + by nám b, a pak bychom si C a pak d. 831 01:09:56,810 --> 01:09:59,310 To zjevně není to, co chceme. To, co chceme zde 832 01:09:59,310 --> 01:10:05,830 v tomto posledním bitu je chceme získat další znak ze souboru. 833 01:10:05,830 --> 01:10:09,500 >> Tak jak bychom mohli získat další znak ze souboru? 834 01:10:09,500 --> 01:10:13,470 Jak se dostat na první znak ze souboru? 835 01:10:13,470 --> 01:10:17,200 [Student] fgetfile? >> Fgetc, nebo, je mi líto, že jsi naprostou pravdu. 836 01:10:17,200 --> 01:10:20,470 I chybně to tam. Tak jo. 837 01:10:20,470 --> 01:10:26,240 Zde místo provádění ch + +, 838 01:10:26,240 --> 01:10:29,560 jsme jen tak zavolat fgetc (soubor) znovu 839 01:10:29,560 --> 01:10:39,180 a uložit výsledek v naší stejném ch proměnné. 840 01:10:39,180 --> 01:10:43,730 [Student otázka, nesrozumitelným] 841 01:10:43,730 --> 01:10:52,390 >> To je místo, kde tito lidé soubor * jsou zvláštní. 842 01:10:52,390 --> 01:10:59,070 Způsob jejich práce je, že - při prvním otevření - při prvním dělat, že fopen volání, 843 01:10:59,070 --> 01:11:04,260 FILE * účinně slouží jako ukazatel na začátek souboru. 844 01:11:04,260 --> 01:11:12,830 A pak pokaždé, když volání fgetc, to se pohybuje jeden znak v souboru. 845 01:11:12,830 --> 01:11:23,280 Takže pokaždé, když říkáš, že jste zvyšování ukazatel souboru o jeden znak. 846 01:11:23,280 --> 01:11:26,210 A když fgetc znovu, se stěhujete to jiný charakter 847 01:11:26,210 --> 01:11:28,910 a jiný charakter a jiný charakter a jiný znak. 848 01:11:28,910 --> 01:11:32,030 [Student otázka, nesrozumitelné] >> A to je - ano. 849 01:11:32,030 --> 01:11:34,810 Je to druh této magie pod kapotou. 850 01:11:34,810 --> 01:11:37,930 Stačí držet zvyšování prostřednictvím. 851 01:11:37,930 --> 01:11:46,510 V tomto bodě, jste schopni skutečně pracovat s charakterem. 852 01:11:46,510 --> 01:11:52,150 Tak jak bychom mohli vytisknout na obrazovku, teď? 853 01:11:52,150 --> 01:11:58,340 Můžeme použít stejný printf věc, kterou jsme použili předtím. 854 01:11:58,340 --> 01:12:00,330 To jsme byli s využitím všech semestr. 855 01:12:00,330 --> 01:12:05,450 Můžeme zavolat printf, 856 01:12:05,450 --> 01:12:21,300 a můžeme předat v charakteru, stejně jako to. 857 01:12:21,300 --> 01:12:27,430 Dalším způsobem, jak to udělat, je spíše než pomocí printf a mají co do činění tento formát řetězce, 858 01:12:27,430 --> 01:12:29,490 můžeme také použít jeden z dalších funkcí. 859 01:12:29,490 --> 01:12:40,090 Můžeme použít fputc, která tiskne znak na obrazovce, 860 01:12:40,090 --> 01:12:52,580 s výjimkou, pokud se podíváme na fputc - dovolte mi vzdálíte trochu. 861 01:12:52,580 --> 01:12:56,430 Vidíme to, co je pěkné, je to má v povaze, že čteme s použitím fgetc, 862 01:12:56,430 --> 01:13:05,100 ale pak musíme dát jí proud se bude tisknout. 863 01:13:05,100 --> 01:13:11,850 Můžeme také použít putchar funkci, která bude klást přímo na standardní výstup. 864 01:13:11,850 --> 01:13:16,070 Takže tam jsou celá parta různých možností, které můžeme použít pro tisk. 865 01:13:16,070 --> 01:13:19,580 Všichni jsou ve standardním I / O knihovny. 866 01:13:19,580 --> 01:13:25,150 Kdykoliv budete chtít vytisknout - to printf, ve výchozím nastavení, bude tisknout na speciální normy ven proudu, 867 01:13:25,150 --> 01:13:27,910 který je, že stdout. 868 01:13:27,910 --> 01:13:41,300 Takže můžeme jen odkazovat se na to jako druh tohoto kouzelného hodnoty, stdout zde. 869 01:13:41,300 --> 01:13:48,410 Chybička se vloudila. Dejte středník mimo. 870 01:13:48,410 --> 01:13:52,790 >> To je hodně nových, funky informací zde. 871 01:13:52,790 --> 01:13:58,600 Mnoho z toho je velmi idiomatická, v tom smyslu, že je to kód 872 01:13:58,600 --> 01:14:05,700 , který je psán tato cesta jen proto, že je to čistý číst, snadno čitelný. 873 01:14:05,700 --> 01:14:11,520 Existuje mnoho různých způsobů, jak to udělat, mnoho různých funkcí, které můžete použít, 874 01:14:11,520 --> 01:14:14,680 ale máme tendenci postupujte podle následujících stejné vzorce znovu a znovu. 875 01:14:14,680 --> 01:14:20,180 Takže nebuďte překvapeni, když uvidíte kód, jako to přichází znovu a znovu. 876 01:14:20,180 --> 01:14:25,690 Dobrá. V tomto bodě, musíme zlomit na den. 877 01:14:25,690 --> 01:14:31,300 Díky, že jste přišli. Díky za sledování, pokud jste on-line. A uvidíme se příští týden. 878 01:14:31,300 --> 01:14:33,890 [CS50.TV]