1 00:00:00,000 --> 00:00:02,730 [Powered by Google Translate] [5. SZAKASZ: kevésbé kényelmes] 2 00:00:02,730 --> 00:00:05,180 [Nate Hardison, Harvard University] 3 00:00:05,180 --> 00:00:08,260 [Ez a CS50.] [CS50.TV] 4 00:00:08,260 --> 00:00:11,690 Szóval szívesen vissza, srácok. 5 00:00:11,690 --> 00:00:16,320 Üdvözöljük a 5. szakasz. 6 00:00:16,320 --> 00:00:20,220 Ezen a ponton, miután befejezte kvíz 0, és miután látta, hogy hogyan tettél, 7 00:00:20,220 --> 00:00:25,770 remélhetőleg úgy érzi, nagyon jó, mert én nagyon lenyűgözött a pontszámok ebben a fejezetben. 8 00:00:25,770 --> 00:00:28,050 Az online nézők, már volt egy pár kérdést 9 00:00:28,050 --> 00:00:33,680 az utolsó két probléma a probléma set - vagy a kvíz, inkább. 10 00:00:33,680 --> 00:00:39,690 Szóval megyek át ezen nagyon gyorsan, hogy mindenki látja, hogy mi történt 11 00:00:39,690 --> 00:00:45,060 és hogyan, hogy menjen át a tényleges megoldás nem csak megtekintők a megoldás is. 12 00:00:45,060 --> 00:00:50,330 Fogunk menni az elmúlt néhány probléma nagyon gyorsan, 32 és 33. 13 00:00:50,330 --> 00:00:53,240 Csak, ismét úgy, hogy az on-line nézők láthatja ezt. 14 00:00:53,240 --> 00:00:59,080 >> Ha viszont a probléma 32, amely a 13. oldalon, 15 00:00:59,080 --> 00:01:02,730 16-ból 13, a probléma 32 szól swap. 16 00:01:02,730 --> 00:01:05,010 Ez volt minden a csere két egész szám. 17 00:01:05,010 --> 00:01:08,740 Ez az a probléma, hogy mi volna ment egy pár alkalommal előadás. 18 00:01:08,740 --> 00:01:13,590 És itt, mit is kér tőled egy gyors memória nyom. 19 00:01:13,590 --> 00:01:17,000 Ahhoz, hogy írja be az értékeket a változók, mivel azok a verem 20 00:01:17,000 --> 00:01:20,250 mivel a kód megy keresztül ez a csere funkciót. 21 00:01:20,250 --> 00:01:24,500 Különösen az, amit keresünk - Megyek, hogy ezt az iPad le - 22 00:01:24,500 --> 00:01:29,650 különösen az, amit keresünk ez a vonal száma pedig 6 itt. 23 00:01:29,650 --> 00:01:36,740 És ez számozott 6 mindössze szomszédsági az előző probléma. 24 00:01:36,740 --> 00:01:41,720 Mit akarunk csinálni a megjelenítéséhez vagy a címkét az állam a memória 25 00:01:41,720 --> 00:01:46,090 mivel abban az időben, amikor végre ezt a sort a 6, 26 00:01:46,090 --> 00:01:52,540 amely gyakorlatilag a visszatérés a mi-swap funkció itt. 27 00:01:52,540 --> 00:01:59,450 Ha lapozzunk ide, láttuk, hogy a cím mindent a memóriában nyújtottak számunkra. 28 00:01:59,450 --> 00:02:02,540 Ez nagyon kulcs, akkor gyere vissza rá, csak egy pillanatra. 29 00:02:02,540 --> 00:02:09,240 És akkor itt lent az alján volt egy kevés memóriát diagram, hogy fogunk hivatkozni. 30 00:02:09,240 --> 00:02:12,490 Én ténylegesen elvégzett ezt ki az én iPad. 31 00:02:12,490 --> 00:02:20,720 Szóval megyek helyettesítheti között oda-vissza az iPad, és ezt a kódot csak a hivatkozás. 32 00:02:20,720 --> 00:02:26,540 >> Kezdjük. Először is, hadd összpontosítani az első pár sor a fő itt. 33 00:02:26,540 --> 00:02:30,220 Elindításához, megyünk inicializálni x 1 és y 2-re. 34 00:02:30,220 --> 00:02:33,040 Tehát van két integer változó, ők mindketten fogják helyezni a verem. 35 00:02:33,040 --> 00:02:36,050 Megyünk, hogy egy 1-es és a 2 bennük. 36 00:02:36,050 --> 00:02:43,150 Szóval, ha átfordítja az én iPad, remélhetőleg, lássuk - 37 00:02:43,150 --> 00:02:48,660 Apple TV tükrözés, és ott is vagyunk. Oké. 38 00:02:48,660 --> 00:02:51,670 Szóval, ha átfordítja az én iPad, 39 00:02:51,670 --> 00:02:56,220 Azt akarom, hogy inicializálni x 1 és y 2-re. 40 00:02:56,220 --> 00:03:00,580 Tesszük, hogy egész egyszerűen írt egy 1 a doboz jelölt x 41 00:03:00,580 --> 00:03:07,730 és a 2-ben a mezőben megjelölt y. Meglehetősen egyszerű. 42 00:03:07,730 --> 00:03:11,620 És most térjünk vissza a laptop, mi történik ezután. 43 00:03:11,620 --> 00:03:15,810 Tehát ez a következő sort, ahol a dolgok trükkös. 44 00:03:15,810 --> 00:03:28,110 Elhaladunk a címét x és címét y, mint a és b paraméterekkel jellemzett, hogy a swap funkciót. 45 00:03:28,110 --> 00:03:32,380 A cím az x és az y címét olyan dolgok, amiket nem tudunk számítani 46 00:03:32,380 --> 00:03:36,360 hivatkozás nélkül ezeket pontokba szedve itt lent. 47 00:03:36,360 --> 00:03:39,750 És szerencsére az első két pontokba szedve mondja el pontosan, mi a válasz. 48 00:03:39,750 --> 00:03:44,740 A címe x memória 10, és címe y memória 14. 49 00:03:44,740 --> 00:03:51,870 Tehát ezek azok az értékek, amelyek teljesen telt el, mint az a és b top up a mi csere funkciót. 50 00:03:51,870 --> 00:04:00,760 Tehát újra, kapcsoló vissza a diagram, írhatok egy 10 egy 51 00:04:00,760 --> 00:04:07,400 és egy 14 b. 52 00:04:07,400 --> 00:04:11,610 Nos, ez a pont, ahol folytathatja a csere. 53 00:04:11,610 --> 00:04:14,520 Szóval essek vissza a laptop újra, 54 00:04:14,520 --> 00:04:21,079 azt látjuk, hogy az utat a csere működik, először dereference a és tárolja az eredményt tmp. 55 00:04:21,079 --> 00:04:27,650 Tehát a dereference üzemeltető azt mondja, "Hé. Kezeljük a változó tartalmának olyan, mint egy cím. 56 00:04:27,650 --> 00:04:33,830 Ide bármit tárolt arra a címre, és töltse azt. " 57 00:04:33,830 --> 00:04:41,720 Mit betölteni ki a változó fogja tárolni a mi tmp változó. 58 00:04:41,720 --> 00:04:45,150 Essek vissza az iPad. 59 00:04:45,150 --> 00:04:51,690 Ha elmegyünk a cím 10, tudjuk, hogy az a cím 10 varible x 60 00:04:51,690 --> 00:04:55,480 mert azt mondták, a mi felsorolási pont, hogy a címét x memória 10. 61 00:04:55,480 --> 00:05:00,180 Tehát ott, hogy az értékét is, amely 1, mint látjuk a mi iPad, 62 00:05:00,180 --> 00:05:06,300 és betölti azt a tmp. 63 00:05:06,300 --> 00:05:08,250 Ismét, ez nem a végleges tartalma. 64 00:05:08,250 --> 00:05:14,350 Elmegyünk séta, és mi lesz a mi végső állapotát a program végén. 65 00:05:14,350 --> 00:05:17,210 De most már az 1-es érték tárolt tmp. 66 00:05:17,210 --> 00:05:19,210 >> És van egy gyors kérdés itt. 67 00:05:19,210 --> 00:05:23,980 [Alexander] Az dereference üzemben -, hogy ez csak a csillag láttára a változó? 68 00:05:23,980 --> 00:05:27,600 >> Igen. Tehát a dereference üzemeltető, ahogy fordítsa vissza a laptop ismét 69 00:05:27,600 --> 00:05:33,780 ez a csillag közvetlenül az épület előtt. 70 00:05:33,780 --> 00:05:37,460 Ebben az értelemben, hogy - ha szembeállítani azt a szorzás operátor 71 00:05:37,460 --> 00:05:42,400 amely előírja két dolgot, a dereference operátor egy egyoperandusú operátor. 72 00:05:42,400 --> 00:05:46,130 Csak alkalmazni egy érték, szemben az egy bináris operátor, 73 00:05:46,130 --> 00:05:48,810 ahol alkalmazni két különböző értékeket. 74 00:05:48,810 --> 00:05:52,080 Szóval ez az, hogy mi történik ebben a sorban. 75 00:05:52,080 --> 00:05:58,390 Mi betöltve az érték 1 és tárolt be mi ideiglenes integer változó. 76 00:05:58,390 --> 00:06:05,800 A következő sorban, tároljuk a tartalmát ab-ba - 77 00:06:05,800 --> 00:06:12,630 vagy inkább tárolunk a tartalmát, hogy b mutat, hogy a hely, ahol az is mutat. 78 00:06:12,630 --> 00:06:17,690 Ha elemezzük ezt a jobbról balra, fogunk dereference b, 79 00:06:17,690 --> 00:06:23,580 fogunk foglalkozni 14, fogunk megragad az egész, hogy ott van, 80 00:06:23,580 --> 00:06:26,900 majd fogunk menni a cím 10, 81 00:06:26,900 --> 00:06:34,240 és mi lesz, hogy dobja az eredmény a mi dereference az ab-ba, hogy a tér. 82 00:06:34,240 --> 00:06:40,080 Flipping vissza az iPad, ha tudjuk, hogy ez egy kicsit konkrétabb, 83 00:06:40,080 --> 00:06:44,070 talán segít, ha írok számokat az összes cím itt. 84 00:06:44,070 --> 00:06:53,820 Tehát tudjuk, hogy y vagyunk címen 14, x címen 10. 85 00:06:53,820 --> 00:07:00,180 Mikor kezdődnek b, akkor b dereference, megyünk, hogy megragad a 2 értéket. 86 00:07:00,180 --> 00:07:08,320 Fogjuk, hogy megragad ez az érték, mert ez az az érték, hogy él címen 14. 87 00:07:08,320 --> 00:07:15,700 És mi lesz, hogy azt a változót, hogy él címen 10, 88 00:07:15,700 --> 00:07:19,160 ami ott van, amely megfelel a változó x. 89 00:07:19,160 --> 00:07:21,810 Így nem tehetünk egy kicsit felülírja itt 90 00:07:21,810 --> 00:07:35,380 ahol megszabadulni a 1-es és helyette írunk a 2. 91 00:07:35,380 --> 00:07:39,560 Szóval minden jó, és jó a világban, még akkor is volna felülírja x most. 92 00:07:39,560 --> 00:07:44,890 Van tárolt x régi értéke a tmp változó. 93 00:07:44,890 --> 00:07:50,210 Így tudjuk befejezni a csere a következő sorban. 94 00:07:50,210 --> 00:07:53,030 Flipping vissza a laptop. 95 00:07:53,030 --> 00:07:58,150 Most minden marad az, hogy a tartalom a mi ideiglenes integer változó 96 00:07:58,150 --> 00:08:05,630 és tárolja őket a változó, hogy él a címen, hogy b tartja. 97 00:08:05,630 --> 00:08:10,230 Szóval megyünk hatékonyan dereference b kap hozzáférést a változó 98 00:08:10,230 --> 00:08:14,340 ez a cím, hogy b tartja benne, 99 00:08:14,340 --> 00:08:19,190 és mi lesz a cucc az érték tmp tartja bele. 100 00:08:19,190 --> 00:08:23,280 Essek vissza az iPad még egyszer. 101 00:08:23,280 --> 00:08:31,290 Tudom törölni ezt az értéket itt, 2, 102 00:08:31,290 --> 00:08:41,010 és ehelyett mi másolja 1 jobb bele. 103 00:08:41,010 --> 00:08:43,059 Aztán a következő sorban, amely végrehajtja, természetesen - 104 00:08:43,059 --> 00:08:47,150 ha fordítsa vissza a laptop - ez a 6 pont, 105 00:08:47,150 --> 00:08:52,500 amely az a pont, amit akartam, hogy a diagram teljesen kitölteni. 106 00:08:52,500 --> 00:08:58,940 Szóval essek vissza az iPad még egyszer, csak így láthatja az elkészült diagram, 107 00:08:58,940 --> 00:09:06,610 akkor láthatjuk, hogy van egy 10-a, a 14-ben b, 1 a tmp, a 2 x-ben, és egy 1-y. 108 00:09:06,610 --> 00:09:11,000 Van bármilyen kérdése van ezzel? 109 00:09:11,000 --> 00:09:14,640 Van ennek több értelme van, miután belépett rajta? 110 00:09:14,640 --> 00:09:24,850 Győződjön kevesebb értelme? Remélhetőleg nem. Oké. 111 00:09:24,850 --> 00:09:28,230 >> Mutatók egy nagyon bonyolult téma. 112 00:09:28,230 --> 00:09:33,420 Az egyik srác, akikkel együtt dolgozunk egy nagyon gyakori mondás: 113 00:09:33,420 --> 00:09:36,590 "Ahhoz, hogy megértsük mutató, először meg kell értenie mutatók." 114 00:09:36,590 --> 00:09:40,530 Ami szerintem nagyon igaz. Ez nem fog egy darabig, hogy szokni. 115 00:09:40,530 --> 00:09:45,360 Rajza sok képeket, sorshúzással memóriát diagramok, mint ez nagyon hasznosnak 116 00:09:45,360 --> 00:09:49,480 és után séta után például Például után például, 117 00:09:49,480 --> 00:09:54,450 ez lesz kezdeni, hogy egy kicsit több értelme van, és egy kicsit több értelme van, és egy kicsit több értelme van. 118 00:09:54,450 --> 00:10:01,560 Végül, egy nap, akkor is mindent teljesen elsajátította. 119 00:10:01,560 --> 00:10:13,800 Van még kérdése mielőtt lépni a következő probléma? Rendben van. 120 00:10:13,800 --> 00:10:18,840 Így fordítsa vissza a laptop. 121 00:10:18,840 --> 00:10:23,300 A következő probléma van a gond 33-a fájl I / O 122 00:10:23,300 --> 00:10:26,350 Nagyítás ezen egy kicsit. 123 00:10:26,350 --> 00:10:28,710 Probléma 33 - Igen? 124 00:10:28,710 --> 00:10:32,110 >> [Daniel] Csak volt egy gyors kérdés. Ez a csillag, vagy a csillag, 125 00:10:32,110 --> 00:10:35,590 ezt hívják dereferencing, ha egy csillag előtt. 126 00:10:35,590 --> 00:10:38,820 Hogy is hívják, amikor a jel előtt? 127 00:10:38,820 --> 00:10:43,140 >> A jel előtt a cím-operátorral. 128 00:10:43,140 --> 00:10:45,880 Szóval lapozzunk vissza. 129 00:10:45,880 --> 00:10:49,310 Hoppá. Én zoom módban, így nem tudok igazán lapozzunk. 130 00:10:49,310 --> 00:10:52,780 Ha megnézzük ezt a kódot nagyon gyorsan itt, 131 00:10:52,780 --> 00:10:54,980 megint ugyanaz a dolog történik. 132 00:10:54,980 --> 00:10:59,180 Ha megnézzük ezt a kódot itt, ezen a vonalon, ahol a hívás a swap, 133 00:10:59,180 --> 00:11:10,460 A jelet éppen azt mondja: "kap a cím, ahol x változó életét." 134 00:11:10,460 --> 00:11:14,460 Amikor a fordító lefordítja a kódot, 135 00:11:14,460 --> 00:11:20,590 azt, hogy ténylegesen fizikailag jelölik ki a helyet a memóriában az összes változót élni. 136 00:11:20,590 --> 00:11:24,910 És igen, mi a fordító ezután csinálni, ha ez összeállított mindent, 137 00:11:24,910 --> 00:11:31,110 tudja: "Ó, tettem x címen 10-ig. raktam y címen 14." 138 00:11:31,110 --> 00:11:34,640 Ez majd töltse ki ezeket az értékeket az Ön számára. 139 00:11:34,640 --> 00:11:44,740 Így aztán - ez azután tovább tudja adni ezt, és át-és y-ban is. 140 00:11:44,740 --> 00:11:50,730 Ezek a srácok a címet, de azt is, amikor át azokat a swap funkciót, 141 00:11:50,730 --> 00:11:55,690 Az ilyen típusú információkat, ez int * itt, azt mondja a fordító, 142 00:11:55,690 --> 00:12:01,350 "Oké, mi lesz tolmácsolás ezt a címet, mint a címe, egy egész változó." 143 00:12:01,350 --> 00:12:05,900 Mivel a címben szereplő Int, amely különbözik a címét egy karakter változó 144 00:12:05,900 --> 00:12:09,930 mert egy int vesz fel, egy 32-bites gép vesz fel 4 byte helyet, 145 00:12:09,930 --> 00:12:13,310 mivel a karakter csak akkor vesz fel 1 byte helyet. 146 00:12:13,310 --> 00:12:17,310 Ezért fontos tudni azt is, mi az -, amit él, milyen típusú értéket 147 00:12:17,310 --> 00:12:20,340 él a címen, hogy van telt be 148 00:12:20,340 --> 00:12:22,020 Vagy a címet, hogy te dolgod. 149 00:12:22,020 --> 00:12:29,020 Így, tudod, hogy hány bájt az információk ténylegesen betölteni ki a RAM. 150 00:12:29,020 --> 00:12:31,780 És akkor, igen, ez dereference operátor, mint te is azt kérdezi, 151 00:12:31,780 --> 00:12:37,200 megy, és hozzáfér információk egy adott címet. 152 00:12:37,200 --> 00:12:42,820 Szóval azt mondja, ezzel a változó van, kezeli a tartalma, mint egy cím, 153 00:12:42,820 --> 00:12:47,880 megy, hogy a cím, és húzza ki töltse be a processzor terhelés egy nyilvántartásba 154 00:12:47,880 --> 00:12:56,340 a tényleges értékek vagy a tartalom élnek az adott címre. 155 00:12:56,340 --> 00:12:59,620 Van még kérdés? Ezek jó kérdések. 156 00:12:59,620 --> 00:13:01,650 Ez egy csomó új terminológia is. 157 00:13:01,650 --> 00:13:09,800 Ez is egyfajta funky, látás-és a * különböző helyeken. 158 00:13:09,800 --> 00:13:13,180 >> Rendben van. 159 00:13:13,180 --> 00:13:18,530 Szóval vissza a probléma 33, Fájl I / O 160 00:13:18,530 --> 00:13:22,540 Ez egyike volt azoknak a problémákat, hogy azt hiszem, egy-két dolog történt. 161 00:13:22,540 --> 00:13:25,400 Az egyik, hogy ez egy viszonylag új témát. 162 00:13:25,400 --> 00:13:30,590 Ezt be hamarosan, mielőtt a kvíz, 163 00:13:30,590 --> 00:13:33,400 és akkor azt gondolom, hogy olyan volt, mint egy ilyen szó problémák matematikai 164 00:13:33,400 --> 00:13:39,720 ahol kapsz egy csomó információt, de valójában nem a végén, hogy használja egy csomó belőle. 165 00:13:39,720 --> 00:13:44,060 Az első része ez a probléma írja le, amit a CSV fájl. 166 00:13:44,060 --> 00:13:50,620 Most, a CSV-fájlt, leírás szerint, egy vesszővel elválasztott értékek fájlt. 167 00:13:50,620 --> 00:13:55,300 Az ok, ezek minden érdekes, és az ok, amiért valaha is használni őket, 168 00:13:55,300 --> 00:14:00,800 van, mert az, hogy sokan közületek már valaha ilyesmi Excel? 169 00:14:00,800 --> 00:14:03,240 Ábra legtöbben, valószínűleg vagy fogja használni bizonyos ponton az életedben. 170 00:14:03,240 --> 00:14:06,430 Majd használja valami ilyesmit Excel. 171 00:14:06,430 --> 00:14:10,940 Annak érdekében, hogy az adatokat az Excel táblázatkezelő, vagy nem bármilyen feldolgozás vele, 172 00:14:10,940 --> 00:14:17,240 ha akarod, hogy írjon egy C program vagy Python program, Java program, 173 00:14:17,240 --> 00:14:20,070 kell kezelni a tárolt adatok ott, 174 00:14:20,070 --> 00:14:23,170 az egyik leggyakoribb módja annak, hogy ki van egy CSV fájlba. 175 00:14:23,170 --> 00:14:26,850 És tudod nyitni az Excel és ha megy a "Mentés másként" párbeszédet, 176 00:14:26,850 --> 00:14:32,840 juthatsz el tényleges CSV-fájlt. 177 00:14:32,840 --> 00:14:35,890 >> Handy tudni, hogyan kell kezelni ezeket a dolgokat. 178 00:14:35,890 --> 00:14:42,010 Ez úgy működik, hogy ez hasonló - Úgy értem, ez lényegében utánozza egy táblázatkezelő, 179 00:14:42,010 --> 00:14:47,590 ahol, mint látjuk itt, az igen bal szélső darab, 180 00:14:47,590 --> 00:14:49,910 mindannyian az utolsó nevet. 181 00:14:49,910 --> 00:14:54,670 Tehát Malan, majd Hardison, majd Bowden, MacWilliam, majd a Chan. 182 00:14:54,670 --> 00:14:59,470 Minden az utolsó neveket. És akkor egy vessző választja el az utolsó neveket az első neveket. 183 00:14:59,470 --> 00:15:02,970 David, Nate, Rob, Tommy és Zamyla. 184 00:15:02,970 --> 00:15:06,850 Én mindig keveredik Robby és Tom. 185 00:15:06,850 --> 00:15:10,940 És végül, a harmadik oszlopban az e-mail címeket. 186 00:15:10,940 --> 00:15:18,500 Ha megértjük, hogy, a többi a program meglehetősen egyszerű megvalósítani. 187 00:15:18,500 --> 00:15:23,850 Mit tettünk annak érdekében, hogy utánozni ugyanezt a struktúrát a C program 188 00:15:23,850 --> 00:15:27,510 az általunk használt szerkezet. 189 00:15:27,510 --> 00:15:30,520 Majd kezdj el játszani ezekkel egy kicsit több is. 190 00:15:30,520 --> 00:15:35,790 Láttuk őket, az első kicsit a probléma készlet 3, amikor mi voltunk foglalkozik a szótárakat. 191 00:15:35,790 --> 00:15:40,290 De ez a személyzeti struktúra tárolja a vezetéknév, a keresztnév, és az e-mail. 192 00:15:40,290 --> 00:15:44,500 Csakúgy, mint a CSV fájl tárolására. 193 00:15:44,500 --> 00:15:47,950 Tehát ez éppen konvertáló egyik formátumból a másikba. 194 00:15:47,950 --> 00:15:54,630 Meg kell átalakítani, a jelen esetben, alkalmazott struct egy vonal, 195 00:15:54,630 --> 00:15:59,060 vesszővel elválasztott line, csak úgy. 196 00:15:59,060 --> 00:16:01,500 Van ennek értelme? Ti mind megtette a kvíz, 197 00:16:01,500 --> 00:16:07,680 így képzeljük el, hogy legalább volt egy kis ideje gondolkodni erről. 198 00:16:07,680 --> 00:16:16,410 >> A bérleti funkció, a probléma azt kéri tőlünk, hogy in - we'll nagyítani kell ezen egy kicsit - 199 00:16:16,410 --> 00:16:22,480 hogy a személyzeti struktúrát, a személyzet struct, névvel s, 200 00:16:22,480 --> 00:16:30,900 és mellékeli annak tartalmát a mi staff.csv fájlt. 201 00:16:30,900 --> 00:16:34,230 Kiderül, hogy ez meglehetősen egyszerű használni. 202 00:16:34,230 --> 00:16:37,430 Majd a fajta játék körül ezeket a funkciókat egy kicsit ma. 203 00:16:37,430 --> 00:16:44,510 De ebben az esetben, a fprintf függvény valóban a kulcs. 204 00:16:44,510 --> 00:16:51,960 Tehát fprintf tudunk nyomtatni, mint ti is használnak printf az egész távon. 205 00:16:51,960 --> 00:16:55,050 Tudod printf egy sort egy fájlba. 206 00:16:55,050 --> 00:16:59,030 Tehát ahelyett, hogy csak így a szokásos printf hívás, ahol adja meg a format string 207 00:16:59,030 --> 00:17:05,380 és akkor cserélje ki az összes változó a következő érveket, 208 00:17:05,380 --> 00:17:11,290 A fprintf, az első argumentum helyett a kívánt fájlt írni. 209 00:17:11,290 --> 00:17:21,170 Ha volt, hogy nézd meg ezt a készüléket, például, férfi fprintf, 210 00:17:21,170 --> 00:17:25,980 látjuk a különbséget printf és fprintf. 211 00:17:25,980 --> 00:17:28,960 Majd zoom itt egy kicsit. 212 00:17:28,960 --> 00:17:33,140 Tehát a printf, akkor adja meg a format string, majd az azt követő érvek 213 00:17:33,140 --> 00:17:37,580 az összes változó csere vagy helyettesítése a mi format string. 214 00:17:37,580 --> 00:17:47,310 Mivel a fprintf, az első érv valóban ezt a fájlt * nevezett patak. 215 00:17:47,310 --> 00:17:51,800 >> Mozgó vissza ide, hogy a bérleti, 216 00:17:51,800 --> 00:17:54,550 mi már megvan a file * patak megnyitotta számunkra. 217 00:17:54,550 --> 00:17:57,810 Ez az, amit az első sorban nem, ez megnyitja a staff.csv fájlt, 218 00:17:57,810 --> 00:18:01,690 megnyitja azt append módban, és minden, ami maradt nekünk kell tennie 219 00:18:01,690 --> 00:18:08,640 írja a személyzeti struktúrát a fájl. 220 00:18:08,640 --> 00:18:10,870 És lássuk, nem szeretném használni az iPad? 221 00:18:10,870 --> 00:18:17,900 Fogom használni az iPad. Van void - Tegyük ezt az asztalra, így tudok írni egy kicsit jobban - 222 00:18:17,900 --> 00:18:33,680 semmisnek bérlet és vesz egy érv, a személyzeti struktúrát nevű s. 223 00:18:33,680 --> 00:18:44,120 Megvan a nadrágtartó, megvan a file * nevű fájlt, 224 00:18:44,120 --> 00:18:48,380 Megvan a fopen vonal adott nekünk, 225 00:18:48,380 --> 00:18:51,890 és én csak annyit írj, mint pont, mivel ez már a PEDIA. 226 00:18:51,890 --> 00:19:00,530 És akkor a mi következő sorban, mi megy, hogy egy hívás fprintf 227 00:19:00,530 --> 00:19:03,700 és megyünk át a fájlban, hogy szeretnénk nyomtatni, 228 00:19:03,700 --> 00:19:10,290 majd a format string, ami - 229 00:19:10,290 --> 00:19:14,300 Majd szólok nektek mondani, hogy néz ki. 230 00:19:14,300 --> 00:19:20,500 Mi a helyzet veled, Stella? Tudod, mi az első része a format string néz ki? 231 00:19:20,500 --> 00:19:24,270 [Stella] nem vagyok benne biztos. >> Nyugodtan kérjen Jimmy. 232 00:19:24,270 --> 00:19:27,690 Tudod, Jimmy? 233 00:19:27,690 --> 00:19:31,000 [Jimmy] lenne csak lenni utoljára? Nem tudom. Nem vagyok teljesen biztos benne. 234 00:19:31,000 --> 00:19:39,020 >> Oké. Mi a helyzet, nem valaki kap ez helyes-e a vizsgát? 235 00:19:39,020 --> 00:19:41,770 No. Rendben. 236 00:19:41,770 --> 00:19:47,920 Kiderül, hogy itt minden, amit meg kell tennie, hogy azt akarjuk, minden egyes részét munkatársaink szerkezet 237 00:19:47,920 --> 00:19:53,290 kell kinyomtatni, mint egy string a fájlt. 238 00:19:53,290 --> 00:19:59,900 Mi csak használja a húr helyettesítő karakter három különböző alkalommal, mert van egy utolsó név 239 00:19:59,900 --> 00:20:07,160 követ vessző, akkor a keresztnév, majd vessző, 240 00:20:07,160 --> 00:20:12,430 és végül az e-mail címet az azt követő - amely nem 241 00:20:12,430 --> 00:20:15,140 felszerelés én képernyőn - de ez egy újsor karaktert. 242 00:20:15,140 --> 00:20:20,060 Szóval fogom írni, hogy csak ott lent. 243 00:20:20,060 --> 00:20:23,560 És akkor a következő format string, 244 00:20:23,560 --> 00:20:27,880 már csak a helyettesítéseket, amit eléréséhez használja a dot jelölés 245 00:20:27,880 --> 00:20:31,370 hogy láttunk problémát készlet 3. 246 00:20:31,370 --> 00:20:48,820 Tudjuk használni s.last, s.first és s.email 247 00:20:48,820 --> 00:20:58,990 helyettesítheti e három érték a mi format string. 248 00:20:58,990 --> 00:21:06,190 Hogy volt? Értelme? 249 00:21:06,190 --> 00:21:09,700 Igen? Nem? Lehetséges? Oké. 250 00:21:09,700 --> 00:21:14,180 >> Az utolsó dolog, amit mi után mi már kinyomtatott és azután, hogy megnyitotta a fájlt: 251 00:21:14,180 --> 00:21:17,370 amikor mi már megnyitott egy fájlt, akkor mindig meg kell emlékezni, hogy zárja be azt. 252 00:21:17,370 --> 00:21:19,430 Mert különben mi a végén szivárog a memória, 253 00:21:19,430 --> 00:21:22,500 használ fel fájlleíró. 254 00:21:22,500 --> 00:21:25,950 Szóval, hogy zárja le, hogy melyik funkció mire használjuk? Daniel? 255 00:21:25,950 --> 00:21:30,120 [Daniel] fclose? >> Fclose, pontosan. 256 00:21:30,120 --> 00:21:37,520 Tehát az utolsó része a probléma az volt, hogy megfelelő módon zárja be a fájlt, használja a fclose függvény 257 00:21:37,520 --> 00:21:40,370 ami csak úgy néz ki, mint ezt. 258 00:21:40,370 --> 00:21:43,880 Nem túl őrült. 259 00:21:43,880 --> 00:21:46,990 Cool. 260 00:21:46,990 --> 00:21:49,520 Szóval ez probléma 33 a kvíz. 261 00:21:49,520 --> 00:21:52,480 Lesz határozottan több fájl I / O jön. 262 00:21:52,480 --> 00:21:55,130 Majd csinál egy kicsit több előadás ma, vagy részben ma, 263 00:21:55,130 --> 00:22:01,710 mert ez az, hogy mi fog alkotják a nagy részét a közelgő Pset. 264 00:22:01,710 --> 00:22:05,020 Menjünk el az a teszt ezen a ponton. Igen? 265 00:22:05,020 --> 00:22:10,880 >> [Charlotte]] Miért fclose (file) helyett fclose (staff.csv)? 266 00:22:10,880 --> 00:22:19,100 >> Ah. Mert kiderül, hogy - így az a kérdés, ami egy nagy ember, 267 00:22:19,100 --> 00:22:27,800 van miért, mikor írunk fclose, vagyunk írásban fclose (file) csillag változó 268 00:22:27,800 --> 00:22:33,680 szemben a fájl nevét, staff.csv? Igaz ez? Igen. 269 00:22:33,680 --> 00:22:39,570 Szóval vessünk egy pillantást. Ha vissza szeretne térni a laptop, 270 00:22:39,570 --> 00:22:45,040 és nézzük meg a fclose funkciót. 271 00:22:45,040 --> 00:22:51,460 Tehát a fclose függvény bezárja egy patak, és úgy a mutatót a patak, hogy szeretnénk zárni, 272 00:22:51,460 --> 00:22:57,010 szemben az aktuális fájl nevét, hogy meg akarjuk zárni. 273 00:22:57,010 --> 00:23:01,620 És ez azért van, mert a színfalak mögött, amikor egy hívás fopen, 274 00:23:01,620 --> 00:23:12,020 amikor megnyitod a fájlt, akkor valójában kiosztása memóriát információkat a fájlt. 275 00:23:12,020 --> 00:23:16,380 Szóval fájl pointer, amely információkat a fájlt, 276 00:23:16,380 --> 00:23:23,080 mint például ez a nyitott, mérete, ahol jelenleg a fájlba, 277 00:23:23,080 --> 00:23:29,100 így lehet, hogy az olvasás és írás hívásokat az adott sor a fájlban. 278 00:23:29,100 --> 00:23:38,060 A végén lezáró mutató helyett bezárása a fájl nevét. 279 00:23:38,060 --> 00:23:48,990 >> Igen? [Daniel] Szóval felhasználása érdekében bérlet, mit mondana - hogyan kap a felhasználói? 280 00:23:48,990 --> 00:23:53,830 Vajon fprintf viselkednek getString abban az értelemben, hogy ez akkor csak várni a felhasználói 281 00:23:53,830 --> 00:23:57,180 és kéri, hogy írja ezt - vagy várni, hogy adja ezt a három dolgot? 282 00:23:57,180 --> 00:24:00,480 Vagy ki kell használni valamit végre bérlet? 283 00:24:00,480 --> 00:24:04,100 >> Igen. Szóval nem vagyunk - a kérdés, hogyan jutunk a felhasználói 284 00:24:04,100 --> 00:24:09,220 végrehajtása érdekében bérlet? És mi van itt a hívó a bérleti, 285 00:24:09,220 --> 00:24:17,690 telt el ez a személyzeti struktúra az összes tárolt adatok a struct már. 286 00:24:17,690 --> 00:24:22,990 Szóval fprintf képes csak írni, hogy az adatokat közvetlenül a fájlt. 287 00:24:22,990 --> 00:24:25,690 Nincs felhasználói bemenetet vár. 288 00:24:25,690 --> 00:24:32,110 A felhasználó által már megadott bemeneti gondosan üzembe azt az e személyzeti struktúra. 289 00:24:32,110 --> 00:24:36,510 És a dolgok, persze, akkor sérül, ha ezek közül bármelyik mutatópálcák null, 290 00:24:36,510 --> 00:24:40,370 úgyhogy lapozzunk vissza ide, és nézd meg a struct. 291 00:24:40,370 --> 00:24:43,640 Van karakterlánc utolsó, string 1., string-mailt. 292 00:24:43,640 --> 00:24:48,530 Azt már tudjuk, hogy az összes ilyen igazán, a motorháztető alatt vannak char * változók. 293 00:24:48,530 --> 00:24:53,470 Hogy lehet, hogy nem mutat null. 294 00:24:53,470 --> 00:24:55,800 Ezek lehetnek mutató memóriát a halom, 295 00:24:55,800 --> 00:24:59,650 talán memóriát a verem. 296 00:24:59,650 --> 00:25:04,580 Nem igazán tudom, de ha ezek a mutatók null, vagy érvénytelen, 297 00:25:04,580 --> 00:25:08,120 hogy akkor biztosan lezuhan a bérleti funkciót. 298 00:25:08,120 --> 00:25:11,050 Ez valami, ami kedves volt túlmutat a vizsga. 299 00:25:11,050 --> 00:25:16,440 Mi nem aggódni emiatt. 300 00:25:16,440 --> 00:25:22,170 Remek. Oké. Így mozog a kvíz. 301 00:25:22,170 --> 00:25:25,760 >> Nézzük zárja ezt a fickót, és fogunk nézni Pset 4. 302 00:25:25,760 --> 00:25:34,700 Tehát, ha srácok megnézi az Pset spec, ha egyszer úgy érheti el, cs50.net/quizzes, 303 00:25:34,700 --> 00:25:42,730 fogunk átmenni néhány szakasz problémák ma. 304 00:25:42,730 --> 00:25:52,240 Én lefelé görgetve - szakasz kérdések kezdődik a harmadik oldalon a Pset spec. 305 00:25:52,240 --> 00:25:57,800 És az első rész arra kéri, hogy menjen, és nézni a rövid szóló átirányítása és a csövek. 306 00:25:57,800 --> 00:26:02,820 Melyik volt egyfajta hűvös rövid, megmutatja, néhány új, cool parancssori trükköket, hogy tudod használni. 307 00:26:02,820 --> 00:26:06,050 És aztán van néhány kérdés az Ön számára is. 308 00:26:06,050 --> 00:26:10,860 Ez az első kérdés patakok, amelynek printf írja alapértelmezés szerint, 309 00:26:10,860 --> 00:26:15,920 azt a fajta érintette egy kicsit egy pillanattal ezelőtt. 310 00:26:15,920 --> 00:26:22,380 Ez fprintf, hogy mi csak beszélünk vesz egy file * patak érvelését. 311 00:26:22,380 --> 00:26:26,580 fclose vesz egy file * patak is, 312 00:26:26,580 --> 00:26:32,660 és a visszatérési érték a fopen ad egy file * patak is. 313 00:26:32,660 --> 00:26:36,060 Az ok nem láttunk e előtt, amikor mi már foglalkozott printf 314 00:26:36,060 --> 00:26:39,450 mert printf egy alapértelmezett stream. 315 00:26:39,450 --> 00:26:41,810 És az alapértelmezett patak, amely azt írja 316 00:26:41,810 --> 00:26:45,190 fogod megtudni, hogy rövid. 317 00:26:45,190 --> 00:26:50,080 Tehát mindenképpen vessünk egy pillantást rá. 318 00:26:50,080 --> 00:26:53,010 >> A mai részben fogunk beszélni egy kicsit a GDB, 319 00:26:53,010 --> 00:26:57,720 mivel az jobban ismerik vagytok vele, annál több gyakorlat kapsz vele, 320 00:26:57,720 --> 00:27:01,390 annál jobban képes leszel ténylegesen levadászni bugs saját kódját. 321 00:27:01,390 --> 00:27:05,540 Ez felgyorsítja az eljárást hibakereső fel rettenetesen. 322 00:27:05,540 --> 00:27:09,230 Tehát a printf, minden alkalommal, amikor ezt teszed, újra kell fordítanod a kódot, 323 00:27:09,230 --> 00:27:13,000 le kell futtatni újra, néha meg kell mozgatni a printf hívás körül, 324 00:27:13,000 --> 00:27:17,100 megjegyzésbe kód, csak eltart egy ideig. 325 00:27:17,100 --> 00:27:20,850 Célunk, hogy megpróbálja meggyőzni, hogy a GDB, akkor lényegében 326 00:27:20,850 --> 00:27:26,810 printf semmit bármely pontján a kódot, és soha nem kell fordítanod azt. 327 00:27:26,810 --> 00:27:35,120 Sosem kell kezdeni, és tartsa találgatás, hogy hol printf következő. 328 00:27:35,120 --> 00:27:40,910 Az első dolog az, hogy másolja ezt a sort, és kap a szakasz kódját le az interneten. 329 00:27:40,910 --> 00:27:47,530 Én másolása ezt a kódsort, hogy azt mondja, "wget ​​http://cdn.cs50.net". 330 00:27:47,530 --> 00:27:49,510 Fogom másolni. 331 00:27:49,510 --> 00:27:55,950 Én megyek át a készüléket, kicsinyítés így láthatja, hogy mit csinálok, 332 00:27:55,950 --> 00:28:01,890 beilleszti azt ott, és amikor Enter, ez wget parancs szó egy web kap. 333 00:28:01,890 --> 00:28:06,210 Ez lesz húzza le ezt a fájlt le az internet, 334 00:28:06,210 --> 00:28:11,790 és ez fogja menteni az aktuális könyvtárban. 335 00:28:11,790 --> 00:28:21,630 Most, ha a listán a jelenlegi könyvtár láthatja, hogy kaptam ezt a fájlt section5.zip jogot ott. 336 00:28:21,630 --> 00:28:25,260 Az út, hogy foglalkozzanak ezzel a fickó, hogy csomagolja ki, 337 00:28:25,260 --> 00:28:27,650 amit tehetünk a parancssorban, mint ez. 338 00:28:27,650 --> 00:28:31,880 Section5.zip. 339 00:28:31,880 --> 00:28:36,980 Ez majd csomagolja ki, a mappa létrehozásához nekem, 340 00:28:36,980 --> 00:28:40,410 fújja az összes tartalom, őket ott. 341 00:28:40,410 --> 00:28:47,410 Így most mehetek az én 5. pontban könyvtárba a cd paranccsal. 342 00:28:47,410 --> 00:28:58,310 Töröljük a képernyőt egyértelmű. Így tisztítsd meg a képernyőt. 343 00:28:58,310 --> 00:29:02,280 Most már van egy szép tiszta terminál foglalkozni. 344 00:29:02,280 --> 00:29:06,200 >> Most, ha tudom kilistázni az összes fájlt, hogy látom ebben a könyvtárban, 345 00:29:06,200 --> 00:29:12,270 látod, hogy kaptam négy fájl: buggy1, buggy2, buggy3 és buggy4. 346 00:29:12,270 --> 00:29:16,180 Én is kaptam a megfelelő. C fájlokat. 347 00:29:16,180 --> 00:29:20,400 Nem fogunk nézni a. C fájlokat most. 348 00:29:20,400 --> 00:29:24,140 Ehelyett fogjuk használni őket, amikor nyitni GDB. 349 00:29:24,140 --> 00:29:28,220 Már tartotta őket körül, hogy mi férhet hozzá az aktuális forráskód, amikor mi a GDB, 350 00:29:28,220 --> 00:29:32,740 de a cél ezen részének a szakasz bütykölni körül GDB 351 00:29:32,740 --> 00:29:40,370 és hogyan tudjuk használni, hogy kitaláljuk, mi baj van mind a négy hibás programokat. 352 00:29:40,370 --> 00:29:43,380 Szóval, csak megy körbe a teremben nagyon gyorsan, 353 00:29:43,380 --> 00:29:47,000 és meg fogom kérni, hogy valaki fut az egyik hibás programok 354 00:29:47,000 --> 00:29:54,730 aztán megyünk, mint egy csoport a GDB, és meglátjuk, mit tehetünk, hogy meghatározza ezeket a programokat, 355 00:29:54,730 --> 00:29:58,460 vagy legalább azonosítani, mi baj mindegyikben. 356 00:29:58,460 --> 00:30:04,760 Kezdjük újra itt Daniel. Fogsz futni buggy1? Lássuk, mi történik. 357 00:30:04,760 --> 00:30:09,470 [Daniel] Azt mondja, van egy alkalmazás hiba. >> Igen. Pontosan. 358 00:30:09,470 --> 00:30:12,460 Tehát, ha futok buggy1, kapok egy seg hiba. 359 00:30:12,460 --> 00:30:16,210 Ezen a ponton, nem tudtam menni, és nyissa ki buggy1.c, 360 00:30:16,210 --> 00:30:19,450 próbálja meg kitalálni, mi folyik itt baj, 361 00:30:19,450 --> 00:30:22,000 de az egyik leginkább visszataszító dolog ez a szegmens hiba hiba 362 00:30:22,000 --> 00:30:27,610 az, hogy nem mondja meg, hogy milyen sorban a program dolgok valóban elromlott és eltörte. 363 00:30:27,610 --> 00:30:29,880 Ha ilyen van, hogy nézd meg a kódot 364 00:30:29,880 --> 00:30:33,990 és kitalálni a találgatás, és ellenőrizze, vagy printf, hogy mi folyik itt baj. 365 00:30:33,990 --> 00:30:37,840 Az egyik legmenőbb dolog GDB, hogy ez nagyon, nagyon egyszerű 366 00:30:37,840 --> 00:30:42,170 , hogy kitaláljuk, a vonal, amelyen a program összeomlik. 367 00:30:42,170 --> 00:30:46,160 Ez teljesen érdemes használni, még ha csak ezt. 368 00:30:46,160 --> 00:30:56,190 Szóval, hogy csomagtartó megjelöl GDB, I írja GDB, aztán adja meg az elérési utat a futtatható hogy szeretnék futtatni. 369 00:30:56,190 --> 00:31:01,960 Itt vagyok gépelni gdb ./buggy1. 370 00:31:01,960 --> 00:31:06,600 Hit Enter billentyűt. Ad nekem mindezt szerzői jogi információkat, 371 00:31:06,600 --> 00:31:13,000 és itt lent meglátja ezt a sort, hogy azt mondja: "Reading szimbólumok / home / 372 00:31:13,000 --> 00:31:17,680 jharvard/section5/buggy1. " 373 00:31:17,680 --> 00:31:22,060 És ha minden jól megy, látni fogod, hogy nyomtassa ki egy üzenetet, hogy így néz ki. 374 00:31:22,060 --> 00:31:25,500 Ez lesz olvasható szimbólumok azt fogja mondani: "Olvasom szimbólumok az Ön végrehajtható fájlt" 375 00:31:25,500 --> 00:31:29,900 és akkor lesz ez a "kész" üzenet itt. 376 00:31:29,900 --> 00:31:35,410 Ha látod egy másik variáció e, vagy látod, nem tudta megtalálni a szimbólumok 377 00:31:35,410 --> 00:31:41,460 vagy valami ilyesmi, hogy ez mit jelent az, hogy egyszerűen még nem fordítottuk le futtatható megfelelően. 378 00:31:41,460 --> 00:31:49,980 Amikor összeállítja programokat használatra GDB, akkor kell használni, hogy különleges g zászló, 379 00:31:49,980 --> 00:31:54,540 és hogy kész az alap, ha úgy összeállítani a programokat, csak írja, hogy 380 00:31:54,540 --> 00:31:59,320 vagy hogy hibás, vagy hogy vissza bármely érintett. 381 00:31:59,320 --> 00:32:07,800 De ha összeállítása manuálisan csenget, akkor kell majd menni, és egy olyan, hogy a-g zászló. 382 00:32:07,800 --> 00:32:10,310 >> Ezen a ponton, most, hogy már a GDB azonnali, 383 00:32:10,310 --> 00:32:12,310 ez elég egyszerű, a program futtatásához. 384 00:32:12,310 --> 00:32:19,740 Mi sem írja távon, vagy mi lehet csak írja r. 385 00:32:19,740 --> 00:32:22,820 A GDB parancsok lehet rövidíteni. 386 00:32:22,820 --> 00:32:25,940 Általában csak egy vagy két betű, ami elég szép. 387 00:32:25,940 --> 00:32:30,980 Tehát Saad, ha Type R, és nyomja meg az Enter, mi történik? 388 00:32:30,980 --> 00:32:39,390 [Saad] Van SIGSEGV, szegmentációs hiba, majd mindezt halandzsa. 389 00:32:39,390 --> 00:32:43,650 >> Igen. 390 00:32:43,650 --> 00:32:47,990 Mint látjuk a képernyőn, most, és mint mondta Saad, 391 00:32:47,990 --> 00:32:53,430 amikor azt írja run vagy r, és nyomja meg az Enter billentyűt, akkor még mindig ugyanazt a szeg hibát. 392 00:32:53,430 --> 00:32:55,830 Tehát a GDB nem oldja meg a problémát. 393 00:32:55,830 --> 00:32:59,120 De ez ad némi halandzsa, és kiderül, hogy ez a halandzsa 394 00:32:59,120 --> 00:33:03,080 valójában azt mondja, ha ez történik. 395 00:33:03,080 --> 00:33:10,680 Ahhoz, hogy elemezni ezt egy kicsit, ez az első bit a funkció, amely minden megy rosszul. 396 00:33:10,680 --> 00:33:20,270 Van ez a __ strcmp_sse4_2, és azt mondja, hogy ez történik ebben a fájlban 397 00:33:20,270 --> 00:33:29,450 nevezett sysdeps/i386 mindez újra, egyfajta rendetlenség -, de sor 254. 398 00:33:29,450 --> 00:33:31,670 Ez elég nehéz értelmezni. Általában, ha látsz dolgokat, mint ez, 399 00:33:31,670 --> 00:33:38,770 ez azt jelenti, hogy ez hibás seg valamelyik rendszer könyvtárak. 400 00:33:38,770 --> 00:33:43,220 Szóval valami köze strcmp. Ti már láttuk strcmp előtt. 401 00:33:43,220 --> 00:33:52,730 Nem túl őrült, de ez azt jelenti, hogy a strcmp sérült vagy, hogy van egy probléma strcmp? 402 00:33:52,730 --> 00:33:57,110 Mit gondolsz, Alexander? 403 00:33:57,110 --> 00:34:04,890 [Alexander] Ez - a 254 a vonal? És - nem a bináris, de ez nem a felső, 404 00:34:04,890 --> 00:34:10,590 és akkor ott van egy másik nyelvet az egyes funkciók. Ez 254-ben, hogy a funkció, vagy -? 405 00:34:10,590 --> 00:34:21,460 >> Ez vonal 254. Úgy néz ki, mint ez. S fájl, így ez az assembly kódot valószínűleg. 406 00:34:21,460 --> 00:34:25,949 >> De, azt hiszem, az egyre sürgetőbb dolog, mert már ütött egy szegmens hiba, 407 00:34:25,949 --> 00:34:29,960 és úgy néz ki, hogy jön a strcmp függvény, 408 00:34:29,960 --> 00:34:38,030 ez jelenti tehát, hogy strcmp van törve? 409 00:34:38,030 --> 00:34:42,290 Ez nem kellene, remélhetőleg. Szóval csak azért, mert van egy szegmentációs hiba 410 00:34:42,290 --> 00:34:49,480 az egyik rendszer funkcióit, általában azt jelenti, hogy az imént még nem nevezték megfelelően. 411 00:34:49,480 --> 00:34:52,440 A leggyorsabb dolog, hogy kitaláljuk, mi folyik itt valójában 412 00:34:52,440 --> 00:34:55,500 ha valami őrült, mint ez, amikor megjelenik egy szegmens hiba, 413 00:34:55,500 --> 00:34:59,800 különösen akkor, ha van egy program, ami a több, mint fő, 414 00:34:59,800 --> 00:35:03,570 az, hogy egy backtrace. 415 00:35:03,570 --> 00:35:13,080 Én rövidítéséhez backtrace írásban bt, szemben a teljes backtrace szót. 416 00:35:13,080 --> 00:35:16,510 De Charlotte, mi történik, ha begépeli bt és megüt Belép? 417 00:35:16,510 --> 00:35:23,200 [Charlotte] Ez azt mutatja, nekem két vonal, a vonal a 0 és 1 sor. 418 00:35:23,200 --> 00:35:26,150 >> Igen. Így sor 0 és 1 sor. 419 00:35:26,150 --> 00:35:34,560 Ezek az aktuális verem kereteket, amelyek jelenleg a játékba, amikor a program összeomlott. 420 00:35:34,560 --> 00:35:42,230 Kezdve a legfelső keret, keret 0, és megy a legalsó, amely keret 1. 421 00:35:42,230 --> 00:35:45,140 A legfelső keret a strcmp keretet. 422 00:35:45,140 --> 00:35:50,080 Azt hiszem ezt hasonló probléma, amit éppen csinál a kvíz, a mutatók, 423 00:35:50,080 --> 00:35:54,890 ahol már cserélni stack frame tetején fő verem keret, 424 00:35:54,890 --> 00:35:59,700 és mi volt a változókat, csere volt a tetején a változók fő használta. 425 00:35:59,700 --> 00:36:08,440 Itt a baleset történt, a mi strcmp funkció, amelynek feladata az volt a mi fő funkciója, 426 00:36:08,440 --> 00:36:14,370 és backtrace ad nekünk nem csak a funkciók, amelyek a dolgok nem sikerült, 427 00:36:14,370 --> 00:36:16,440 de ez is azt mondja, ha mindent hívott. 428 00:36:16,440 --> 00:36:18,830 Szóval, ha én lépjünk át egy kicsit jobbra, 429 00:36:18,830 --> 00:36:26,110 láthatjuk, hogy igen, mi volt on line 254 e strcmp-sse4.s fájlt. 430 00:36:26,110 --> 00:36:32,540 De a hívás tett buggy1.c, 6. sor. 431 00:36:32,540 --> 00:36:35,960 Tehát ez azt jelenti, amit tehetünk - az akkor csak megy nézd meg, hogy mi folyik 432 00:36:35,960 --> 00:36:39,930 A buggy1.c, 6. sor. 433 00:36:39,930 --> 00:36:43,780 Ismét van egy pár módja erre. Az egyik az, hogy lépjen ki a GDB 434 00:36:43,780 --> 00:36:49,460 vagy a kód megnyitni egy másik ablakban és a határokon hivatkozást. 435 00:36:49,460 --> 00:36:54,740 Ez, és önmagában is elég hasznos, mert most ha a munkaidő 436 00:36:54,740 --> 00:36:57,220 és van egy szegmens hiba, és a TF ez vajon, ha mindent törés, 437 00:36:57,220 --> 00:36:59,710 tudod csak mondani, hogy "Ó, 6 vezetéken. Nem tudom, mi folyik itt, 438 00:36:59,710 --> 00:37:03,670 de valami 6-os vonal okoz a program megtörni. " 439 00:37:03,670 --> 00:37:10,430 A másik módja, hogy használja ezt a parancsot nevű listát GDB. 440 00:37:10,430 --> 00:37:13,650 Azt is rövidítéséhez azt l. 441 00:37:13,650 --> 00:37:18,910 Tehát ha megüt l, mit kapunk itt? 442 00:37:18,910 --> 00:37:21,160 Kapunk egy csomó furcsa dolog. 443 00:37:21,160 --> 00:37:26,030 Ez a tényleges assembly kódot 444 00:37:26,030 --> 00:37:29,860 hogy van strcmp_sse4_2. 445 00:37:29,860 --> 00:37:32,440 Ez úgy néz ki a fajta funky, 446 00:37:32,440 --> 00:37:36,520 és az ok vagyunk szerzés ez azért van, mert most, 447 00:37:36,520 --> 00:37:40,160 GDB van nekünk keretben 0. 448 00:37:40,160 --> 00:37:43,070 >> Így bármikor nézzük változók bármikor nézzük forráskódot, 449 00:37:43,070 --> 00:37:50,530 keresünk forráskódot, hogy vonatkozik a verem keret vagyunk jelenleg be 450 00:37:50,530 --> 00:37:53,200 Így annak érdekében, hogy bármi értelmes, van, hogy 451 00:37:53,200 --> 00:37:57,070 költöznek egy verem keret, több értelme van. 452 00:37:57,070 --> 00:38:00,180 Ebben az esetben, a legfontosabb verem keret tenné egy kicsit több értelme, 453 00:38:00,180 --> 00:38:02,680 mert ez volt valójában a kódot, amit írt. 454 00:38:02,680 --> 00:38:05,330 Nem a strcmp kódot. 455 00:38:05,330 --> 00:38:08,650 Az, hogy tudja mozgatni a keretek között, ebben az esetben, mert van két, 456 00:38:08,650 --> 00:38:10,430 van 0 és 1, 457 00:38:10,430 --> 00:38:13,650 te, hogy a fel-és le parancsokat. 458 00:38:13,650 --> 00:38:18,480 Ha feljebb egy képkockával, 459 00:38:18,480 --> 00:38:21,770 most én vagyok a fő stack keretet. 460 00:38:21,770 --> 00:38:24,330 Tudom mozgatni lefelé, hogy menjen vissza, ahol voltam, 461 00:38:24,330 --> 00:38:32,830 menj fel újra, menj le megint, és menj fel újra. 462 00:38:32,830 --> 00:38:39,750 Ha valaha is csinálni a programot GDB, akkor kap egy baleset, akkor kap a backtrace, 463 00:38:39,750 --> 00:38:42,380 és látod, hogy ez néhány fájlt nem tudja, mi folyik itt. 464 00:38:42,380 --> 00:38:45,460 Megpróbálja listáját, a kód nem ismerős neked, 465 00:38:45,460 --> 00:38:48,150 vessen egy pillantást a keretek és kitalálni, hogy hol van. 466 00:38:48,150 --> 00:38:51,010 Te valószínűleg rossz stack keretet. 467 00:38:51,010 --> 00:38:58,760 Vagy legalábbis te egy verem keret, amely nem az egyik, hogy akkor tényleg debug. 468 00:38:58,760 --> 00:39:03,110 Most, hogy mi vagyunk a megfelelő stack frame, mi a fő, 469 00:39:03,110 --> 00:39:08,100 most már fel tudjuk használni a list paranccsal hogy kitaláljuk, mi a vonal volt. 470 00:39:08,100 --> 00:39:13,590 És látod, hogy nyomtatott nekünk itt. 471 00:39:13,590 --> 00:39:19,470 De mi is sújtotta felsorolni az összes azonos, és listát ad nekünk ezt a szép nyomtatás 472 00:39:19,470 --> 00:39:23,920 A tényleges forráskódot, ami folyik itt. 473 00:39:23,920 --> 00:39:26,420 >> Különösen azt nézd meg 6-os vonal. 474 00:39:26,420 --> 00:39:29,330 Látjuk, hogy mi folyik itt. 475 00:39:29,330 --> 00:39:31,250 És úgy néz ki, mint mi, hogy egy karakterlánc-összehasonlítás 476 00:39:31,250 --> 00:39:41,050 között a string "CS50 sziklák" és argv [1]. 477 00:39:41,050 --> 00:39:45,700 Valami ezt összeomlik. 478 00:39:45,700 --> 00:39:54,120 Szóval Missy, van valami gondolat, hogy mi lehet folyik itt? 479 00:39:54,120 --> 00:39:59,400 [Missy] Nem tudom, miért ez összeomlik. >> Nem tudom, miért ez összeomlik? 480 00:39:59,400 --> 00:40:02,700 Jimmy, minden gondolat? 481 00:40:02,700 --> 00:40:06,240 [Jimmy] Nem vagyok teljesen biztos benne, de az utoljára használt karakterlánc összehasonlítani, 482 00:40:06,240 --> 00:40:10,260 vagy strcmp, mi volt, mint három különböző esetben alatta. 483 00:40:10,260 --> 00:40:12,800 Nem rendelkezik ==, nem hiszem, jobbra az első sorban. 484 00:40:12,800 --> 00:40:16,700 Ehelyett azt szétválaszthatók három, és egy pedig == 0, 485 00:40:16,700 --> 00:40:19,910 egy volt <0, azt hiszem, és egy volt> 0-ra. 486 00:40:19,910 --> 00:40:22,590 Talán valami ilyesmi? >> Igen. Szóval, itt van ez a probléma 487 00:40:22,590 --> 00:40:27,200 A teszünk az összehasonlítás megfelelő? 488 00:40:27,200 --> 00:40:31,660 Stella? Minden gondolat? 489 00:40:31,660 --> 00:40:38,110 [Stella] nem vagyok benne biztos. >> Nem biztos. Daniel? Gondolatok? Oké. 490 00:40:38,110 --> 00:40:44,770 Kiderült, hogy mi folyik itt, amikor már futott a program 491 00:40:44,770 --> 00:40:48,370 és mi van a szegmens hiba, amikor futott a program az első alkalommal, Daniel, 492 00:40:48,370 --> 00:40:50,800 tudtad, hogy ez bármilyen parancssori argumentumok? 493 00:40:50,800 --> 00:40:58,420 [Daniel] No. No. >> Ebben az esetben, mi az értéke argv [1]? 494 00:40:58,420 --> 00:41:00,920 >> Nincs értéke. >> Rendben. 495 00:41:00,920 --> 00:41:06,120 Nos, nincs megfelelő string értéket. 496 00:41:06,120 --> 00:41:10,780 De van valami érték. Mi az az érték, hogy lesz tárolt ott? 497 00:41:10,780 --> 00:41:15,130 >> A szemetet érték? >> Ez vagy egy szemét értéket, vagy ebben az esetben, 498 00:41:15,130 --> 00:41:19,930 a végén a argv tömb mindig megszűnik a null. 499 00:41:19,930 --> 00:41:26,050 Szóval mi tényleg van tárolva van null. 500 00:41:26,050 --> 00:41:30,810 A másik módszer, hogy megoldja ezt, ahelyett, gondoltam át, 501 00:41:30,810 --> 00:41:33,420 hogy nyomtasson ki. 502 00:41:33,420 --> 00:41:35,880 Ez az, ahol azt mondtam, hogy a GDB nagy, 503 00:41:35,880 --> 00:41:40,640 mert akkor ki kell nyomtatni az összes változót, a kívánt értékeket 504 00:41:40,640 --> 00:41:43,230 Ezzel a praktikus dandy-p parancsot. 505 00:41:43,230 --> 00:41:48,520 Szóval, ha a p és aztán írja be az értéket egy változó, vagy a nevét a változó, 506 00:41:48,520 --> 00:41:55,320 mondjuk argc, látom, hogy argc 1 lehet. 507 00:41:55,320 --> 00:42:01,830 Ha azt szeretnénk, hogy kinyomtatni argv [0], én is ezt csak úgy. 508 00:42:01,830 --> 00:42:04,840 És mint láttuk, argv [0] mindig a neve a program, 509 00:42:04,840 --> 00:42:06,910 mindig a neve a végrehajtható. 510 00:42:06,910 --> 00:42:09,740 Itt látható, hogy van a teljes elérési utat. 511 00:42:09,740 --> 00:42:15,920 Azt is ki kell nyomtatni, argv [1], és meglátjuk, mi történik. 512 00:42:15,920 --> 00:42:20,890 >> Itt van ez a fajta misztikus értéket. 513 00:42:20,890 --> 00:42:23,890 Van ez a 0x0. 514 00:42:23,890 --> 00:42:27,850 Emlékszel elején kifejezés, amikor beszéltünk hexadecimális számok? 515 00:42:27,850 --> 00:42:34,680 Vagy, hogy kis kérdés végén az Pset 0 Körülbelül hogyan képviselje 50 hex? 516 00:42:34,680 --> 00:42:39,410 Az, ahogyan írunk hex számok CS, csak, hogy ne tévesszük össze magunkat 517 00:42:39,410 --> 00:42:46,080 A tizedes pontossággal, az mindig előtag őket 0x. 518 00:42:46,080 --> 00:42:51,420 Tehát ez a 0x előtagot mindig csak azt jelenti, értelmezni a következő szám hexadecimális számként, 519 00:42:51,420 --> 00:42:57,400 nem egy string, nem mint decimális szám, és nem, mint egy bináris számot. 520 00:42:57,400 --> 00:43:02,820 Mivel a szám 5-0 egy érvényes szám hexadecimális. 521 00:43:02,820 --> 00:43:06,240 És ez egy számot decimális, 50. 522 00:43:06,240 --> 00:43:10,050 Tehát ez csak hogyan az egyértelműség. 523 00:43:10,050 --> 00:43:14,860 Így 0x0 eszközök hexadecimális 0, ami szintén decimális 0, bináris 0. 524 00:43:14,860 --> 00:43:17,030 Ez csak a 0 értéket. 525 00:43:17,030 --> 00:43:22,630 Kiderül, hogy ez az, amit null is, valójában a memóriában. 526 00:43:22,630 --> 00:43:25,940 Null csak 0-ra. 527 00:43:25,940 --> 00:43:37,010 Itt az elem tárolt argv [1] null. 528 00:43:37,010 --> 00:43:45,220 Így próbálunk összehasonlítani a "CS50 sziklák" string egy null string. 529 00:43:45,220 --> 00:43:48,130 Szóval dereferencing null, próbál hozzáférni dolgokat null, 530 00:43:48,130 --> 00:43:55,050 ezek jellemzően fog okozni valamilyen szegmentációs hiba vagy egyéb rossz dolgok történni. 531 00:43:55,050 --> 00:43:59,350 És kiderül, hogy strcmp nem ellenőrzi, hogy 532 00:43:59,350 --> 00:44:04,340 e vagy sem, amit átadott érték, ami null. 533 00:44:04,340 --> 00:44:06,370 Inkább csak megy előre, megpróbálja ezt a dolgot, 534 00:44:06,370 --> 00:44:14,640 és ha seg hibát, hogy seg hibák, és ez a probléma. El kell menni kijavítani. 535 00:44:14,640 --> 00:44:19,730 Tényleg gyorsan, hogyan lehet megjavítani ezt a problémát? Charlotte? 536 00:44:19,730 --> 00:44:23,540 [Charlotte] megnézheted a ha. 537 00:44:23,540 --> 00:44:32,240 Tehát, ha argv [1] null, == 0, akkor vissza 1, vagy valami [érthetetlen]. 538 00:44:32,240 --> 00:44:34,590 >> Igen. Szóval ez egy nagyszerű módja annak, hogy csinálni, mint tudjuk ellenőrizni látni, 539 00:44:34,590 --> 00:44:39,230 az értéket vagyunk arról, hogy bejut strcmp, argv [1], ugye null? 540 00:44:39,230 --> 00:44:45,830 Ha ez üres, akkor elmondhatjuk, oké, abort. 541 00:44:45,830 --> 00:44:49,450 >> A leggyakoribb módja ennek az, hogy az argc értéket. 542 00:44:49,450 --> 00:44:52,040 Láthatjuk itt az elején fő, 543 00:44:52,040 --> 00:44:58,040 kihagytuk, hogy az első teszt, amit általában csinálni, ha az általunk használt parancssori argumentumok, 544 00:44:58,040 --> 00:45:05,240 amely a tesztelni-e vagy sem a mi argc érték, amit várunk. 545 00:45:05,240 --> 00:45:10,290 Ebben az esetben várunk legalább két érvet, 546 00:45:10,290 --> 00:45:13,660 a program neve, plusz egy másik. 547 00:45:13,660 --> 00:45:17,140 Mert mi vagyunk arról, hogy használja a második érvet itt. 548 00:45:17,140 --> 00:45:21,350 Tehát amelyek valamilyen vizsgálat előzetesen, mielőtt a strcmp hívás 549 00:45:21,350 --> 00:45:37,390 hogy a vizsgálatok e vagy sem argv legalább 2, szintén nem ugyanaz a fajta dolog. 550 00:45:37,390 --> 00:45:40,620 Láthatjuk, ha ez működik, a program futtatása újra. 551 00:45:40,620 --> 00:45:45,610 Bármikor indítani a program keretében GDB, ami nagyon szép. 552 00:45:45,610 --> 00:45:49,310 Futtathat, és ha át az érvet, hogy a program, 553 00:45:49,310 --> 00:45:53,060 adja át őket, ha hívja fut, nem akkor, amikor elindítja GDB. 554 00:45:53,060 --> 00:45:57,120 Így tudod tartani hivatkozva a program különböző érveket minden egyes alkalommal. 555 00:45:57,120 --> 00:46:08,080 Úgy fussatok, vagy újra tudok írja r, és lássuk, mi történik, ha írja be a "hello". 556 00:46:08,080 --> 00:46:11,140 Ez mindig megkérdezi, ha szeretné kezdeni elölről. 557 00:46:11,140 --> 00:46:17,490 Általában, ha akarok kezdeni az elejétől újra. 558 00:46:17,490 --> 00:46:25,010 És ezen a ponton, akkor újraindul újra, akkor kiírja 559 00:46:25,010 --> 00:46:28,920 a programot, hogy mi fut, buggy1, az érvelés hello, 560 00:46:28,920 --> 00:46:32,720 és kiírja ezt a szabványt el; azt mondja: "Kapsz egy D" szomorú arc. 561 00:46:32,720 --> 00:46:37,610 De nem seg hibája. Azt mondta, ez a folyamat kilépett rendesen. 562 00:46:37,610 --> 00:46:39,900 Annak érdekében, hogy jól néz ki. 563 00:46:39,900 --> 00:46:43,050 Nincs több szegmens hiba, azt tette az elmúlt, 564 00:46:43,050 --> 00:46:48,190 így néz ki, hogy valóban a szegmens hiba hiba, hogy mi volt egyre. 565 00:46:48,190 --> 00:46:51,540 Sajnos, ez azt mondja, hogy mi vagyunk egyre a D. 566 00:46:51,540 --> 00:46:54,090 >> Mi lehet visszamenni, és nézd meg a kódot, és megnézze, mi folyik ott 567 00:46:54,090 --> 00:46:57,980 hogy kitaláljuk, mi volt - miért azt mondja, hogy mi van a D. 568 00:46:57,980 --> 00:47:03,690 Lássuk, itt volt ez a printf azt mondta, hogy van egy D. 569 00:47:03,690 --> 00:47:08,540 Ha azt írja be listáról, mivel tartod gépelés listában tartja iterációjával végig a program, 570 00:47:08,540 --> 00:47:10,940 így Megmutatom az első néhány sor a program. 571 00:47:10,940 --> 00:47:15,450 Akkor megmutatom a következő néhány sort, és a következő darab, és a következő darab. 572 00:47:15,450 --> 00:47:18,240 És akkor próbálkozom, hogy menjen le. 573 00:47:18,240 --> 00:47:21,180 És most mi lesz, hogy "sor száma 16 a tartományon kívül van." 574 00:47:21,180 --> 00:47:23,940 Mert csak 15 sor. 575 00:47:23,940 --> 00:47:30,310 Ha kapsz, hogy ezt a pontot, és a kíváncsi: "Mit tegyek?" akkor használja a help parancsot. 576 00:47:30,310 --> 00:47:34,340 Használja Segítse majd adja meg a nevét a parancs. 577 00:47:34,340 --> 00:47:36,460 És látod a GDB ad nekünk ezt a fajta dolgot. 578 00:47:36,460 --> 00:47:43,870 Azt mondja: "Ha nincs érv, felsorolja tíz sor után, vagy annak közelében az előző listát. 579 00:47:43,870 --> 00:47:47,920 List - felsorolja a tíz vonal előtt - " 580 00:47:47,920 --> 00:47:52,960 Szóval próbálja lista mínusz. 581 00:47:52,960 --> 00:47:57,000 És hogy felsorolja a 10 sor előző, akkor játszani körül lista egy kicsit. 582 00:47:57,000 --> 00:48:02,330 Meg tudod csinálni lista, lista -, akkor is adni lista több, mint a listán 8, 583 00:48:02,330 --> 00:48:07,500 és akkor sorolja a 10 körüli vonalak sor 8. 584 00:48:07,500 --> 00:48:10,290 És látod, mi folyik itt van egy egyszerű, ha mást. 585 00:48:10,290 --> 00:48:13,980 Ha gépelni CS50 hintáztatni, hogy kiírja: "Kapsz egy A." 586 00:48:13,980 --> 00:48:16,530 Máskülönben kiírja: "Kapsz egy D." 587 00:48:16,530 --> 00:48:23,770 Dőzsölés város. Rendben van. Igen? 588 00:48:23,770 --> 00:48:26,730 >> [Daniel] Szóval, amikor megpróbáltam ezt CS50 sziklák idézőjelek nélkül, 589 00:48:26,730 --> 00:48:29,290 azt mondja: "Kapsz egy D." 590 00:48:29,290 --> 00:48:32,560 Kellett az idézőjeleket, hogy azt a munkát, miért van ez? 591 00:48:32,560 --> 00:48:38,490 >> Igen. Kiderül, hogy ha - ez egy másik jó kis csemege - 592 00:48:38,490 --> 00:48:47,900 amikor futtatja a programot, ha fut, és mi írja be CS50 hintáztatni, 593 00:48:47,900 --> 00:48:50,800 csakúgy, mint Daniel azt mondta ő, és te Enter, 594 00:48:50,800 --> 00:48:52,870 még mindig azt mondja, hogy a D. 595 00:48:52,870 --> 00:48:55,580 És a kérdés az, hogy miért van ez? 596 00:48:55,580 --> 00:49:02,120 És kiderül, hogy mind a terminál és a GDB elemezze ezeket két külön érveket. 597 00:49:02,120 --> 00:49:04,800 Mert ha van egy hely, ami hallgatólagosan 598 00:49:04,800 --> 00:49:08,730 Az első érv véget ért, a következő érv kezdődik. 599 00:49:08,730 --> 00:49:13,260 Az út, hogy összekapcsolják a két, vagy sajnáljuk, egyetlen érv, 600 00:49:13,260 --> 00:49:18,510 az, hogy az idézetek. 601 00:49:18,510 --> 00:49:29,560 Tehát most, ha betette a idézőjelek és futtassa újra, akkor kap egy A. 602 00:49:29,560 --> 00:49:38,780 Szóval összefoglalva, idézőjelek nélkül, CS50 és kőzetek elemzett két külön érveket. 603 00:49:38,780 --> 00:49:45,320 Az idézetek, ez értelmezhető egy érvet összesen. 604 00:49:45,320 --> 00:49:53,070 >> Láthatjuk ezt a töréspontot. 605 00:49:53,070 --> 00:49:54,920 Eddig már fut a program, és ez már működik 606 00:49:54,920 --> 00:49:58,230 amíg vagy nem seg hibákat vagy látogatottság hiba 607 00:49:58,230 --> 00:50:05,930 vagy amíg kilépett, és minden teljesen rendben volt. 608 00:50:05,930 --> 00:50:08,360 Ez nem feltétlenül a leghasznosabb dolog, mert néha 609 00:50:08,360 --> 00:50:11,840 Van egy hiba a programban, de ez nem okoz szegmentációs hiba. 610 00:50:11,840 --> 00:50:16,950 Ez nem okozza a program, hogy hagyja abba, vagy ilyesmi. 611 00:50:16,950 --> 00:50:20,730 Az út, hogy GDB szüneteltetheti a program egy bizonyos ponton 612 00:50:20,730 --> 00:50:23,260 hogy hozzanak egy töréspont. 613 00:50:23,260 --> 00:50:26,520 Akkor sem Ehhez beállításával töréspont a függvény neve 614 00:50:26,520 --> 00:50:30,770 vagy beállíthatja a töréspontot egy adott sor kódot. 615 00:50:30,770 --> 00:50:34,450 Szeretem, hogy hozzanak töréspontok a függvény nevét, mert - könnyen megjegyezhető, 616 00:50:34,450 --> 00:50:37,700 és ha tényleg megy, és változtassa meg a forráskód egy kicsit, 617 00:50:37,700 --> 00:50:42,020 akkor a töréspont valóban marad ugyanazon a helyen belül a kódot. 618 00:50:42,020 --> 00:50:44,760 Mivel ha a sorszámok, és a sorszámok változik 619 00:50:44,760 --> 00:50:51,740 mert hozzáadni vagy törölni egy kódot, akkor a töréspont mind teljesen elcsesztem. 620 00:50:51,740 --> 00:50:58,590 Az egyik leggyakoribb dolog, amit tennie, hogy megadja a töréspontot a fő funkciója. 621 00:50:58,590 --> 00:51:05,300 Gyakran én indul el GDB, én b-típusú main, Enter, és hogy kell állítani egy töréspontot 622 00:51:05,300 --> 00:51:10,630 a fő funkció, amely csak azt mondja: "Szünet a programot, amint elkezdenek megjelenni," 623 00:51:10,630 --> 00:51:17,960 és így, amikor fut a program, mondjuk CS50 hintáztatni két érvet 624 00:51:17,960 --> 00:51:24,830 és nyomja meg az Enter, ez lesz a fő funkciót, és megáll jobbra az első sorban, 625 00:51:24,830 --> 00:51:30,620 jobbra előtt értékeli az strcmp funkciót. 626 00:51:30,620 --> 00:51:34,940 >> Mivel én megállt, most már lehet kezdeni mucking körül, és látta, hogy mi folyik itt 627 00:51:34,940 --> 00:51:40,250 minden a különböző változók átment a program. 628 00:51:40,250 --> 00:51:43,670 Itt ki is nyomtathatja argc és meglátjuk, mi folyik itt. 629 00:51:43,670 --> 00:51:50,030 Lásd, hogy argc 3, mert ez van 3 különböző értékeket is. 630 00:51:50,030 --> 00:51:54,060 Ez kapta a nevét a program, ez van az első és a második érvet érv. 631 00:51:54,060 --> 00:52:09,330 Mi lehet nyomtatni azokat ki nézi most argv [0], argv [1], és argv [2]. 632 00:52:09,330 --> 00:52:12,030 Szóval most is látni, hogy ez miért strcmp hívást fog sikertelen, 633 00:52:12,030 --> 00:52:21,650 mert látod, hogy nem osztott ki a CS50 és a sziklák két külön érveket. 634 00:52:21,650 --> 00:52:27,250 Ezen a ponton, ha egyszer megüt egy töréspontot, akkor is végig a program 635 00:52:27,250 --> 00:52:32,920 soronként, szemben a kezdő a program újra. 636 00:52:32,920 --> 00:52:35,520 Szóval, ha nem akarod, hogy indítsa el a programot újra, és csak tovább innen, 637 00:52:35,520 --> 00:52:41,970 akkor használja a continue parancsot, és továbbra is fog futni a program végéig. 638 00:52:41,970 --> 00:52:45,010 Ahogy tette ide. 639 00:52:45,010 --> 00:52:54,880 Azonban, ha újra a programot, CS50 hintáztatni, eléri a töréspontot újra, 640 00:52:54,880 --> 00:52:59,670 és ebben az időben, ha nem akarom, hogy csak menjen végig a többi program, 641 00:52:59,670 --> 00:53:08,040 Tudom használni a következő parancs, amit én is rövidítéséhez n. 642 00:53:08,040 --> 00:53:12,960 És ez fokozza a programon keresztül sorról sorra. 643 00:53:12,960 --> 00:53:17,530 Szóval, meg lehet nézni a dolgok végre, mint változók változás, ahogy a dolgok frissítve. 644 00:53:17,530 --> 00:53:21,550 Ami nagyon szép. 645 00:53:21,550 --> 00:53:26,570 A másik jó dolog helyett megismételve ugyanazt a parancsot újra és újra és újra, 646 00:53:26,570 --> 00:53:30,670 ha csak Enter - így itt látom, hogy nem írt be semmit - 647 00:53:30,670 --> 00:53:33,780 ha csak Enter, majd ismételje meg az előző parancsot, 648 00:53:33,780 --> 00:53:36,900 vagy az előző GDB parancs, amiket az imént be 649 00:53:36,900 --> 00:53:56,000 Én folyamatosan üti az Enter és akkor folyamatosan fokozza az én kódot sorról sorra. 650 00:53:56,000 --> 00:53:59,310 Azt javasoljuk, hogy a srácok, hogy menjen nézd meg a többi buggy programok is. 651 00:53:59,310 --> 00:54:01,330 Nincs ideje, hogy végig őket ma szakaszban. 652 00:54:01,330 --> 00:54:05,890 A forráskód van, így Ön milyen látni, mi folyik itt 653 00:54:05,890 --> 00:54:07,730 a színfalak mögött, ha kap tényleg elakad, 654 00:54:07,730 --> 00:54:11,940 de legalábbis, csak gyakorolni indítása GDB, 655 00:54:11,940 --> 00:54:13,940 fut a program, amíg tör rád, 656 00:54:13,940 --> 00:54:18,260 szerzés a backtrace, kitalálni, mi a funkciója a baleset volt, 657 00:54:18,260 --> 00:54:24,450 milyen vonal volt kapcsolva, kinyomtatott néhány változó értékeket, 658 00:54:24,450 --> 00:54:30,140 Csak így kedvet kapjanak rá, mert ez valóban segít jövőre. 659 00:54:30,140 --> 00:54:36,340 Ezen a ponton fogjuk lépni az GDB, melyeket nem használ kilép, vagy csak q. 660 00:54:36,340 --> 00:54:40,460 Ha a program közepén futó is, és ez nem kilépett, 661 00:54:40,460 --> 00:54:43,510 hogy mindig kérdezni: "Biztos vagy benne, hogy tényleg ki akar lépni?" 662 00:54:43,510 --> 00:54:48,770 Akkor csak nyomd meg igen. 663 00:54:48,770 --> 00:54:55,250 >> Most megyünk nézd meg a következő probléma van, ami a macska program. 664 00:54:55,250 --> 00:54:59,880 Ha nézed a rövid szóló átirányításával és a csövek, látni fogod, hogy Tommy használja ezt a programot 665 00:54:59,880 --> 00:55:07,540 hogy alapvetően kinyomtatja a kimeneti fájl a képernyőn. 666 00:55:07,540 --> 00:55:12,660 Tehát, ha elfutok macska, ez valójában egy beépített programot a készülék, 667 00:55:12,660 --> 00:55:16,860 és ha van Macs ezt megteheti a Mac is, ha nyit terminál. 668 00:55:16,860 --> 00:55:25,630 És mi - macska, mondjuk, cp.c, és nyomja meg az Entert. 669 00:55:25,630 --> 00:55:29,640 Mi ez a tett, ha lapozzunk fel egy kicsit, és látni, ahol vezette a sort, 670 00:55:29,640 --> 00:55:40,440 vagy ha már futott a cat parancs, szó szerint csak kinyomtatásra tartalmát cp.c a mi képernyőre. 671 00:55:40,440 --> 00:55:44,140 Mi lehet futni újra, és akkor hozott több fájlt együtt. 672 00:55:44,140 --> 00:55:49,880 Szóval meg tudod csinálni macska cp.c, aztán mi is összefűzi a cat.c fájlt, 673 00:55:49,880 --> 00:55:53,250 amely a program vagyunk arról írni, 674 00:55:53,250 --> 00:55:58,140 és ez lesz nyomtatni mindkét vissza a fájlokat vissza a képernyőre. 675 00:55:58,140 --> 00:56:05,490 Tehát ha felfelé egy kicsit, azt látjuk, hogy amikor futott ez a macska cp.c, cat.c, 676 00:56:05,490 --> 00:56:17,110 először azt nyomtatja ki a cp fájlt, majd alatta, hogy kinyomtatják a fájlt cat.c itt lent. 677 00:56:17,110 --> 00:56:19,650 Fogjuk használni ezt, hogy csak kap a lábunk nedves. 678 00:56:19,650 --> 00:56:25,930 Próbálja ki az egyszerű nyomtatást a terminálhoz, lásd hogyan működik. 679 00:56:25,930 --> 00:56:39,170 Ha a srácok nyit a gedit cat.c, Enter, 680 00:56:39,170 --> 00:56:43,760 láthatjuk a programot, hogy mi vagyunk arról írni. 681 00:56:43,760 --> 00:56:48,980 Már benne ezt a szép kazán lemez, így nem kell időt tölteni gépelési minden ki. 682 00:56:48,980 --> 00:56:52,310 Azt is ellenőrizze az átadott argumentumok számával be 683 00:56:52,310 --> 00:56:56,910 Mi nyomtassa ki egy szép használati üzenetet. 684 00:56:56,910 --> 00:57:00,950 >> Ez az a fajta dolog, hogy megint, mint mi már beszélünk, 685 00:57:00,950 --> 00:57:04,490 ez majdnem olyan, mint az izom memória. 686 00:57:04,490 --> 00:57:07,190 Ne feledd, hogy továbbra is ugyanaz a fajta dolog 687 00:57:07,190 --> 00:57:11,310 és mindig kinyomtatása valamiféle hasznos üzenet 688 00:57:11,310 --> 00:57:17,670 hogy az emberek tudják, hogyan kell futtatni a programot. 689 00:57:17,670 --> 00:57:21,630 A macska, ez elég egyszerű, mi csak megyek végig a különböző érveket 690 00:57:21,630 --> 00:57:24,300 amelyeket át a program, és mi fogunk nyomtatni 691 00:57:24,300 --> 00:57:29,950 azok tartalmát ki a képernyőre egyesével. 692 00:57:29,950 --> 00:57:35,670 Annak érdekében, hogy nyomtassa ki a fájlt a képernyőn, fogunk valamit csinálni nagyon hasonló 693 00:57:35,670 --> 00:57:38,120 hogy mit csináltunk a végén a kvíz. 694 00:57:38,120 --> 00:57:45,350 Végén a kvíz, hogy a bérlet program, meg kellett nyitni egy fájlt, 695 00:57:45,350 --> 00:57:48,490 és akkor kellett nyomtatni rajta. 696 00:57:48,490 --> 00:57:54,660 Ebben az esetben fogunk nyitni a fájlt, és fogjuk olvasni helyette. 697 00:57:54,660 --> 00:58:00,630 Akkor fogunk nyomtatni, ahelyett, hogy egy fájlt, fogunk nyomtatni a képernyőn. 698 00:58:00,630 --> 00:58:05,830 Tehát nyomtatás a képernyőre, amit minden történik, mielőtt a printf. 699 00:58:05,830 --> 00:58:08,290 Szóval ez nem túl őrült. 700 00:58:08,290 --> 00:58:12,190 De olvasni egy fájl furcsa. 701 00:58:12,190 --> 00:58:17,300 Majd megy keresztül, hogy egy kicsit egy időben. 702 00:58:17,300 --> 00:58:20,560 Ha mentek vissza, hogy az utolsó probléma a kvíz, a probléma 33, 703 00:58:20,560 --> 00:58:27,280 Az első sorban, hogy mi csinálunk itt, a fájl megnyitásakor, nagyon hasonló ahhoz, amit csináltunk ott. 704 00:58:27,280 --> 00:58:36,370 Szóval Stella, mit jelent, hogy a vonal néz, amikor megnyit egy fájlt? 705 00:58:36,370 --> 00:58:47,510 [Stella] Capital FILE *, file - >> Oké. >> - Egyenlő fopen. >> Aha. 706 00:58:47,510 --> 00:58:55,980 Amely ebben az esetben az? Ez a komment. 707 00:58:55,980 --> 00:59:06,930 >> Ez a komment? argv [i] és az r? 708 00:59:06,930 --> 00:59:11,300 >> Pontosan. Rendben. Szóval Stella Teljesen igaza van. 709 00:59:11,300 --> 00:59:13,720 Ez az, amit a vonal néz ki. 710 00:59:13,720 --> 00:59:19,670 Mi lesz, hogy egy fájlt patak változó tárolja FILE *, így minden sapkák, 711 00:59:19,670 --> 00:59:25,720 FILE, * és a neve ennek a változó lesz a fájl. 712 00:59:25,720 --> 00:59:32,250 Nevezhetjük azt, amit szeretünk. Nevezhetjük azt first_file vagy file_i, amit szeretnénk. 713 00:59:32,250 --> 00:59:37,590 És akkor a fájl neve fogadták el a parancssorban ezt a programot. 714 00:59:37,590 --> 00:59:44,450 Szóval ez tárolja argv [i], majd fogjuk megnyitni ezt a fájlt olvasási módban. 715 00:59:44,450 --> 00:59:48,100 Most, hogy megnyitotta a fájlt, hogy mi az a dolog, amit mindig emlékezni kell csinálni 716 00:59:48,100 --> 00:59:52,230 amikor mi már megnyitotta a fájlt? Csukd be. 717 00:59:52,230 --> 00:59:57,220 Szóval Missy, hogyan zárja be a fájlt? 718 00:59:57,220 --> 01:00:01,020 [Missy] fclose (file) >> fclose (fájl). Pontosan. 719 01:00:01,020 --> 01:00:05,340 Remek. Oké. Ha megnézzük ezt csinálni komment itt, 720 01:00:05,340 --> 01:00:11,940 azt mondja, "Open argv [i], és nyomtassa ki annak tartalmát az stdout-ra." 721 01:00:11,940 --> 01:00:15,460 >> Szabványos ki egy furcsa név. STDOUT csak magunk módján a mondás 722 01:00:15,460 --> 01:00:22,880 szeretnénk kinyomtatni a terminálra, szeretnénk nyomtatni a szabványos kimeneti stream. 723 01:00:22,880 --> 01:00:26,450 Mi lehet valójában hogy eltűnjön ez a megjegyzés itt. 724 01:00:26,450 --> 01:00:36,480 Fogom másolja és illessze be, mivel ez az, amit tettünk. 725 01:00:36,480 --> 01:00:41,290 Ezen a ponton most már olvasni a fájlt apránként. 726 01:00:41,290 --> 01:00:46,300 Már tárgyalt egy pár módja az olvasás fájlokat. 727 01:00:46,300 --> 01:00:51,830 Melyek a kedvenc eddig? 728 01:00:51,830 --> 01:00:57,960 Milyen módokon láttad, vagy nem emlékszik, hogy olvassa el a fájlokat? 729 01:00:57,960 --> 01:01:04,870 [Daniel] fread? >> Fread? Szóval fread egy. Jimmy, tudod, minden más? 730 01:01:04,870 --> 01:01:12,150 [Jimmy] Nem >> Oké. Nem. Charlotte? Alexander? Bármely többiek? Oké. 731 01:01:12,150 --> 01:01:20,740 Így a többi közül fgetc, az egyik, hogy mi fogjuk használni sokat. 732 01:01:20,740 --> 01:01:26,410 Van még fscanf; srácok látni egy mintát itt? 733 01:01:26,410 --> 01:01:29,170 Minden kezdődik f. Semmi köze a fájlt. 734 01:01:29,170 --> 01:01:35,260 Van fread, fgetc, fscanf. Ez az összes a olvasás funkciókat. 735 01:01:35,260 --> 01:01:49,120 Az írásban már fwrite, van fputc helyett fgetc. 736 01:01:49,120 --> 01:01:58,250 Mi is fprintf szeretne láttuk a kvíz. 737 01:01:58,250 --> 01:02:01,680 Mivel ez egy olyan probléma, amely magában foglalja olvasása fájlból, 738 01:02:01,680 --> 01:02:04,940 megyünk, hogy az egyik a három funkciót. 739 01:02:04,940 --> 01:02:10,890 Nem fogunk használni ezeket a funkciókat itt. 740 01:02:10,890 --> 01:02:14,880 Ezek a funkciók mind megtalálhatók a standard I / O könyvtár. 741 01:02:14,880 --> 01:02:17,510 Tehát, ha megnézi a tetején a program, 742 01:02:17,510 --> 01:02:24,110 akkor láthatjuk, hogy mi már tartalmazza a header fájlt a standard I / O könyvtár. 743 01:02:24,110 --> 01:02:27,120 Ha azt akarjuk, hogy kitaláljuk, melyik akarjuk használni, 744 01:02:27,120 --> 01:02:29,690 mi mindig nyissa meg a man oldalakat. 745 01:02:29,690 --> 01:02:34,350 Tehát írja férfi sdtio 746 01:02:34,350 --> 01:02:43,180 és olvassuk el az argumentum bemeneti és kimeneti funkciók C. 747 01:02:43,180 --> 01:02:49,870 És már látjuk oh, nézd. Ez idéző ​​fgetc, ez idéző ​​fputc. 748 01:02:49,870 --> 01:02:57,220 Szóval lehet bontani egy kicsit, és nézd meg, mondjuk, fgetc 749 01:02:57,220 --> 01:03:00,060 és nézd meg a man oldalt. 750 01:03:00,060 --> 01:03:03,430 Láthatjuk, hogy ez együtt jár egy csomó egyéb funkciók: 751 01:03:03,430 --> 01:03:12,640 fgetc, fgets, getc, getchar, kap, ungetc, és a bemeneti karakterek és karakterláncok. 752 01:03:12,640 --> 01:03:19,180 Tehát ez hogyan olvassuk karakterek és karakterláncok származó fájlokat a szabványos bemenetről, 753 01:03:19,180 --> 01:03:21,990 amely lényegében a felhasználó elől. 754 01:03:21,990 --> 01:03:24,780 És ez az, hogy hogyan csináljuk a tényleges C. 755 01:03:24,780 --> 01:03:30,850 Tehát ez nem a getString és GetChar funkciók 756 01:03:30,850 --> 01:03:36,840 hogy mi használt a CS50 könyvtárból. 757 01:03:36,840 --> 01:03:39,710 Fogjuk tenni ezt a problémát egy pár módon 758 01:03:39,710 --> 01:03:43,430 annak érdekében, hogy látható két különböző módon csinálja. 759 01:03:43,430 --> 01:03:48,490 Mind a fread funkció, amely Daniel említett és fgetc jó módon csinálni. 760 01:03:48,490 --> 01:03:53,790 Azt hiszem, fgetc egy kicsit könnyebb, mert csak, mint látod, 761 01:03:53,790 --> 01:03:59,660 egy paramétert, a FILE *, hogy próbálunk olvasni a karaktert, 762 01:03:59,660 --> 01:04:02,740 és a visszatérési értéke egy int. 763 01:04:02,740 --> 01:04:05,610 És ez egy kicsit zavaró, ugye? 764 01:04:05,610 --> 01:04:11,450 >> Mert a sorstól egy karaktert, miért nem ez a visszatérés a char? 765 01:04:11,450 --> 01:04:18,700 Srácok, van valami ötleted, hogy miért ez talán nem térhet vissza a karakter? 766 01:04:18,700 --> 01:04:25,510 [Missy válaszok, érthetetlen] >> Igen. Szóval Missy Teljesen igaza van. 767 01:04:25,510 --> 01:04:31,570 Ha ez ASCII, akkor ez egész lehetne térképezni, hogy a tényleges karakter. 768 01:04:31,570 --> 01:04:33,520 Lehet, hogy egy ASCII karaktert, és ez igaz. 769 01:04:33,520 --> 01:04:36,220 Pontosan mi történik. 770 01:04:36,220 --> 01:04:39,190 Mi használ int egyszerűen azért, mert több bit. 771 01:04:39,190 --> 01:04:44,750 Ez nagyobb, mint a char, amellyel char csak 8 bites, azaz 1 byte a mi 32-bites gépek. 772 01:04:44,750 --> 01:04:48,520 És egy int az összes 4 byte értékű helyet. 773 01:04:48,520 --> 01:04:50,940 És kiderül, hogy az a mód fgetc működik, 774 01:04:50,940 --> 01:04:53,940 ha lapozzunk lefelé a mi szinopszis ezen man oldal egy kicsit, 775 01:04:53,940 --> 01:05:05,000 lapozzunk egészen. Kiderül, hogy használja ezt a speciális értéket nevezzük EOF. 776 01:05:05,000 --> 01:05:09,640 Ez egy különleges állandó, mint a visszatérési értéke a függvény fgetc 777 01:05:09,640 --> 01:05:14,570 amikor bejön a végén a fájlt, vagy ha kap egy hiba. 778 01:05:14,570 --> 01:05:18,170 És kiderül, hogy kell csinálni ezeket összehasonlítások EOF megfelelően, 779 01:05:18,170 --> 01:05:24,060 azt szeretné, hogy az extra mennyiségű információt, hogy van egy int 780 01:05:24,060 --> 01:05:28,420 szemben egy char változó. 781 01:05:28,420 --> 01:05:32,130 Bár fgetc hatékony kapok egy karaktert egy fájlt, 782 01:05:32,130 --> 01:05:38,450 azt szeretnénk, hogy emlékezzen, hogy vissza valamit, ami a típus int az Ön számára. 783 01:05:38,450 --> 01:05:41,360 Igaz, ez viszonylag könnyen kezelhető. 784 01:05:41,360 --> 01:05:44,960 Ez lesz nekünk egy karaktert, így minden, amit meg kell tennie, hogy folyamatosan azt kérdezi a fájlt, 785 01:05:44,960 --> 01:05:48,440 "Add ide a következő karaktert, add nekem a következő karaktert, add nekem a következő karakter" 786 01:05:48,440 --> 01:05:51,400 amíg nem kap a végén a fájl. 787 01:05:51,400 --> 01:05:54,730 És ez majd húzza egy karaktert egy időben a mi fájl, 788 01:05:54,730 --> 01:05:56,250 és akkor mi is csinálni, amit szeretünk vele. 789 01:05:56,250 --> 01:06:00,160 Mi lehet tárolni, akkor add hozzá a húr, akkor nyomtassa ki. 790 01:06:00,160 --> 01:06:04,630 Tegye ezt. 791 01:06:04,630 --> 01:06:09,600 >> Nagyítás vissza, és megy vissza a cat.c program, 792 01:06:09,600 --> 01:06:16,170 ha fogunk használni fgetc, 793 01:06:16,170 --> 01:06:21,710 hogyan lehetne közeledünk a következő kódsort? 794 01:06:21,710 --> 01:06:26,020 Fogunk használni - fread fog tenni valami kicsit más. 795 01:06:26,020 --> 01:06:32,600 És ez időben, mi csak fogja használni fgetc kap egy karaktert egy időben. 796 01:06:32,600 --> 01:06:40,910 A folyamat teljes fájlt, hogy mi van, mit tegyek? 797 01:06:40,910 --> 01:06:44,030 Hány karakter van egy fájlba? 798 01:06:44,030 --> 01:06:47,390 Van egy csomó. Szóval érdemes kap egy 799 01:06:47,390 --> 01:06:49,860 és akkor kap egy másik, és még egy és még egy. 800 01:06:49,860 --> 01:06:53,330 Milyen algoritmus Mit gondolsz, lehet, hogy használni itt? 801 01:06:53,330 --> 01:06:55,470 Milyen típusú -? [Alexander] A for ciklus? >> Pontosan. 802 01:06:55,470 --> 01:06:57,500 Bizonyos típusú hurok. 803 01:06:57,500 --> 01:07:03,380 A for ciklus valójában nagy, ebben az esetben. 804 01:07:03,380 --> 01:07:08,620 És mint te mondtál, úgy hangzik, mint szeretnénk egy hurkot az egész fájlt, 805 01:07:08,620 --> 01:07:11,820 kapok egy karaktert egy időben. 806 01:07:11,820 --> 01:07:13,850 Minden javaslatokat, hogy mi nézne ki? 807 01:07:13,850 --> 01:07:22,090 [Alexander, érthetetlen] 808 01:07:22,090 --> 01:07:30,050 >> Oké, csak mondd meg angolul, mit akarsz csinálni? [Alexander, érthetetlen] 809 01:07:30,050 --> 01:07:36,270 Tehát ebben az esetben, úgy hangzik, mintha mi csak próbál hurok az egész fájlt. 810 01:07:36,270 --> 01:07:45,330 [Alexander] Szóval i > A méret -? 811 01:07:45,330 --> 01:07:49,290 Azt hiszem, a fájl mérete, ugye? A méret - we'll csak írni, mint ez. 812 01:07:49,290 --> 01:07:57,470 Fájl mérete egyelőre, i + +. 813 01:07:57,470 --> 01:08:04,610 Így kiderül, hogy az a mód akkor ezt a fgetc, és ez az új, 814 01:08:04,610 --> 01:08:10,460 az, hogy nincs egyszerű módja, hogy csak kap a fájlméret 815 01:08:10,460 --> 01:08:16,979 ezzel a "sizeof" típusú konstrukció, amit látott. 816 01:08:16,979 --> 01:08:20,910 Amikor használni, hogy fgetc függvényt, mi bevezetésével valamiféle 817 01:08:20,910 --> 01:08:29,069 új, funky szintaxis ezen a hurok, amikor használata helyett csak egy alap számláló 818 01:08:29,069 --> 01:08:33,920 menni karakterenkénti fogunk húzni egy karaktert egy időben, 819 01:08:33,920 --> 01:08:37,120 egy karaktert egy időben, és ahogyan tudjuk, hogy mi vagyunk a végén 820 01:08:37,120 --> 01:08:41,290 Nem, ha mi már számítani bizonyos számú karakter, 821 01:08:41,290 --> 01:08:49,939 de amikor a karakter már húzza ki, hogy a speciális fájl vége karakter. 822 01:08:49,939 --> 01:08:58,689 Így meg tudjuk csinálni ezt - hívom ezt a ch, és fogunk is inicializálása 823 01:08:58,689 --> 01:09:08,050 a mi első hívást kap az első karakter ki a fájlt. 824 01:09:08,050 --> 01:09:14,979 Szóval, ez a rész itt, ez lesz, hogy egy karakter ki a fájl 825 01:09:14,979 --> 01:09:20,840 és tárolja a változó ch. 826 01:09:20,840 --> 01:09:25,420 Fogjuk tartani ezt, amíg nem kap a végén a fájl, 827 01:09:25,420 --> 01:09:41,170 amelyhez nem tesztelésével a karakter nem volt egyenlő, hogy a különleges EOF karaktert. 828 01:09:41,170 --> 01:09:48,750 Aztán ahelyett, hogy ch + +, ami csak növelni az értéket, 829 01:09:48,750 --> 01:09:52,710 így ha azt olvassuk egy A ki a fájlt, a tőke egy, mondjuk, 830 01:09:52,710 --> 01:09:56,810 ch + + b adna nekünk, és akkor lennék c, majd a d. 831 01:09:56,810 --> 01:09:59,310 Ez nyilvánvalóan nem az, amit akarunk. Mit akarunk itt 832 01:09:59,310 --> 01:10:05,830 ebben az utolsó bit azt akarjuk, hogy a következő karaktert a fájlból. 833 01:10:05,830 --> 01:10:09,500 >> Szóval, hogyan lehet megkapjuk a következő karakter a fájlt? 834 01:10:09,500 --> 01:10:13,470 Hogyan jutunk az első karaktert a fájlból? 835 01:10:13,470 --> 01:10:17,200 [Student] fgetfile? >> Fgetc vagy, sajnálom, te teljesen igaza van. 836 01:10:17,200 --> 01:10:20,470 Elírtam ott ahol van. Szóval igen. 837 01:10:20,470 --> 01:10:26,240 Itt ahelyett, hogy ch + +, 838 01:10:26,240 --> 01:10:29,560 mi csak fog hívni fgetc (file) ismét 839 01:10:29,560 --> 01:10:39,180 és tárolja az eredményt a mi ugyanabban ch változó. 840 01:10:39,180 --> 01:10:43,730 [Student kérdés, érthetetlen] 841 01:10:43,730 --> 01:10:52,390 >> Ez az, ahol ezek a FILE * srácok különleges. 842 01:10:52,390 --> 01:10:59,070 Az, ahogyan dolgoznak, ők azok - amikor először nyit -, amikor először győződjön meg, hogy az fopen hívás, 843 01:10:59,070 --> 01:11:04,260 A FILE * hatékonyan szolgál mutatót a fájl elején. 844 01:11:04,260 --> 01:11:12,830 És akkor minden alkalommal, amikor hívják fgetc, mozog egy karakter át a fájlt. 845 01:11:12,830 --> 01:11:23,280 Szóval, amikor hívják ezt, te növelésével a fájl pointer egy karaktert. 846 01:11:23,280 --> 01:11:26,210 És ha fgetc újra, akkor áthelyezi egy másik karakter 847 01:11:26,210 --> 01:11:28,910 és egy másik karaktert, és egy másik karaktert, és egy másik karakter. 848 01:11:28,910 --> 01:11:32,030 [Student kérdés, érthetetlen] >> És ez - igen. 849 01:11:32,030 --> 01:11:34,810 Elég ez a varázslat a motorháztető alatt. 850 01:11:34,810 --> 01:11:37,930 Csak tartsa növelésével keresztül. 851 01:11:37,930 --> 01:11:46,510 Ezen a ponton, akkor tudja, hogy valóban dolgozni egy karaktert. 852 01:11:46,510 --> 01:11:52,150 Szóval hogyan is tudjuk kinyomtatni ezt ki a képernyőn, most? 853 01:11:52,150 --> 01:11:58,340 Tudjuk használni ugyanazt a printf dolog, amit korábban használt. 854 01:11:58,340 --> 01:12:00,330 Ezt mi már felhasználva minden félévben. 855 01:12:00,330 --> 01:12:05,450 Nevezhetjük printf, 856 01:12:05,450 --> 01:12:21,300 és mi lehet átadni a karakter csak úgy. 857 01:12:21,300 --> 01:12:27,430 Egy másik módja, hogy ahelyett printf és miután ezt format string, 858 01:12:27,430 --> 01:12:29,490 mi is alkalmazza az egyéb funkciókat. 859 01:12:29,490 --> 01:12:40,090 Tudjuk használni fputc, amely kiírja a karakter a képernyőn, 860 01:12:40,090 --> 01:12:52,580 kivéve, ha megnézzük fputc - hadd kicsinyítés egy kicsit. 861 01:12:52,580 --> 01:12:56,430 Látjuk, milyen szép ez vesz a karaktert, hogy mi olvasható ki a fgetc, 862 01:12:56,430 --> 01:13:05,100 de akkor meg kell adni, hogy egy patak nyomtatni. 863 01:13:05,100 --> 01:13:11,850 Azt is használja a putchar funkció, ami fel közvetlenül a szabványos ki. 864 01:13:11,850 --> 01:13:16,070 Tehát van egy csomó különböző lehetőségek, hogy tudjuk használni a nyomtatáshoz. 865 01:13:16,070 --> 01:13:19,580 Ők mind a standard I / O könyvtár. 866 01:13:19,580 --> 01:13:25,150 Ha szeretne nyomtatni - így printf alapértelmezés szerint kiírja a speciális szabványos ki-patak, 867 01:13:25,150 --> 01:13:27,910 amely szerint stdout-ra. 868 01:13:27,910 --> 01:13:41,300 Tehát, csak hivatkoznak rá, mint egyfajta E mágia érték stdout itt. 869 01:13:41,300 --> 01:13:48,410 Hoppá. Tegye a pontosvessző kívül. 870 01:13:48,410 --> 01:13:52,790 >> Ez a sok új, funky információ itt. 871 01:13:52,790 --> 01:13:58,600 Sok ez nagyon nyelvi, abban az értelemben, hogy ez kód 872 01:13:58,600 --> 01:14:05,700 hogy meg van írva így csak azért, mert tiszta olvasni, könnyen olvasható. 873 01:14:05,700 --> 01:14:11,520 Sok különböző módon kell csinálni, sok különböző funkciókat lehet használni, 874 01:14:11,520 --> 01:14:14,680 de hajlamosak vagyunk kövesse ugyanezeket a mintákat újra és újra. 875 01:14:14,680 --> 01:14:20,180 Tehát ne lepődj meg, ha látni kódot, mint ez jön fel újra és újra. 876 01:14:20,180 --> 01:14:25,690 Rendben van. Ezen a ponton meg kell törni a nap. 877 01:14:25,690 --> 01:14:31,300 Köszönöm, hogy eljött. Köszönjük, hogy megnézte ha online. És találkozunk jövő héten. 878 01:14:31,300 --> 01:14:33,890 [CS50.TV]