1 00:00:00,000 --> 00:00:02,730 [Powered by Google Translate] [5.nodaļa: mazāk apmierināti] 2 00:00:02,730 --> 00:00:05,180 [Nate Hardison, Hārvarda universitātes] 3 00:00:05,180 --> 00:00:08,260 [Tas ir CS50.] [CS50.TV] 4 00:00:08,260 --> 00:00:11,690 Tātad laipni atpakaļ, puiši. 5 00:00:11,690 --> 00:00:16,320 Welcome to 5 iedaļā. 6 00:00:16,320 --> 00:00:20,220 Šajā brīdī, ir pabeiguši viktorīnā 0 un redzot to, kā jūs esat darījuši, 7 00:00:20,220 --> 00:00:25,770 cerams jums justies tiešām labi, jo man bija ļoti iespaidu ar šajā sadaļā rādītājus. 8 00:00:25,770 --> 00:00:28,050 Mūsu tiešsaistes skatītāju, mēs esam bija pāris jautājumus 9 00:00:28,050 --> 00:00:33,680 par pēdējiem diviem problēmas uz problēmu komplektu - vai viktorīnas, diezgan. 10 00:00:33,680 --> 00:00:39,690 Tāpēc mēs esam gatavojas iet pār tiem tiešām ātri, lai visi redz, kas noticis 11 00:00:39,690 --> 00:00:45,060 un kā iet cauri faktisko risinājumu, nevis tikai meklē risinājumu pati. 12 00:00:45,060 --> 00:00:50,330 Mēs ejam, lai iet pa pēdējo pāris problēmas patiešām ātri, 32 un 33. 13 00:00:50,330 --> 00:00:53,240 Tikai atkal, tāpēc, ka tiešsaistes skatītāji var redzēt. 14 00:00:53,240 --> 00:00:59,080 >> Ja jūs savukārt jūsu problēmai 32, kuras ir 13 lapas, 15 00:00:59,080 --> 00:01:02,730 13 no 16 gadiem, problēma 32 ir visu par mijmaiņas darījumiem. 16 00:01:02,730 --> 00:01:05,010 Tas viss bija par pārnešana divus naturālus skaitļus. 17 00:01:05,010 --> 00:01:08,740 Tā ir problēma, ka mēs gribētu devusies vairāk nekā pāris reizes lekciju. 18 00:01:08,740 --> 00:01:13,590 Un šeit, ko mēs lūdzam jums jādara, ir ātrs atmiņu pēdas. 19 00:01:13,590 --> 00:01:17,000 Aizpildīt mainīgo lielumu vērtības, jo tie ir uz skursteņa 20 00:01:17,000 --> 00:01:20,250 kā kods iet caur šo mijmaiņas funkciju. 21 00:01:20,250 --> 00:01:24,500 Jo īpaši tas, ko mēs esam meklē - I'm gatavojas nodot šo iPad leju - 22 00:01:24,500 --> 00:01:29,650 jo īpaši, kāda mēs esam meklē, ir šī pozīcija numurētas 6 Labais šeit. 23 00:01:29,650 --> 00:01:36,740 Un tas ir numurēta 6 tikai saskarsmes ar iepriekšējo problēmu. 24 00:01:36,740 --> 00:01:41,720 Ko mēs vēlamies darīt, ir parādīt vai etiķete stāvokli atmiņas 25 00:01:41,720 --> 00:01:46,090 kā tas ir laikā, kad mēs izpildīt šo līniju skaits 6, 26 00:01:46,090 --> 00:01:52,540 kas ir faktiski atgriešanās no mūsu swap funkcija šeit. 27 00:01:52,540 --> 00:01:59,450 Ja mēs ritinātu uz leju šeit, mēs redzējām, ka viss atmiņas adreses bija paredzēts mums. 28 00:01:59,450 --> 00:02:02,540 Tas ir ļoti svarīgs, mēs būsim atpakaļ uz to tikai brīdi. 29 00:02:02,540 --> 00:02:09,240 Un tad noteikti šeit apakšā, mums bija, ka mēs ejam, lai atsauktos uz nedaudz atmiņas diagrammu. 30 00:02:09,240 --> 00:02:12,490 Man ir faktiski izdarīts uz manu iPad. 31 00:02:12,490 --> 00:02:20,720 Tāpēc es esmu gatavojas pārslēgties uz priekšu un atpakaļ starp iPad un šis kods tikai uzziņai. 32 00:02:20,720 --> 00:02:26,540 >> Sāksim. Pirmkārt, pieņemsim koncentrēties uz pirmo pāris līnijas galvenais šeit. 33 00:02:26,540 --> 00:02:30,220 Lai sāktu, mēs ejam, lai sāktu X 1 un y līdz 2. 34 00:02:30,220 --> 00:02:33,040 Tātad mums ir divas skaitlim mainīgie, viņi abi būs likts uz skursteņa. 35 00:02:33,040 --> 00:02:36,050 Mēs ejam, lai likt 1 un A 2 tiem. 36 00:02:36,050 --> 00:02:43,150 Tātad, ja es uzsist pa manu iPad, cerams, pieņemsim redzēt - 37 00:02:43,150 --> 00:02:48,660 Apple TV atspoguļojot, un tur mēs ejam. Labi. 38 00:02:48,660 --> 00:02:51,670 Tātad, ja es uzsist pa manu iPad, 39 00:02:51,670 --> 00:02:56,220 Es gribu, lai sāktu X 1 un y līdz 2. 40 00:02:56,220 --> 00:03:00,580 Mēs darīt gluži vienkārši rakstot 1 kastē atzīmēti X 41 00:03:00,580 --> 00:03:07,730 un lodziņā 2 atzīmēti y. Diezgan vienkārši. 42 00:03:07,730 --> 00:03:11,620 Tāpēc tagad iesim atpakaļ uz klēpjdators, redzēt, kas notiks tālāk. 43 00:03:11,620 --> 00:03:15,810 Tātad šis nākamais līnija ir, ja lietas iegūt grūts. 44 00:03:15,810 --> 00:03:28,110 Mēs iet no x adresi un y adresi kā parametru un b uz apmaiņas funkciju. 45 00:03:28,110 --> 00:03:32,380 No x un y adresi adrese ir lietas, ko mēs nevaram aprēķināt 46 00:03:32,380 --> 00:03:36,360 neatsaucoties uz šiem aizzīmju punktiem tiesības uz leju šeit. 47 00:03:36,360 --> 00:03:39,750 Un par laimi, pirmās divas aizzīmju punktiem mums pastāstīt, ko tieši atbildes ir. 48 00:03:39,750 --> 00:03:44,740 Gada x adrese atmiņā ir 10, un y adrese atmiņā ir 14. 49 00:03:44,740 --> 00:03:51,870 Tātad tie ir vērtības, kas get ritēja kā un b līdz top mūsu mijmaiņas funkciju. 50 00:03:51,870 --> 00:04:00,760 Tātad vēlreiz, pārejot atpakaļ uz mūsu diagrammu, es varētu uzrakstīt 10 no 51 00:04:00,760 --> 00:04:07,400 un 14 b. 52 00:04:07,400 --> 00:04:11,610 Tagad, šis punkts ir tas, kur mēs turpināt ar swap. 53 00:04:11,610 --> 00:04:14,520 Tāpēc flipping atpakaļ uz klēpjdators atkal, 54 00:04:14,520 --> 00:04:21,079 mēs redzam, ka tas, kā mijmaiņas darbojas, ir es pirmo reizi dereference un uzglabāt rezultāts TPP. 55 00:04:21,079 --> 00:04:27,650 Tātad dereference operators saka: "Hei. Treat saturu mainīgs kā adresi. 56 00:04:27,650 --> 00:04:33,830 Iet uz kāda tiek glabāti šajā adresē, un slodze to. " 57 00:04:33,830 --> 00:04:41,720 Ko jūs slodze no mainīgais tiks saglabāti mūsu tmp mainīgs. 58 00:04:41,720 --> 00:04:45,150 Flipping atpakaļ uz iPad. 59 00:04:45,150 --> 00:04:51,690 Ja mēs ejam, lai risinātu 10, mēs zinām, ka adrese 10 ir varible x 60 00:04:51,690 --> 00:04:55,480 jo mums bija teicis mūsu aizzīmes punktā ka x adrese atmiņā ir 10. 61 00:04:55,480 --> 00:05:00,180 Lai mēs varētu iet tur, iegūt vērtību no tā, kas ir 1, kā mēs redzam uz mūsu iPad, 62 00:05:00,180 --> 00:05:06,300 un slodze, kas stājas TMP. 63 00:05:06,300 --> 00:05:08,250 Atkal, tas nav galīgie saturs. 64 00:05:08,250 --> 00:05:14,350 Mēs ejam staigāt cauri un mēs sāksim mūsu gala stāvokli programmas beigās. 65 00:05:14,350 --> 00:05:17,210 Bet tieši tagad, mēs esam vērtību 1 glabājas TPP. 66 00:05:17,210 --> 00:05:19,210 >> Un tur ir ātrs jautājums nekā šeit. 67 00:05:19,210 --> 00:05:23,980 [Aleksandrs] Vai dereference operators - tas ir tikai zvaigzne iepretim mainīgo? 68 00:05:23,980 --> 00:05:27,600 >> Jā. Tātad dereference operators, jo mēs uzsist atpakaļ uz mūsu klēpjdators vēlreiz, 69 00:05:27,600 --> 00:05:33,780 tas ir zvaigzne tiesības priekšā. 70 00:05:33,780 --> 00:05:37,460 Šajā ziņā, tas ir - tu kontrastētu ar reizināšanas operatoru 71 00:05:37,460 --> 00:05:42,400 kas prasa divas lietas apakšpunktu.Dalībvalstij, kas dereference operators unary operators. 72 00:05:42,400 --> 00:05:46,130 Vienkārši piemērot vienu vērtību pretstatā bināro operatoru, 73 00:05:46,130 --> 00:05:48,810 kur jūs pieteikties uz divām dažādām vērtībām. 74 00:05:48,810 --> 00:05:52,080 Tātad tas, kas notiek šajā līnijā. 75 00:05:52,080 --> 00:05:58,390 Mēs ielādes vērtību 1 un uzglabā to mūsu pagaidu skaitlim mainīgo. 76 00:05:58,390 --> 00:06:05,800 Nākamais līnija, mēs glabāt saturu B uz - 77 00:06:05,800 --> 00:06:12,630 vai, drīzāk, mēs glabāt saturu, kas b tiek norāda uz uz to vietu, kur ir vērsts uz. 78 00:06:12,630 --> 00:06:17,690 Ja mēs analizējam šo no labās uz kreiso, mēs dereference b, 79 00:06:17,690 --> 00:06:23,580 mēs risinātu 14, mēs gatavojamies, lai greifers skaitlim, kas ir tur, 80 00:06:23,580 --> 00:06:26,900 un tad mēs gatavojamies iet uz adresi 10, 81 00:06:26,900 --> 00:06:34,240 un mēs mest rezultāts mūsu dereference no B uz šo vietu. 82 00:06:34,240 --> 00:06:40,080 Flipping atpakaļ uz mūsu iPad, kur mēs varam padarīt šo nedaudz vairāk betona, 83 00:06:40,080 --> 00:06:44,070 tas varētu palīdzēt, ja es rakstītu ciparus par visiem adresēm šeit. 84 00:06:44,070 --> 00:06:53,820 Tātad mēs zinām, ka y, mēs esam pēc 14 adreses, x ir pie 10 adreses. 85 00:06:53,820 --> 00:07:00,180 Kad mēs sākam pie b, mēs dereference b, mēs ejam, lai greifers vērtību 2. 86 00:07:00,180 --> 00:07:08,320 Mēs gatavojamies, lai greifers šo vērtību, jo tas ir vērtība, kas dzīvo pie 14 adreses. 87 00:07:08,320 --> 00:07:15,700 Un mēs ejam, lai nodot to mainīgo, kas dzīvo pie 10 adreses, 88 00:07:15,700 --> 00:07:19,160 kas ir labi tur, kuri atbilst mūsu mainīgo x. 89 00:07:19,160 --> 00:07:21,810 Lai mēs varam darīt mazliet pārrakstīšanu šeit 90 00:07:21,810 --> 00:07:35,380 kur mēs atbrīvoties no 1 mūsu un tā vietā mēs rakstīt 2. 91 00:07:35,380 --> 00:07:39,560 Tātad viss ir labi un labs pasaulē, pat ja mēs esam pārrakstīti x tagad. 92 00:07:39,560 --> 00:07:44,890 Mums ir saglabāti X veco vērtību mūsu tmp mainīga. 93 00:07:44,890 --> 00:07:50,210 Lai mēs varētu pabeigt mijmaiņas ar nākamo līniju. 94 00:07:50,210 --> 00:07:53,030 Flipping atpakaļ uz mūsu klēpjdators. 95 00:07:53,030 --> 00:07:58,150 Tagad viss, kas paliek, ir jāveic saturu no mūsu pagaidu skaitlim mainīgo 96 00:07:58,150 --> 00:08:05,630 un glabāt tos mainīgā kas dzīvo adresē, ka B ir holdinga. 97 00:08:05,630 --> 00:08:10,230 Tāpēc mēs esam gatavojas efektīvi dereference B piekļūt mainīgā 98 00:08:10,230 --> 00:08:14,340 kas ir pie adreses, kas b tur tajā, 99 00:08:14,340 --> 00:08:19,190 un mēs braucam, lai stuff vērtību, TVP ir turot to. 100 00:08:19,190 --> 00:08:23,280 Flipping atpakaļ uz iPad vēlreiz. 101 00:08:23,280 --> 00:08:31,290 Es varu izdzēst šo vērtību šeit, 2, 102 00:08:31,290 --> 00:08:41,010 un tā vietā mēs kopēt 1 tiesības tajā. 103 00:08:41,010 --> 00:08:43,059 Tad nākamais līnija, kas izpilda, protams - 104 00:08:43,059 --> 00:08:47,150 ja mēs uzsist atpakaļ uz klēpjdators - tas ir punkts 6, 105 00:08:47,150 --> 00:08:52,500 kas ir punkts, kurā mēs vēlējāmies, lai ir mūsu diagrammā pilnībā aizpildīts. 106 00:08:52,500 --> 00:08:58,940 Tāpēc flipping atpakaļ uz iPad vēlreiz, tikai, lai jūs varētu redzēt pabeigto diagrammu, 107 00:08:58,940 --> 00:09:06,610 Jūs varat redzēt, ka mums ir 10 no, 14 B, 1 pret TPP 2 X un Y 1. 108 00:09:06,610 --> 00:09:11,000 Vai ir kādi par šo jautājumu? 109 00:09:11,000 --> 00:09:14,640 Vai tas ir daudz lietderīgāk, kas gāja caur to? 110 00:09:14,640 --> 00:09:24,850 Padarīt mazāk nozīmē? Cerams, ka ne. Labi. 111 00:09:24,850 --> 00:09:28,230 >> Norādes ir ļoti grūts jautājums. 112 00:09:28,230 --> 00:09:33,420 Viens no puišiem mēs strādājam ar ir ļoti teiciens: 113 00:09:33,420 --> 00:09:36,590 "Lai saprastu norādes, jums vispirms ir jāsaprot norādes." 114 00:09:36,590 --> 00:09:40,530 Ko es domāju, ir ļoti patiess. Tas aizņem kādu laiku, lai pierastu pie tā. 115 00:09:40,530 --> 00:09:45,360 Zīmēšanas daudz bildes, zīmēšanas daudz atmiņas diagrammas, piemēram, šo vienu, ir ļoti noderīga, 116 00:09:45,360 --> 00:09:49,480 un pēc tam jūs staigāt pa piemēram, pēc piemēram, pēc piemēram, 117 00:09:49,480 --> 00:09:54,450 tas būs sākums, lai padarītu mazliet lielāka jēga un nedaudz vairāk jēgas un nedaudz lielāka jēga. 118 00:09:54,450 --> 00:10:01,560 Visbeidzot, kādu dienu, jums ir to visu pilnīgi apgūta. 119 00:10:01,560 --> 00:10:13,800 Visus jautājumus, pirms mēs pāriet uz nākamo problēmu? Labi. 120 00:10:13,800 --> 00:10:18,840 Tāpēc uzsist atpakaļ uz klēpjdators. 121 00:10:18,840 --> 00:10:23,300 Nākamā problēma mums ir problēma numur 33 uz failu I / O. 122 00:10:23,300 --> 00:10:26,350 Tuvinātu šo mazliet. 123 00:10:26,350 --> 00:10:28,710 Problēma 33 - Jā? 124 00:10:28,710 --> 00:10:32,110 >> [Daniels] Es tikko bija ātrs jautājums. Šī zvaigzne, vai zvaigznīte, 125 00:10:32,110 --> 00:10:35,590 to sauc dereferencing kad izmantot zvaigznīti pirms tam. 126 00:10:35,590 --> 00:10:38,820 Kas to sauc, kad jūs izmantojat & zīmi pirms? 127 00:10:38,820 --> 00:10:43,140 >> & Zīmi pirms ir adrese-operatora. 128 00:10:43,140 --> 00:10:45,880 Tāpēc pieņemsim ritināt atpakaļ uz augšu. 129 00:10:45,880 --> 00:10:49,310 Hmm. Es esmu tālummaiņas režīmā, tāpēc es nevaru īsti ritināšanas. 130 00:10:49,310 --> 00:10:52,780 Ja mēs skatāmies uz šo kodu tiešām ātri tieši šeit, 131 00:10:52,780 --> 00:10:54,980 atkal tas pats notiek. 132 00:10:54,980 --> 00:10:59,180 Ja mēs skatāmies uz šo kodu tepat, šajā līnijā, kur mēs zvans swap, 133 00:10:59,180 --> 00:11:10,460 & zīmi ir vienkārši pasakot "iegūt adresi, kurā mainīgās x dzīvību." 134 00:11:10,460 --> 00:11:14,460 Kad jūsu sastādītājs apkopo savu kodu, 135 00:11:14,460 --> 00:11:20,590 tas ir faktiski fiziski atzīmētu vietu atmiņā visiem jūsu mainīgo dzīvot. 136 00:11:20,590 --> 00:11:24,910 Un lai ko kompilators tad var darīt, kad tā ir apkopoti visu, 137 00:11:24,910 --> 00:11:31,110 tā zina, "Ak, man x pie 10 adresē man y pie 14 adreses.". 138 00:11:31,110 --> 00:11:34,640 To pēc tam var aizpildīt šos jums vērtībām. 139 00:11:34,640 --> 00:11:44,740 Tātad jūs varat - tas pēc tam var pāriet šo un nodot & Y, kā arī. 140 00:11:44,740 --> 00:11:50,730 Šie puiši iegūt adresi, bet viņi arī, kad iet tos mijmaiņas funkciju, 141 00:11:50,730 --> 00:11:55,690 šāda veida informāciju, šis int * šeit, stāsta kompilatoru, 142 00:11:55,690 --> 00:12:01,350 "Labi, mēs ejam, lai būtu Interpretējot šo adresi kā adresi skaitlim mainīgo." 143 00:12:01,350 --> 00:12:05,900 Kā adresi int, kas atšķiras no uzņēmuma adreses rakstzīmju mainīgā 144 00:12:05,900 --> 00:12:09,930 jo int aizņem, uz 32-bitu mašīna, aizņem 4 baitus no kosmosa, 145 00:12:09,930 --> 00:12:13,310 tā raksturs tikai aizņem 1 baitu telpu. 146 00:12:13,310 --> 00:12:17,310 Tātad, tas ir svarīgi zināt arī to, kas ir - kāda dzīvo, kāda veida vērtības 147 00:12:17,310 --> 00:12:20,340 dzīvo adresē, ka got pagājis iekšā 148 00:12:20,340 --> 00:12:22,020 Vai adresi, kas jums ir darīšana ar. 149 00:12:22,020 --> 00:12:29,020 Tādā veidā, jūs zināt, cik daudz baitu informācijas faktiski ielādēt no jūsu RAM. 150 00:12:29,020 --> 00:12:31,780 Un tad, jā, tas dereference operators, tāpat Tu jautāji, 151 00:12:31,780 --> 00:12:37,200 iet un piekļūst informācijai par konkrētu adresi. 152 00:12:37,200 --> 00:12:42,820 Tātad tā saka, ar šo mainīgo šeit, ārstēt saturu kā adresi, 153 00:12:42,820 --> 00:12:47,880 dodieties uz šo adresi, un izraut, slodze uz procesoru, slodze uz reģistrā 154 00:12:47,880 --> 00:12:56,340 faktiskās vērtības vai saturs, kas dzīvo šajā adresē. 155 00:12:56,340 --> 00:12:59,620 Kādi jautājumi? Tie ir labi jautājumi. 156 00:12:59,620 --> 00:13:01,650 Tas ir daudz jaunu terminu pārāk. 157 00:13:01,650 --> 00:13:09,800 Tas ir arī sava veida bailīgs, redzot & un * dažādās vietās. 158 00:13:09,800 --> 00:13:13,180 >> Labi. 159 00:13:13,180 --> 00:13:18,530 Tātad atpakaļ uz 33 problēmu, failu I / O 160 00:13:18,530 --> 00:13:22,540 Tas bija viens no šīs problēmas, kas, manuprāt pāris lietas notika. 161 00:13:22,540 --> 00:13:25,400 Viens, tas diezgan jaunu tēmu. 162 00:13:25,400 --> 00:13:30,590 Tas tika iesniegts diezgan drīz pirms viktorīnu, 163 00:13:30,590 --> 00:13:33,400 un tad es domāju, ka tas bija sava veida, piemēram, viens no tiem vārdu problēmas matemātikas 164 00:13:33,400 --> 00:13:39,720 ja viņi jums daudz informācijas, bet jūs tiešām nav galu galā, kam, lai izmantotu ton tā. 165 00:13:39,720 --> 00:13:44,060 Pirmā daļa no šīs problēmas ir apraksta to CSV fails ir. 166 00:13:44,060 --> 00:13:50,620 Tagad, CSV failu, saskaņā ar aprakstu, ir komatu atdalītu vērtību failu. 167 00:13:50,620 --> 00:13:55,300 Iemesls tie vispār interesanti, un iemesls jūs kādreiz tos izmantot, 168 00:13:55,300 --> 00:14:00,800 ir, jo, cik daudzi no jums ir kādreiz izmanto sīkumi, piemēram Excel? 169 00:14:00,800 --> 00:14:03,240 Skaitlis lielākā daļa no jums ir, iespējams, vai arī izmantot kādā brīdī savā dzīvē. 170 00:14:03,240 --> 00:14:06,430 Jūs izmantot kaut ko līdzīgu Excel. 171 00:14:06,430 --> 00:14:10,940 Lai iegūtu datus no Excel izklājlapas vai arī jebkāda veida apstrādes ar to, 172 00:14:10,940 --> 00:14:17,240 ja jūs gribēju rakstīt C programmu vai Python programmu, Java programmu, 173 00:14:17,240 --> 00:14:20,070 lai tiktu galā ar datiem, ko esat saglabājis tur, 174 00:14:20,070 --> 00:14:23,170 viens no visbiežāk veidus, lai saņemtu to, ir CSV failā. 175 00:14:23,170 --> 00:14:26,850 Un jūs varat atvērt Excel un, kad jūs iet uz "Save As" dialoga, 176 00:14:26,850 --> 00:14:32,840 Jūs varat iegūt no faktiskā CSV failu. 177 00:14:32,840 --> 00:14:35,890 >> Ērts zināt, kā tikt galā ar šīm lietām. 178 00:14:35,890 --> 00:14:42,010 Kā tā darbojas, ka tas ir līdzīgs - es domāju, tas ir būtībā atdarinot izklājlapu, 179 00:14:42,010 --> 00:14:47,590 kur, kā mēs redzam šeit, jo ļoti kreisās visvairāk gabals, 180 00:14:47,590 --> 00:14:49,910 Mums ir visas uzvārdus. 181 00:14:49,910 --> 00:14:54,670 Tāpēc mums ir Malan, tad Hardison, un tad Bowden, MacWilliam, un tad Chan. 182 00:14:54,670 --> 00:14:59,470 Visi pēdējie vārdi. Un tad komats atdala uzvārdus no pirmajiem vārdiem. 183 00:14:59,470 --> 00:15:02,970 Dāvids, Nate, Rob, Tommy, un Zamyla. 184 00:15:02,970 --> 00:15:06,850 Es vienmēr jaukt Robij un Toms. 185 00:15:06,850 --> 00:15:10,940 Un tad, beidzot, trešais kolonna ir e-pasta adreses. 186 00:15:10,940 --> 00:15:18,500 Kad jūs saprotat, ka, par programmas pārējais ir diezgan vienkārši īstenot. 187 00:15:18,500 --> 00:15:23,850 Ko mēs esam darījuši, lai atdarinātu šo pašu struktūru mūsu C programmā 188 00:15:23,850 --> 00:15:27,510 tiek mēs esam izmanto struktūru. 189 00:15:27,510 --> 00:15:30,520 Mēs sāksim spēlēt ar šiem nedaudz vairāk kā labi. 190 00:15:30,520 --> 00:15:35,790 Mēs redzējām tos pirmo mazliet problemātiskas komplekts 3, kad mēs bijām nodarbojas ar vārdnīcām. 191 00:15:35,790 --> 00:15:40,290 Bet šie darbinieki struktūrai saglabā pēdējo vārdu, vārds un e-pastu. 192 00:15:40,290 --> 00:15:44,500 Tāpat kā mūsu CSV failā tika glabāšanai. 193 00:15:44,500 --> 00:15:47,950 Tātad tas ir tikai konvertējot no viena formāta uz citu. 194 00:15:47,950 --> 00:15:54,630 Mums ir pārvērst, šajā gadījumā, personāla struct uz līnijas, 195 00:15:54,630 --> 00:15:59,060 komatu atdalīta līniju, tieši tāpat. 196 00:15:59,060 --> 00:16:01,500 Vai ir jēga? Jums puiši ir visas jāņem viktorīnu, 197 00:16:01,500 --> 00:16:07,680 tāpēc es domāju, jums ir vismaz bija kādu laiku, lai padomātu par to. 198 00:16:07,680 --> 00:16:16,410 >> Jo nomu funkciju, problēma lūdz mūs uzņemt - we'll tuvinātu šo mazliet - 199 00:16:16,410 --> 00:16:22,480 veikt personāla struktūru, personāla struct, ar vārdu s, 200 00:16:22,480 --> 00:16:30,900 un pievieno tās saturu mūsu staff.csv failā. 201 00:16:30,900 --> 00:16:34,230 Izrādās, ka tas ir diezgan vienkārši izmantot. 202 00:16:34,230 --> 00:16:37,430 Mēs veida spēlēt aptuveni ar šo funkciju nedaudz vairāk šodien. 203 00:16:37,430 --> 00:16:44,510 Bet šajā gadījumā, fprintf funkcija ir tiešām galvenais. 204 00:16:44,510 --> 00:16:51,960 Tātad ar fprintf, mēs varam drukāt, tāpat kā jums puiši ir bijis, izmantojot printf visu šo terminu. 205 00:16:51,960 --> 00:16:55,050 Jūs varat printf līnija uz failu. 206 00:16:55,050 --> 00:16:59,030 Tātad, nevis tikai padarot ierasto printf zvanu kur jūs arī tā formāta virknes 207 00:16:59,030 --> 00:17:05,380 un tad jūs nomainīt visus mainīgos ar šādiem argumentiem, 208 00:17:05,380 --> 00:17:11,290 ar fprintf, jūsu pašu pirmo argumentu ir vietā failu, kuru vēlaties rakstīt. 209 00:17:11,290 --> 00:17:21,170 Ja mēs apskatīt šo ierīci, piemēram, cilvēks fprintf, 210 00:17:21,170 --> 00:17:25,980 mēs varam redzēt atšķirību starp printf un fprintf. 211 00:17:25,980 --> 00:17:28,960 Es tuvinātu šeit mazliet. 212 00:17:28,960 --> 00:17:33,140 Tātad ar printf, mēs arī tā formāta virknes, un tad vēlāk nav iebildumu 213 00:17:33,140 --> 00:17:37,580 ir visi mainīgie nomaiņu vai aizstāšana mūsu formāta virknes. 214 00:17:37,580 --> 00:17:47,310 Tā ar fprintf, pirmais arguments ir patiešām šo failu * sauc plūsmā. 215 00:17:47,310 --> 00:17:51,800 >> Pārvietojas atpakaļ vairāk nekā šeit uz mūsu noma, 216 00:17:51,800 --> 00:17:54,550 mēs esam jau ieguvuši mūsu failu * plūsma atver mums. 217 00:17:54,550 --> 00:17:57,810 Tas, ko šis pirmais rindā dara, tas atver staff.csv failu, 218 00:17:57,810 --> 00:18:01,690 tas atver to pievienošanas režīmā, un viss, kas palicis pāri, lai mēs varētu darīt, ir 219 00:18:01,690 --> 00:18:08,640 rakstīt personāla struktūru uz failu. 220 00:18:08,640 --> 00:18:10,870 Un, pieņemsim redzēt, vēlos izmantot iPad? 221 00:18:10,870 --> 00:18:17,900 Es izmantot iPad. Mums ir tukšumu - Paraudzīsimies uz galda, lai es varētu uzrakstīt mazliet labāk - 222 00:18:17,900 --> 00:18:33,680 anulēta nomu un tā veic vienu argumentu, personāla struktūru sauc s. 223 00:18:33,680 --> 00:18:44,120 Got mūsu bikšturi, mēs esam ieguvuši mūsu failu * sauc failu, 224 00:18:44,120 --> 00:18:48,380 Mums ir mūsu fopen līnija, ko mums, 225 00:18:48,380 --> 00:18:51,890 un es ņemšu tikai rakstīt to kā punktiņi, jo tas jau pedia. 226 00:18:51,890 --> 00:19:00,530 Un tad uz mūsu nākamo līniju, mēs ejam, lai piezvanītu fprintf 227 00:19:00,530 --> 00:19:03,700 un mēs esam gatavojas pāriet failā, ka mēs vēlamies, lai izdrukātu, 228 00:19:03,700 --> 00:19:10,290 un tad mūsu formāta virkne, kas - 229 00:19:10,290 --> 00:19:14,300 Es jums guys man pateikt, kas tas izskatās. 230 00:19:14,300 --> 00:19:20,500 Kā par jums, Stella? Vai jūs zināt, ko pirmā daļa formāta virknes izskatās? 231 00:19:20,500 --> 00:19:24,270 [Stella] Es neesmu pārliecināts. >> Jūtieties brīvi uzdot Jimmy. 232 00:19:24,270 --> 00:19:27,690 Vai jūs zināt, Jimmy? 233 00:19:27,690 --> 00:19:31,000 [Jimmy] Vai tas tikai būt pēdējais? Es nezinu. Es neesmu pilnīgi pārliecināts. 234 00:19:31,000 --> 00:19:39,020 >> Labi. Kā par, bija kāds iegūt šo pareizi uz eksāmenu? 235 00:19:39,020 --> 00:19:41,770 Nē. Nu labi. 236 00:19:41,770 --> 00:19:47,920 Izrādās, ka šeit viss, kas mums jādara, ir mēs vēlamies katru daļu no mūsu personāla struktūras 237 00:19:47,920 --> 00:19:53,290 jāizdrukā kā virkne mūsu failu. 238 00:19:53,290 --> 00:19:59,900 Mēs tikai izmantot virknes aizvietojošas Raksturs trīs dažādos laikos, jo mums ir pēdējais vārds 239 00:19:59,900 --> 00:20:07,160 seko komats, tad vārds seko komats, 240 00:20:07,160 --> 00:20:12,430 un tad beidzot e-pasta adresi, kas ir jāievēro, - kas nav 241 00:20:12,430 --> 00:20:15,140 uzstādīšanai uz mana ekrāna - bet tas seko newline raksturs. 242 00:20:15,140 --> 00:20:20,060 Tāpēc es esmu gatavojas rakstīt tikai tur lejā. 243 00:20:20,060 --> 00:20:23,560 Un tad pēc mūsu formāta virknes, 244 00:20:23,560 --> 00:20:27,880 Mums vienkārši ir aizstāšanu, ko mēs piekļūt, izmantojot dot notation 245 00:20:27,880 --> 00:20:31,370 ka mēs redzējām problēmu kopumu 3. 246 00:20:31,370 --> 00:20:48,820 Mēs varam izmantot s.last, s.first un s.email 247 00:20:48,820 --> 00:20:58,990 aizstāt šajās trīs vērtības uz mūsu formāta virknes. 248 00:20:58,990 --> 00:21:06,190 Tātad, kā tas iet? Padarīt jēga? 249 00:21:06,190 --> 00:21:09,700 Jā? Nē? Iespējams? Labi. 250 00:21:09,700 --> 00:21:14,180 >> Pēdējā lieta, ko mēs darām, kad mēs esam izdrukāt un pēc tam mēs esam atvērti mūsu failu: 251 00:21:14,180 --> 00:21:17,370 kad mēs esam atvērti failu, mums vienmēr ir jāatceras, lai to aizvērtu. 252 00:21:17,370 --> 00:21:19,430 Jo citādi mēs galu galā noplūde atmiņas, 253 00:21:19,430 --> 00:21:22,500 izmantojot līdz failu deskriptori. 254 00:21:22,500 --> 00:21:25,950 Tātad, lai to aizvērtu, kura funkcija mēs izmantot? Daniel? 255 00:21:25,950 --> 00:21:30,120 [Daniels] fclose? >> Fclose, tieši tā. 256 00:21:30,120 --> 00:21:37,520 Tā pēdējā daļa no šīs problēmas bija pareizi slēgt datni, izmantojot fclose funkciju, 257 00:21:37,520 --> 00:21:40,370 kas tikai izskatās tāpat. 258 00:21:40,370 --> 00:21:43,880 Ne pārāk traks. 259 00:21:43,880 --> 00:21:46,990 Atdzist. 260 00:21:46,990 --> 00:21:49,520 Tā ka uz viktorīnas 33 problēma. 261 00:21:49,520 --> 00:21:52,480 Mums būs noteikti vairāk failu I / O nāk uz augšu. 262 00:21:52,480 --> 00:21:55,130 Mēs darīsim nedaudz vairāk lekciju šodien, vai sadaļā Šodien, 263 00:21:55,130 --> 00:22:01,710 jo tas, kas notiek, lai veidotu lielāko daļu no šīs gaidāmās PSET. 264 00:22:01,710 --> 00:22:05,020 Pāriesim no viktorīnas šajā brīdī. Jā? 265 00:22:05,020 --> 00:22:10,880 >> [Šarlote]] Kāpēc fclose (fails), nevis fclose (staff.csv)? 266 00:22:10,880 --> 00:22:19,100 >> Ah. Jo izrādās, ka - tāpēc jautājums, kas ir liels vienu, 267 00:22:19,100 --> 00:22:27,800 Tāpēc, kad mēs rakstīt fclose, mēs rakstiski fclose (fails) zvaigzne mainīgo 268 00:22:27,800 --> 00:22:33,680 atšķirībā no faila nosaukumu, staff.csv? Vai tas ir pareizi? Yeah. 269 00:22:33,680 --> 00:22:39,570 Tāpēc pieņemsim to apskatīt. Ja es pāriet atpakaļ uz manu klēpjdatoru, 270 00:22:39,570 --> 00:22:45,040 un pieņemsim apskatīt fclose funkciju. 271 00:22:45,040 --> 00:22:51,460 Tātad fclose funkcija aizver plūsmā, un tas notiek ar rādītāja ar straumi, ka mēs vēlamies, lai aizvērtu, 272 00:22:51,460 --> 00:22:57,010 atšķirībā faktisko faila nosaukumu, ka mēs vēlamies, lai aizvērtu. 273 00:22:57,010 --> 00:23:01,620 Un tas ir tāpēc, ka aiz ainas, kad jūs veicat zvanu uz fopen, 274 00:23:01,620 --> 00:23:12,020 kad jūs atvērt failu, jūs faktiski piešķirot atmiņu uzglabāt informāciju par failu. 275 00:23:12,020 --> 00:23:16,380 Tātad jums ir faila rādītāju, kas ir informācija par failu, 276 00:23:16,380 --> 00:23:23,080 piemēram, tas ir atvērts, tā izmērs, kur jūs pašlaik failā, 277 00:23:23,080 --> 00:23:29,100 lai jūs varētu veikt lasīšanas un rakstīšanas zvanus uz konkrēto vietu ietvaros failu. 278 00:23:29,100 --> 00:23:38,060 Jūs galu galā slēgšanu rādītāju instead noslēguma faila nosaukumu. 279 00:23:38,060 --> 00:23:48,990 >> Jā? [Daniels] Tātad, lai izmantotu īri, jūs teikt - kā tas iegūt lietotāja ievadi? 280 00:23:48,990 --> 00:23:53,830 Vai fprintf rīkoties kā GetString tādā nozīmē, ka tas būs tikai jāgaida lietotāja ievadi 281 00:23:53,830 --> 00:23:57,180 un lūgt jūs rakstīt šo - vai gaidīt, lai jūs varētu rakstīt šīs trīs lietas? 282 00:23:57,180 --> 00:24:00,480 Vai jums ir nepieciešams izmantot kaut ko ieviest nomas? 283 00:24:00,480 --> 00:24:04,100 >> Jā. Tāpēc mēs esam ne - jautājums bija, kā mēs iegūt lietotāja ievadi 284 00:24:04,100 --> 00:24:09,220 Lai īstenotu nomas? Un ko mēs esam šeit ir zvanītājs par īri, 285 00:24:09,220 --> 00:24:17,690 aizritēja personāla struct ar visiem datiem, kas glabājas struct jau. 286 00:24:17,690 --> 00:24:22,990 Tātad fprintf spēj tikai rakstīt, ka datus tieši uz failu. 287 00:24:22,990 --> 00:24:25,690 Nav lietotāja ievadi gaida. 288 00:24:25,690 --> 00:24:32,110 Lietotājs ir jau dota ievadi, pareizi ievietojot to šajā personāla struct. 289 00:24:32,110 --> 00:24:36,510 Un lietas, protams, būs pārtraukums, ja kāds no šiem šautru bija nulle, 290 00:24:36,510 --> 00:24:40,370 tāpēc mēs ritināt atpakaļ šeit, un mēs skatāmies uz mūsu struct. 291 00:24:40,370 --> 00:24:43,640 Mums ir stīgu pēdējā, stīgu pirmkārt, virkne e-pastu. 292 00:24:43,640 --> 00:24:48,530 Mēs tagad zinām, ka visi tie, patiešām, ar kapuci, ir char * mainīgie. 293 00:24:48,530 --> 00:24:53,470 Kas var vai nevar tikt vērsta uz null. 294 00:24:53,470 --> 00:24:55,800 Tie var būt vērsta uz atmiņas par kaudze, 295 00:24:55,800 --> 00:24:59,650 varbūt atmiņas par kaudze. 296 00:24:59,650 --> 00:25:04,580 Mums nav īsti zināt, bet, ja kāds no šiem norādes, ir spēkā, vai spēkā neesošu, 297 00:25:04,580 --> 00:25:08,120 ka būs noteikti crash mūsu nomas funkciju. 298 00:25:08,120 --> 00:25:11,050 Tas bija kaut kas bija sava veida plašāki par eksāmenu. 299 00:25:11,050 --> 00:25:16,440 Mēs esam ne neuztraucoties par to. 300 00:25:16,440 --> 00:25:22,170 Lieliski. Labi. Tā pārvietojas no viktorīnas. 301 00:25:22,170 --> 00:25:25,760 >> Pieņemsim slēgt šo puisis, un mēs ejam apskatīt pie 4 PSET. 302 00:25:25,760 --> 00:25:34,700 Tātad, ja jūs puiši paskatās PSET spec, kad jūs varat piekļūt, cs50.net/quizzes, 303 00:25:34,700 --> 00:25:42,730 mēs gatavojamies iet cauri daži no paragrāfu problēmām šodien. 304 00:25:42,730 --> 00:25:52,240 Es esmu ritinot - sadaļa ar jautājumiem sākas trešajā lapā PSET spec. 305 00:25:52,240 --> 00:25:57,800 Un pirmā daļa prasa, lai jūs iet un skatīties īsā novirzīt un caurulēm. 306 00:25:57,800 --> 00:26:02,820 Kas bija sava veida atdzist īss, parāda dažas jaunas, atdzist komandrindas triku, ka jūs varat izmantot. 307 00:26:02,820 --> 00:26:06,050 Un tad mēs esam ieguvuši dažus jautājumus jums kā labi. 308 00:26:06,050 --> 00:26:10,860 Šis pirmais jautājums par plūsmām, uz ko printf raksta pēc noklusējuma, 309 00:26:10,860 --> 00:26:15,920 mēs veida pieskārās tikai mazliet pirms brīža. 310 00:26:15,920 --> 00:26:22,380 Tas fprintf ka mēs tikai apspriežam uzņem failu * plūsmā kā tās argumentu. 311 00:26:22,380 --> 00:26:26,580 fclose veic, failu * plūsmā, kā arī, 312 00:26:26,580 --> 00:26:32,660 un atgriešanās vērtību fopen dod jums failu * plūsma, kā arī. 313 00:26:32,660 --> 00:26:36,060 Iemesls, kāpēc mēs neesam redzējuši tos agrāk, kad mēs esam nodarbojas ar printf 314 00:26:36,060 --> 00:26:39,450 ir tāpēc printf ir noklusējuma straumi. 315 00:26:39,450 --> 00:26:41,810 Un noklusējuma plūsma uz kuriem tā raksta 316 00:26:41,810 --> 00:26:45,190 Jūs uzzināsiet par in īss. 317 00:26:45,190 --> 00:26:50,080 Tāpēc noteikti to apskatīt to. 318 00:26:50,080 --> 00:26:53,010 >> Mūsdienu sadaļā, mēs esam gatavojas runāt mazliet par gdb, 319 00:26:53,010 --> 00:26:57,720 jo vairāk pazīstams jums ir ar to, jo vairāk prakse jums ar to, 320 00:26:57,720 --> 00:27:01,390 labāk jums būs faktiski vajāt bugs savu kodu. 321 00:27:01,390 --> 00:27:05,540 Tas paātrina procesu debugging augšu ārkārtīgi. 322 00:27:05,540 --> 00:27:09,230 Tātad, izmantojot printf, katru reizi, kad jūs darīt, ka jums ir recompile savu kodu, 323 00:27:09,230 --> 00:27:13,000 Jums ir palaist vēlreiz, dažkārt jums ir pārvietot printf zvanu apkārt, 324 00:27:13,000 --> 00:27:17,100 komentēt kodu, tas tikai aizņem laiku. 325 00:27:17,100 --> 00:27:20,850 Mūsu mērķis ir, lai mēģinātu pārliecināt, ka ar gdb, jūs varat būtībā 326 00:27:20,850 --> 00:27:26,810 printf jebkurā brīdī savu kodu kaut ko un jums nekad nav recompile to. 327 00:27:26,810 --> 00:27:35,120 Jūs nekad ir jāsāk un saglabāt guessing kur printf nākamo. 328 00:27:35,120 --> 00:27:40,910 Pirmais, kas jādara, ir kopēt šo līniju un saņemt sadaļā kodu nost no interneta. 329 00:27:40,910 --> 00:27:47,530 Es esmu kopēšana šī koda rindu, kas saka, "wget ​​http://cdn.cs50.net". 330 00:27:47,530 --> 00:27:49,510 Es esmu gatavojas kopēt to. 331 00:27:49,510 --> 00:27:55,950 Es iešu uz manu ierīci, zoom, lai jūs varētu redzēt, ko es esmu dara, 332 00:27:55,950 --> 00:28:01,890 ielīmējot to tur, un, kad es hit Enter, tas wget komandu burtiski ir tīmekļa iegūt. 333 00:28:01,890 --> 00:28:06,210 Tas notiek, lai nojaukt šo failu nost no interneta, 334 00:28:06,210 --> 00:28:11,790 un tas notiek, lai saglabātu to uz pašreizējo direktorijā. 335 00:28:11,790 --> 00:28:21,630 Tagad, ja man uzskaitīt manu pašreizējo direktoriju jūs varat redzēt, ka es esam ieguvuši šo section5.zip failu tiesības tur. 336 00:28:21,630 --> 00:28:25,260 Veids, kā tikt galā ar šo puisis ir unzip to, 337 00:28:25,260 --> 00:28:27,650 ko jūs varat darīt, komandrindas, tāpat kā šis. 338 00:28:27,650 --> 00:28:31,880 Section5.zip. 339 00:28:31,880 --> 00:28:36,980 Ka būs unzip to, izveidot mapi par mani, 340 00:28:36,980 --> 00:28:40,410 uzpūst visu saturu, viņus tur. 341 00:28:40,410 --> 00:28:47,410 Tāpēc tagad es varu iet manā 5.sadaļu direktoriju, izmantojot cd komandu. 342 00:28:47,410 --> 00:28:58,310 Notīrītu ekrānu, izmantojot skaidrs. Tātad skaidrs ekrānu. 343 00:28:58,310 --> 00:29:02,280 Tagad man jauku tīru termināli, lai risinātu ar. 344 00:29:02,280 --> 00:29:06,200 >> Tagad, ja es uzskaitīt visus failus, ko redzu šajā direktorijā, 345 00:29:06,200 --> 00:29:12,270 Jūs redzat, ka es esmu ieguva četras failus: buggy1, buggy2, buggy3, buggy4 un. 346 00:29:12,270 --> 00:29:16,180 Esmu arī saņēmu to atbilstīgos. C failus. 347 00:29:16,180 --> 00:29:20,400 Mēs nebrauksim, lai apskatīt. C failus tagad. 348 00:29:20,400 --> 00:29:24,140 Tā vietā, mēs ejam, lai tos izmantot, ja mēs atvērt GDB. 349 00:29:24,140 --> 00:29:28,220 Mēs esam tur tos apmēram tā, ka mums ir pieejami faktiskajam avota kodu, kad mēs esam izmantojot GDB, 350 00:29:28,220 --> 00:29:32,740 bet šīs daļas sadaļas mērķis ir lāpīt apkārt ar gdb 351 00:29:32,740 --> 00:29:40,370 un redzēt, kā mēs varam izmantot, lai noskaidrotu, kas notiek nepareizi ar katru no šīm četrām buggy programmām. 352 00:29:40,370 --> 00:29:43,380 Tāpēc mēs esam tikai gatavojas pa istabu tiešām ātri, 353 00:29:43,380 --> 00:29:47,000 un es esmu gatavojas lūgt kādu, lai palaistu vienu no buggy programmu, 354 00:29:47,000 --> 00:29:54,730 un tad mēs iesim kā grupa ar gdb, un mēs redzēsim, ko mēs varam darīt, lai noteikt šo programmu, 355 00:29:54,730 --> 00:29:58,460 vai vismaz noteikt to, kas notiek nepareizi katrā no tiem. 356 00:29:58,460 --> 00:30:04,760 Sāksim nekā šeit ar Danielu. Vai jūs palaist buggy1? Paskatīsimies, kas notiek. 357 00:30:04,760 --> 00:30:09,470 [Daniels] Tajā teikts tur pieteikumu vaina. >> Jā. Tieši tā. 358 00:30:09,470 --> 00:30:12,460 Tātad, ja es palaist buggy1, man seg vaina. 359 00:30:12,460 --> 00:30:16,210 Šajā brīdī, es varētu iet un atvērt buggy1.c, 360 00:30:16,210 --> 00:30:19,450 izmēģināt un saprast, kas notiek nepareizi, 361 00:30:19,450 --> 00:30:22,000 bet viens no visvairāk nepatīkams lietas par šo SEG vaina kļūda 362 00:30:22,000 --> 00:30:27,610 ir, ka tas nav pateikt jums par to līniju programmas lietām faktiski gāja greizi un lauza. 363 00:30:27,610 --> 00:30:29,880 Jūs veida ir jāskatās uz kodu 364 00:30:29,880 --> 00:30:33,990 un izrēķināt, izmantojot minējumu un pārbaudīt vai printf lai redzētu, kas notiek nepareizi. 365 00:30:33,990 --> 00:30:37,840 Viens no stilīgākais lietas par gdb ir, ka tas ir ļoti, ļoti viegli 366 00:30:37,840 --> 00:30:42,170 izrēķināt līniju, kurā jūsu programma avarē. 367 00:30:42,170 --> 00:30:46,160 Tas ir pilnīgi tā vērts, lai to izmantotu, pat ja tikai par to. 368 00:30:46,160 --> 00:30:56,190 Tātad, lai boot up GDB, es tipa GDB, un tad es arī tā ceļu uz izpildāmā, ka es gribu, lai palaistu. 369 00:30:56,190 --> 00:31:01,960 Šeit es esmu mašīnrakstīšanu gdb ./buggy1. 370 00:31:01,960 --> 00:31:06,600 Hit Enter. Dod man visu šo autortiesību informāciju, 371 00:31:06,600 --> 00:31:13,000 un noteikti šeit jūs redzēsiet šo līniju, kas saka, "Reading simbolus no / home / 372 00:31:13,000 --> 00:31:17,680 jharvard/section5/buggy1. " 373 00:31:17,680 --> 00:31:22,060 Un, ja viss noritēs labi, jūs redzēsiet to izdrukāt ziņu, kas izskatās šādi. 374 00:31:22,060 --> 00:31:25,500 Tas būs lasīt simboliem, tas būs teikt: "Es esmu lasījums simbolus no izpildāmo failu," 375 00:31:25,500 --> 00:31:29,900 un tad tas būs šo "gatavs" ziņojumu nekā šeit. 376 00:31:29,900 --> 00:31:35,410 Ja redzat kādu citu variantu tas, vai jūs redzat to nevar atrast simboli 377 00:31:35,410 --> 00:31:41,460 vai kaut kas tamlīdzīgs, ko tas nozīmē, ka jūs vienkārši nav sastādījuši savu izpildāmo pareizi. 378 00:31:41,460 --> 00:31:49,980 Kad mēs apkopotu programmas izmantošanai ar gdb, mums ir jāizmanto šis īpašais-G karogu, 379 00:31:49,980 --> 00:31:54,540 un tas darīts pēc noklusējuma, ja jūs sastādīt savu programmu, vienkārši ierakstot padara 380 00:31:54,540 --> 00:31:59,320 vai veikt buggy vai padarīt atgūt, kāds no tiem. 381 00:31:59,320 --> 00:32:07,800 Bet, ja jūs apkopojot manuāli ar šķindēt, tad jums ir iet un ietver ka-g karogu. 382 00:32:07,800 --> 00:32:10,310 >> Šajā brīdī, tagad, kad mums ir mūsu GDB uzvednes, 383 00:32:10,310 --> 00:32:12,310 tas ir diezgan vienkārši, lai palaistu programmu. 384 00:32:12,310 --> 00:32:19,740 Mēs varam vai nu rakstīt palaist, vai arī mēs varam tikai Type R. 385 00:32:19,740 --> 00:32:22,820 Vairums gdb komandas var būt saīsināts. 386 00:32:22,820 --> 00:32:25,940 Parasti tikai vienu vai pāris burti, kas ir diezgan jauki. 387 00:32:25,940 --> 00:32:30,980 Tātad Saad, ja jūs Type R un hit Enter, kas notiek? 388 00:32:30,980 --> 00:32:39,390 [Saad] Man SIGSEGV, segmentācijas vaina, un tad visu šo gobbledygook. 389 00:32:39,390 --> 00:32:43,650 >> Jā. 390 00:32:43,650 --> 00:32:47,990 Tāpat kā mēs redzam uz ekrāna tieši tagad, un tāpat Saad teica, 391 00:32:47,990 --> 00:32:53,430 kad mēs tipa skrējienu vai r un hit Enter, mēs joprojām saņemt to pašu seg vaina. 392 00:32:53,430 --> 00:32:55,830 Tātad, izmantojot gdb neatrisina mūsu problēmas. 393 00:32:55,830 --> 00:32:59,120 Bet tas dod mums kādu gobbledygook, un izrādās, ka tas gobbledygook 394 00:32:59,120 --> 00:33:03,080 patiesībā stāsta mums, kur tas notiek. 395 00:33:03,080 --> 00:33:10,680 Parsēt šo mazliet, šis pirmais bits ir funkcija, kurā viss notiek nepareizi. 396 00:33:10,680 --> 00:33:20,270 Tur tas __ strcmp_sse4_2, un tā stāsta mums, ka tas notiek šajā failā 397 00:33:20,270 --> 00:33:29,450 sauc sysdeps/i386, tas viss, atkal, sava veida haoss - bet līnija 254. 398 00:33:29,450 --> 00:33:31,670 Tas ir sava veida grūti parsēt. Parasti, kad jūs redzat sīkumi kā šis, 399 00:33:31,670 --> 00:33:38,770 tas nozīmē, ka tā ir SEG faulting vienā no sistēmas bibliotēkās. 400 00:33:38,770 --> 00:33:43,220 Lai kaut ko darīt ar strcmp. Jums puiši ir redzējuši strcmp pirms tam. 401 00:33:43,220 --> 00:33:52,730 Ne pārāk traks, bet vai tas nozīmē, ka strcmp ir bojāts vai ka tur ir ar strcmp problēma? 402 00:33:52,730 --> 00:33:57,110 Ko jūs domājat, Aleksandrs? 403 00:33:57,110 --> 00:34:04,890 [Aleksandrs] Vai tas - ir 254 līnijas? Un - ne binārā, bet tas nav viņu griesti, 404 00:34:04,890 --> 00:34:10,590 un tad tur ir cita katrai funkcijai valoda. Ir tas, ka 254 Šajā funkciju, vai -? 405 00:34:10,590 --> 00:34:21,460 >> Tas ir līnija 254. Tas izskatās šajā. S failu, tāpēc tas ir montāža kods iespējams. 406 00:34:21,460 --> 00:34:25,949 >> Bet, es domāju, jo lielāka lieta ir, jo mēs esam gotten seg vaina, 407 00:34:25,949 --> 00:34:29,960 un izskatās, ka tas nāk no strcmp funkciju, 408 00:34:29,960 --> 00:34:38,030 tas nozīmē, tad, ka strcmp ir bojāta? 409 00:34:38,030 --> 00:34:42,290 Tā nedrīkst, cerams. Tik vienkārši, jo jums ir segmentēšanas vaina 410 00:34:42,290 --> 00:34:49,480 vienā no sistēmas funkcijas, parasti tas nozīmē, ka jūs vienkārši nav sauc to pareizi. 411 00:34:49,480 --> 00:34:52,440 Ātrākais, kas jādara, lai noskaidrotu, kas patiesībā notiek 412 00:34:52,440 --> 00:34:55,500 ja redzat kaut ko crazy, piemēram, tas, kad jūs redzat seg vaina, 413 00:34:55,500 --> 00:34:59,800 it īpaši, ja jums ir programma, kas ir, izmantojot vairāk nekā tikai galvenais, 414 00:34:59,800 --> 00:35:03,570 ir izmantot Izcelsme. 415 00:35:03,570 --> 00:35:13,080 Es īsināt Izcelsme rakstot BT, nevis pilnu Izcelsme vārdu. 416 00:35:13,080 --> 00:35:16,510 Bet Šarlote, kas notiek, ja jūs tipa BT un hit Enter? 417 00:35:16,510 --> 00:35:23,200 [Šarlote] Tas rāda man divas līnijas, līnija 0 un līnija 1. 418 00:35:23,200 --> 00:35:26,150 >> Jā. Tik līnija 0 un līnija 1. 419 00:35:26,150 --> 00:35:34,560 Tie ir faktiski kaudze rāmji, kas bija pašlaik spēlēt, kad jūsu programma avarēja. 420 00:35:34,560 --> 00:35:42,230 Sākot no augšējā rāmja, rāmis 0, un dodas uz grunts visvairāk, kas ir rāmis 1. 421 00:35:42,230 --> 00:35:45,140 Mūsu augšējais rāmis ir strcmp rāmis. 422 00:35:45,140 --> 00:35:50,080 Jūs varat domāt par to kā līdzīgs ar šo problēmu mums bija tikai dara uz viktorīnas ar šautru, 423 00:35:50,080 --> 00:35:54,890 kur mums bija swap steka rāmi virsū galveno kaudze rāmi, 424 00:35:54,890 --> 00:35:59,700 un mums bija mainīgie ka mijmaiņas bija, izmantojot uz augšu mainīgajiem, galvenais bija, izmantojot. 425 00:35:59,700 --> 00:36:08,440 Te mūsu avārija notika mūsu strcmp funkciju, ko sauca par mūsu galveno funkciju, 426 00:36:08,440 --> 00:36:14,370 un Izcelsme dod mums ne tikai tās funkcijas, kurā lietas neizdevās, 427 00:36:14,370 --> 00:36:16,440 bet tas arī stāsta mums, kur viss tika saukta no. 428 00:36:16,440 --> 00:36:18,830 Tātad, ja es ritiniet pa nedaudz vairāk pa labi, 429 00:36:18,830 --> 00:36:26,110 mēs varam redzēt, ka jā, mēs esam uz šīs strcmp-sse4.s failu 254 līniju. 430 00:36:26,110 --> 00:36:32,540 Bet zvans tika veikts buggy1.c, līnijas 6. 431 00:36:32,540 --> 00:36:35,960 Tātad tas nozīmē, ka mēs varam darīt, - ir, mēs varam tikai iet pārbaudīt un redzēt, kas notiek 432 00:36:35,960 --> 00:36:39,930 pie buggy1.c, līnijas 6. 433 00:36:39,930 --> 00:36:43,780 Atkal, ir daži veidi, kā to izdarīt. Viens ir, lai izietu ārpus gdb 434 00:36:43,780 --> 00:36:49,460 vai ir jūsu kods atvērts citā logā un atsauci. 435 00:36:49,460 --> 00:36:54,740 Ka, un pats par sevi, ir diezgan ērts, jo tagad, ja jūs esat pie darba laika 436 00:36:54,740 --> 00:36:57,220 un jūs esat ieguvuši seg vainu un jūsu TF ir jautājums, kur viss bija sadalīšana, 437 00:36:57,220 --> 00:36:59,710 Jūs varat vienkārši pateikt: "Ak, līnija 6. Es nezinu, kas notiek, 438 00:36:59,710 --> 00:37:03,670 bet kaut aptuveni 6 līniju rada mana programma, lai izjauktu. " 439 00:37:03,670 --> 00:37:10,430 Otrs veids, kā to izdarīt, ir, jūs varat izmantot šo komandu sauc saraksts gdb. 440 00:37:10,430 --> 00:37:13,650 Jūs varat arī saīsināt to ar l. 441 00:37:13,650 --> 00:37:18,910 Tātad, ja mēs hit l, ko mēs tur nonācām? 442 00:37:18,910 --> 00:37:21,160 Mēs iegūtu visu ķekars dīvaini stuff. 443 00:37:21,160 --> 00:37:26,030 Tas ir faktiskais montāža kodu 444 00:37:26,030 --> 00:37:29,860 kas ir strcmp_sse4_2. 445 00:37:29,860 --> 00:37:32,440 Tas izskatās veida bailīgs, 446 00:37:32,440 --> 00:37:36,520 un iemesls, kāpēc mēs esam iegūt tas ir tāpēc tieši tagad, 447 00:37:36,520 --> 00:37:40,160 Gdb ir mūs 0 rāmī. 448 00:37:40,160 --> 00:37:43,070 >> Tātad, jebkurā laikā mēs skatāmies mainīgajiem, jebkurā laikā mēs skatāmies pirmkodu, 449 00:37:43,070 --> 00:37:50,530 Mēs esam meklē pirmkodu, kas attiecas uz skursteņa rāmja mēs šobrīd collas 450 00:37:50,530 --> 00:37:53,200 Tātad, lai iegūtu kaut ko jēgpilnu, mums ir 451 00:37:53,200 --> 00:37:57,070 pārcelties uz kaudze rāmi, kas ir lielāka jēga. 452 00:37:57,070 --> 00:38:00,180 Šajā gadījumā galvenais kaudze rāmis būtu nedaudz lielāka jēga, 453 00:38:00,180 --> 00:38:02,680 jo tas bija tiešām kods, kas mums rakstīja. 454 00:38:02,680 --> 00:38:05,330 Ne strcmp kodu. 455 00:38:05,330 --> 00:38:08,650 Tas, kā jūs varat pārvietoties starp kadriem, šajā gadījumā, jo mums ir divi, 456 00:38:08,650 --> 00:38:10,430 mums ir 0 un 1, 457 00:38:10,430 --> 00:38:13,650 jums, ka ar uz augšu un uz leju komandām. 458 00:38:13,650 --> 00:38:18,480 Ja es pārvietotos vienu rāmi, 459 00:38:18,480 --> 00:38:21,770 Tagad es esmu galvenajā kaudze rāmi. 460 00:38:21,770 --> 00:38:24,330 Es varētu pārvietot uz leju, lai dotos atpakaļ, kur es biju, 461 00:38:24,330 --> 00:38:32,830 iet uz augšu atkal iet uz leju atkal, un iet atkal. 462 00:38:32,830 --> 00:38:39,750 Ja jūs kādreiz darīt savu programmu gdb, jūs saņemsiet crash, jūs saņemsiet Izcelsme, 463 00:38:39,750 --> 00:38:42,380 un jūs redzēsiet, ka tas ir kaut kādā failā, ka jūs nezināt, kas notiek. 464 00:38:42,380 --> 00:38:45,460 Jūs mēģināt sarakstu, kods neizskatās pazīstami ar jums, 465 00:38:45,460 --> 00:38:48,150 veikt apskatīt jūsu rāmjiem un izdomāt, kur jūs esat. 466 00:38:48,150 --> 00:38:51,010 Jūs, iespējams, nepareizi kaudze rāmi. 467 00:38:51,010 --> 00:38:58,760 Vai vismaz tu esi kaudze rāmi, kas nav viens, ka jūs tiešām var atkļūdot. 468 00:38:58,760 --> 00:39:03,110 Tagad, ka mēs esam atbilstošā kaudze rāmi, mēs esam galvenie, 469 00:39:03,110 --> 00:39:08,100 Tagad mēs varam izmantot saraksta komandu, lai noskaidrotu, kāda līnija bija. 470 00:39:08,100 --> 00:39:13,590 Un jūs varat redzēt, tas drukāts to mums šeit. 471 00:39:13,590 --> 00:39:19,470 Bet mēs varam hit uzskaitīt visu to pašu, un sarakstā dod mums šo jauku izdruku 472 00:39:19,470 --> 00:39:23,920 Faktiskās avota kodu, kas notiek šeit. 473 00:39:23,920 --> 00:39:26,420 >> Jo īpaši, mēs varam apskatīt pie 6 līniju. 474 00:39:26,420 --> 00:39:29,330 Mēs varam redzēt, kas notiek šeit. 475 00:39:29,330 --> 00:39:31,250 Un izskatās, ka mēs nesam virkni salīdzinājumu 476 00:39:31,250 --> 00:39:41,050 starp virkni "CS50 klintīm" un ARGV [1]. 477 00:39:41,050 --> 00:39:45,700 Kaut kas par šo bija crashing. 478 00:39:45,700 --> 00:39:54,120 Tātad Missy, jums ir kādas domas par to, kas varētu būt šeit notiek? 479 00:39:54,120 --> 00:39:59,400 [Missy] Es nezinu, kāpēc tas ir crashing. >> Jūs nezināt, kāpēc tas ir crashing? 480 00:39:59,400 --> 00:40:02,700 Jimmy, kādas domas? 481 00:40:02,700 --> 00:40:06,240 [Jimmy] Es neesmu pilnīgi pārliecināts, bet pēdējo reizi mēs izmantojām virkni salīdzināt, 482 00:40:06,240 --> 00:40:10,260 vai strcmp, mums bija, piemēram, trīs dažādas lietas, par kurām tā. 483 00:40:10,260 --> 00:40:12,800 Mums nebija ==, es nedomāju, tiesības šajā pirmajā rindā. 484 00:40:12,800 --> 00:40:16,700 Tā vietā tas tika sadalīts trīs, un viens bija == 0, 485 00:40:16,700 --> 00:40:19,910 viens bija <0, es domāju, un viens bija> 0. 486 00:40:19,910 --> 00:40:22,590 Tāpēc varbūt kaut kas tamlīdzīgs? >> Jā. Tātad tur ir šis jautājums 487 00:40:22,590 --> 00:40:27,200 gada mēs darām salīdzinājumu pareizi? 488 00:40:27,200 --> 00:40:31,660 Stella? Jebkurš domas? 489 00:40:31,660 --> 00:40:38,110 [Stella] Es neesmu pārliecināts. >> Nav pārliecināts. Daniel? Domas? Labi. 490 00:40:38,110 --> 00:40:44,770 Izrādās, kas notiek šeit ir, kad mēs skrēja programmu 491 00:40:44,770 --> 00:40:48,370 un mēs saņēmām seg vaina, kad skrēja programmu pirmo reizi, Daniel, 492 00:40:48,370 --> 00:40:50,800 tu arī tā nekādus komandrindas argumentus? 493 00:40:50,800 --> 00:40:58,420 [Daniels] Nē >> Nr Šajā gadījumā, kāda ir vērtība ARGV [1]? 494 00:40:58,420 --> 00:41:00,920 >> Nav vērtības. >> Tiesības. 495 00:41:00,920 --> 00:41:06,120 Nu, nav lietderīgi virknes vērtību. 496 00:41:06,120 --> 00:41:10,780 Bet ir dažas vērtības. Kas ir vērtība, kas izpaužas glabājas tur? 497 00:41:10,780 --> 00:41:15,130 >> Atkritumu vērtība? >> Tas ir vai nu atkritumu vērtība vai, šajā gadījumā, 498 00:41:15,130 --> 00:41:19,930 Iestādi par argv masīvs gals vienmēr ir izbeigts ar null. 499 00:41:19,930 --> 00:41:26,050 Tātad, ko faktiski ieguva glabājas tur ir nulle. 500 00:41:26,050 --> 00:41:30,810 Otrs veids, kā atrisināt šo, nevis domāt cauri, 501 00:41:30,810 --> 00:41:33,420 ir mēģināt izdrukāt to ārā. 502 00:41:33,420 --> 00:41:35,880 Tas ir, ja es teicu, ka, izmantojot GDB ir liels, 503 00:41:35,880 --> 00:41:40,640 jo jūs varat izdrukāt visus mainīgos, visas vērtības, ko vēlaties 504 00:41:40,640 --> 00:41:43,230 izmantojot šo ērts-lielisks p komandu. 505 00:41:43,230 --> 00:41:48,520 Tātad, ja es rakstīt p un tad es ierakstiet mainīgā vērtību vai arī mainīgā nosaukums, 506 00:41:48,520 --> 00:41:55,320 saka, argc, es redzu, ka argc ir 1. 507 00:41:55,320 --> 00:42:01,830 Ja es gribu, lai izdrukātu ARGV [0], es varētu darīt tieši tāpat. 508 00:42:01,830 --> 00:42:04,840 Un kā mēs redzējām, argv [0] vienmēr ir nosaukums jūsu programmas, 509 00:42:04,840 --> 00:42:06,910 vienmēr nosaukumu izpildāmā. 510 00:42:06,910 --> 00:42:09,740 Šeit jūs redzētu to ieguva pilnu ceļa nosaukumu. 511 00:42:09,740 --> 00:42:15,920 Es varu arī izdrukāt argv [1], un redzēt, kas notiek. 512 00:42:15,920 --> 00:42:20,890 >> Šeit mēs saņēmām šāda veida mistisku vērtību. 513 00:42:20,890 --> 00:42:23,890 Mēs saņēmām šo 0x0. 514 00:42:23,890 --> 00:42:27,850 Atceros sākumā termiņa, kad mēs runājām par heksadecimālo skaitļu? 515 00:42:27,850 --> 00:42:34,680 Vai ka maz jautājums beigās 0 PSET par to, kā pārstāvēt 50 hex? 516 00:42:34,680 --> 00:42:39,410 Veids, kā mēs rakstīt heksadecimālskaitļus CS, tikai ne sajaukt sevi 517 00:42:39,410 --> 00:42:46,080 ar cipariem aiz skaitļiem, ir mums vienmēr priedēklis viņus ar 0x. 518 00:42:46,080 --> 00:42:51,420 Tātad šī 0x priedēklis vienmēr nozīmē tikai interpretēt šo numuru kā heksadecimālo numuru, 519 00:42:51,420 --> 00:42:57,400 nevis kā virkne, nevis kā decimālskaitlis, nevis kā bināro numuru. 520 00:42:57,400 --> 00:43:02,820 Kopš skaits 5-0 ir derīgs numurs heksadecimālā. 521 00:43:02,820 --> 00:43:06,240 Un tas ir numurs decimālā, 50. 522 00:43:06,240 --> 00:43:10,050 Tātad tas ir tikai kā mēs disambiguate. 523 00:43:10,050 --> 00:43:14,860 Tātad 0x0 līdzekļi sešpadsmitnieku 0, kas ir arī decimālais 0, binārā 0. 524 00:43:14,860 --> 00:43:17,030 Tas ir tikai vērtība 0. 525 00:43:17,030 --> 00:43:22,630 Izrādās, ka tas ir tas Null ir, faktiski, atmiņā. 526 00:43:22,630 --> 00:43:25,940 Null ir tikai 0. 527 00:43:25,940 --> 00:43:37,010 Lūk, elements glabājas ARGV [1] ir nulle. 528 00:43:37,010 --> 00:43:45,220 Tāpēc mēs cenšamies salīdzināt mūsu "CS50 Rocks" virknes Null virkni. 529 00:43:45,220 --> 00:43:48,130 Tātad dereferencing null, mēģinot piekļūt lietas pie null, 530 00:43:48,130 --> 00:43:55,050 tie parasti gatavojas radīt kaut kādas segmentācijas kļūdas vai citas sliktas lietas notiek. 531 00:43:55,050 --> 00:43:59,350 Un izrādās, ka strcmp nav pārbaudīt, lai redzētu 532 00:43:59,350 --> 00:44:04,340 vai jūs esat izturējis tādā vērtībā, kas ir nulle. 533 00:44:04,340 --> 00:44:06,370 Drīzāk, tas tikai iet uz priekšu, cenšas darīt lieta, 534 00:44:06,370 --> 00:44:14,640 un ja tas SEG kļūdas, tas SEG bojājumus, un tā ir jūsu problēma. Jums ir jāiet salabot. 535 00:44:14,640 --> 00:44:19,730 Tiešām ātri, kā varētu mēs atrisinātu šo problēmu? Šarlote? 536 00:44:19,730 --> 00:44:23,540 [Šarlote] Jūs varat pārbaudīt, izmantojot, ja. 537 00:44:23,540 --> 00:44:32,240 Tātad, ja argv [1] ir Null, == 0, tad atgriezties 1, vai kaut [nesaprotams]. 538 00:44:32,240 --> 00:44:34,590 >> Jā. Tā ka ir viens lielisks veids, kā to darīt, jo mēs varam pārbaudīt, lai redzētu, 539 00:44:34,590 --> 00:44:39,230 vērtību mēs esam par to nokļūst strcmp, argv [1], ir tā null? 540 00:44:39,230 --> 00:44:45,830 Ja tas ir nulle, tad mēs varam teikt labi, pārtraukt. 541 00:44:45,830 --> 00:44:49,450 >> Biežāk veids, kā to izdarīt, ir izmantot argc vērtību. 542 00:44:49,450 --> 00:44:52,040 Jūs varat redzēt šeit sākumā maģistrāles, 543 00:44:52,040 --> 00:44:58,040 mēs izlaist šo pirmo testu, ka mēs parasti darīt, ja mēs izmantot komandrindas argumentus, 544 00:44:58,040 --> 00:45:05,240 kas ir pārbaudīt, vai mūsu argc vērtība ir tas, ko mēs sagaidām. 545 00:45:05,240 --> 00:45:10,290 Šajā gadījumā, mēs sagaidām vismaz divus argumentus, 546 00:45:10,290 --> 00:45:13,660 Programmas nosaukums plus viens otru. 547 00:45:13,660 --> 00:45:17,140 Jo mēs esam par to izmantot otro argumentu šeit. 548 00:45:17,140 --> 00:45:21,350 Tātad kaut kādas pārbaudes iepriekš, pirms mūsu strcmp zvana 549 00:45:21,350 --> 00:45:37,390 ka testi vai argv ir vismaz 2, varētu arī darīt to pašu veida lieta. 550 00:45:37,390 --> 00:45:40,620 Mēs varam redzēt, ja tas darbojas, darbojas programmu vēlreiz. 551 00:45:40,620 --> 00:45:45,610 Jūs vienmēr varat restartēt programmu ietvaros gdb, kas ir patiešām jauki. 552 00:45:45,610 --> 00:45:49,310 Jūs varat palaist, un, kad jūs iet uz argumentiem ar savu programmu, 553 00:45:49,310 --> 00:45:53,060 Jums iet tos, kad jūs zvanu palaist, nevis tad, kad jūs boot up GDB. 554 00:45:53,060 --> 00:45:57,120 Tādā veidā jūs varat saglabāt piesaucot savu programmu ar dažādiem argumentiem katru reizi. 555 00:45:57,120 --> 00:46:08,080 Tik palaist, vai atkal, es varētu Type R, un redzēsim, kas notiks, ja mēs tipa "sveiki". 556 00:46:08,080 --> 00:46:11,140 Tas vienmēr jautāt jums, ja jūs vēlaties, lai sāktu to no sākuma. 557 00:46:11,140 --> 00:46:17,490 Parasti, jūs vēlaties, lai sāktu to no sākuma. 558 00:46:17,490 --> 00:46:25,010 Un šajā brīdī, tas restartējas vēlreiz, tas izdrukā 559 00:46:25,010 --> 00:46:28,920 programma, kas mēs esam darbojas, buggy1, ar argumentu sveiki, 560 00:46:28,920 --> 00:46:32,720 un tas drukā šo standarta out, tas saka: "Jūs saņemsiet D", skumjš sejas. 561 00:46:32,720 --> 00:46:37,610 Bet mēs neesam SEG vaina. Tā teica, ka process izbrauc normāli. 562 00:46:37,610 --> 00:46:39,900 Lai izskatās diezgan labi. 563 00:46:39,900 --> 00:46:43,050 Ne vairāk SEG vaina, mēs, kas ir pagātne, 564 00:46:43,050 --> 00:46:48,190 tāpēc tas izskatās, ka patiešām bija seg vaina kļūda, ka mēs bija iegūt. 565 00:46:48,190 --> 00:46:51,540 Diemžēl, tas stāsta mums, ka mēs esam kļūst D. 566 00:46:51,540 --> 00:46:54,090 >> Mēs varam doties atpakaļ un apskatīt kodu un redzēt, kas notiek tur 567 00:46:54,090 --> 00:46:57,980 skaitlis, ko bija - kāpēc tas tika stāsta mums, ka mēs saņēmām D. 568 00:46:57,980 --> 00:47:03,690 Let 's redzēt, šeit bija tas printf sakot, ka jums ir D. 569 00:47:03,690 --> 00:47:08,540 Ja mēs tipa sarakstu, kā jūs turēt rakstīt sarakstu, tas saglabā atkārtojot leju caur savu programmu, 570 00:47:08,540 --> 00:47:10,940 tāpēc tas jums parādīs dažus pirmos rindiņas jūsu programmā. 571 00:47:10,940 --> 00:47:15,450 Tad tas tev parādīs tuvāko līnijas, un nākamo rieciens un nākamo gabalu. 572 00:47:15,450 --> 00:47:18,240 Un tas būs jāmēģina iet uz leju. 573 00:47:18,240 --> 00:47:21,180 Un tagad mēs sāksim "Līnijas numurs 16 ir ārpus diapazona." 574 00:47:21,180 --> 00:47:23,940 Jo tas ir tikai 15 līnijas. 575 00:47:23,940 --> 00:47:30,310 Ja jums uz šo jautājumu, un jūsu jautājums, "Ko man darīt?" Jūs varat izmantot palīdzības komandu. 576 00:47:30,310 --> 00:47:34,340 Palīdzi un tad arī tā nosaukumu komandu. 577 00:47:34,340 --> 00:47:36,460 Un jūs redzat Gdb mūs visus šāda veida stuff. 578 00:47:36,460 --> 00:47:43,870 Tā saka: "Bez arguments, uzskaita desmit vairāk līniju pēc vai ap iepriekšējā sarakstā. 579 00:47:43,870 --> 00:47:47,920 Sarakstā - uzskaita desmit līnijas pirms - " 580 00:47:47,920 --> 00:47:52,960 Tāpēc pieņemsim mēģināt izmantot sarakstu mīnuss. 581 00:47:52,960 --> 00:47:57,000 Un ka ir uzskaitīti 10 rindas iepriekšējo, jūs varat spēlēt aptuveni ar sarakstu mazliet. 582 00:47:57,000 --> 00:48:02,330 Jūs varat darīt saraksts, saraksts -, jūs pat varat dot minēti vairāki, piemēram, 8 sarakstā, 583 00:48:02,330 --> 00:48:07,500 un tas būs uzskaitīt 10 rindas ap 8 līniju. 584 00:48:07,500 --> 00:48:10,290 Un jūs varat redzēt, kas notiek šeit ir jums vienkārši, ja cits. 585 00:48:10,290 --> 00:48:13,980 Ja jūs rakstīt CS50 akmeņiem, tā izdrukā "Jūs saņemsiet A." 586 00:48:13,980 --> 00:48:16,530 Pretējā gadījumā tas izdrukā "Jūs saņemsiet D." 587 00:48:16,530 --> 00:48:23,770 Bummer pilsēta. Labi. Jā? 588 00:48:23,770 --> 00:48:26,730 >> [Daniels] Tātad, kad es mēģināju darīt CS50 ieži bez pēdiņām, 589 00:48:26,730 --> 00:48:29,290 tā saka "Jūs saņemsiet D." 590 00:48:29,290 --> 00:48:32,560 Man vajadzēja pēdiņas, lai saņemtu to uz darbu, kāpēc tā? 591 00:48:32,560 --> 00:48:38,490 >> Jā. Izrādās, ka tad, kad - tas ir vēl viens fun maz tidbit - 592 00:48:38,490 --> 00:48:47,900 palaižot programmu, ja mēs to izveidosim un mēs ierakstiet CS50 akmeņiem, 593 00:48:47,900 --> 00:48:50,800 tāpat kā Daniels teica, viņš darīja, un jūs hit Enter, 594 00:48:50,800 --> 00:48:52,870 tas joprojām saka, mēs iegūtu D. 595 00:48:52,870 --> 00:48:55,580 Un jautājums ir, kāpēc tas ir? 596 00:48:55,580 --> 00:49:02,120 Un izrādās, ka gan mūsu terminālā un Gdb apstrādāt šos kā divas atsevišķas argumentiem. 597 00:49:02,120 --> 00:49:04,800 Jo tad, kad tur ir telpa, kas ir netieši kā 598 00:49:04,800 --> 00:49:08,730 pirmais arguments beidzās, nākamajā arguments ir aptuveni, lai sāktu. 599 00:49:08,730 --> 00:49:13,260 Veids, kā apvienot tos divās, vai piedodiet, uz vienu argumentu, 600 00:49:13,260 --> 00:49:18,510 ir izmantot pēdiņas. 601 00:49:18,510 --> 00:49:29,560 Tāpēc tagad, ja mēs to pēdiņās un palaist to no jauna, mēs saņemam A. 602 00:49:29,560 --> 00:49:38,780 Tik vienkārši, lai Atgādinājums, bez pēdiņām, CS50 un ieži ir parsēt kā divas atsevišķas argumentiem. 603 00:49:38,780 --> 00:49:45,320 Ar pēdiņām, tas parsēt kā vienu argumentu vispār. 604 00:49:45,320 --> 00:49:53,070 >> Mēs varam redzēt šo ar lūzuma punktu. 605 00:49:53,070 --> 00:49:54,920 Līdz šim mēs esam darbojas mūsu programma, un tas ir bijis darbojas 606 00:49:54,920 --> 00:49:58,230 līdz vai nu tas SEG kļūmes vai hits kļūdu 607 00:49:58,230 --> 00:50:05,930 vai līdz tā ir iziet un viss ir pilnīgi naudas sodu. 608 00:50:05,930 --> 00:50:08,360 Tas ne vienmēr ir visvairāk noderīga lieta, jo dažreiz 609 00:50:08,360 --> 00:50:11,840 Jums ir kļūda Jūsu programmā, taču tas nav izraisa segmentāciju vaina. 610 00:50:11,840 --> 00:50:16,950 Tas nav izraisa jūsu programmu, lai apturētu vai kaut kā tā. 611 00:50:16,950 --> 00:50:20,730 Veids, kā iegūt GDB apturēt savu programmu kādā konkrētā brīdī 612 00:50:20,730 --> 00:50:23,260 ir noteikt pārtraukumpunkts. 613 00:50:23,260 --> 00:50:26,520 Jūs varat vai nu izdarīt, nosakot pārtraukumpunkts uz funkcijas nosaukuma 614 00:50:26,520 --> 00:50:30,770 vai jūs varat noteikt pārtraukumpunkts par konkrētu koda rindu. 615 00:50:30,770 --> 00:50:34,450 Man patīk noteikt robežvērtības attiecībā uz funkcijas vārdus, jo - viegli atcerēties, 616 00:50:34,450 --> 00:50:37,700 un ja jūs tiešām iet un mainīt savu pirmkodu pat mazliet, 617 00:50:37,700 --> 00:50:42,020 tad jūsu pārtraukumpunkts patiešām palikt vienā vietā, kas savu kodu. 618 00:50:42,020 --> 00:50:44,760 Tā kā, ja jūs izmantojat līniju skaitu, un līnija skaitļi mainās 619 00:50:44,760 --> 00:50:51,740 jo jums pievienot vai dzēst kādu kodu, tad jūsu kontrolpunkti ir visi pilnīgi ieskrūvē augšu. 620 00:50:51,740 --> 00:50:58,590 Viens no visbiežāk lietām man ir noteikt pārtraukumpunkts par galveno funkciju. 621 00:50:58,590 --> 00:51:05,300 Bieži es boot up GDB, es ņemšu B tips galvenais, hit Enter, un ka būs noteikt pārtraukumpunkts 622 00:51:05,300 --> 00:51:10,630 uz galvenā funkcija, kas vienkārši saka, "Apturēt programmu, tiklīdz jūs sākt darboties," 623 00:51:10,630 --> 00:51:17,960 un tādā veidā, kad es palaist savu programmu ar, teiksim, CS50 ieži kā divi argumenti 624 00:51:17,960 --> 00:51:24,830 un hit Enter, tā izpaužas uz galveno funkciju, un tas apstājas tieši pie ļoti pirmajā rindā, 625 00:51:24,830 --> 00:51:30,620 tieši pirms tā izvērtē strcmp funkciju. 626 00:51:30,620 --> 00:51:34,940 >> Tā kā es esmu apturēta, tagad es varētu sākt mucking apkārt un redzot to, kas notiek 627 00:51:34,940 --> 00:51:40,250 ar visiem dažādiem mainīgajiem, kas tiek nodotas manā programmā. 628 00:51:40,250 --> 00:51:43,670 Šeit es varētu izdrukāt argc un redzēt, kas notiek. 629 00:51:43,670 --> 00:51:50,030 Redzēt, ka argc ir 3, jo tas ieguva 3 dažādas vērtības tajā. 630 00:51:50,030 --> 00:51:54,060 Tas ieguva programmas nosaukumu, tas ieguva pirmo argumentu un otrais arguments. 631 00:51:54,060 --> 00:52:09,330 Mēs varam izdrukāt tos, ko meklē ARGV [0], argv [1], un argv [2]. 632 00:52:09,330 --> 00:52:12,030 Tātad tagad jūs varat arī redzēt, kāpēc šī strcmp zvans tiek gatavojas neveiksmei, 633 00:52:12,030 --> 00:52:21,650 jo jūs redzat, ka tā sadalīt CS50 un klintis divos atsevišķos argumentus. 634 00:52:21,650 --> 00:52:27,250 Šajā brīdī, kad esat hit pārtraukumpunkts, jūs varat turpināt soli pa savu programmu 635 00:52:27,250 --> 00:52:32,920 pozīcijai, nevis sākot savu programmu vēlreiz. 636 00:52:32,920 --> 00:52:35,520 Tātad, ja jūs nevēlaties, lai sāktu savu programmu vēlreiz un tikai turpināt no šīs vietas, 637 00:52:35,520 --> 00:52:41,970 Jūs varat izmantot turpināt komandu un turpināt darbosies programmu līdz galam. 638 00:52:41,970 --> 00:52:45,010 Tāpat kā tas notika šeit. 639 00:52:45,010 --> 00:52:54,880 Tomēr, ja es turpinātu programmas, CS50 ieži, tas hits mana koncentrācija atkal, 640 00:52:54,880 --> 00:52:59,670 un šoreiz, ja es nevēlos, lai tikai iet visu ceļu cauri pārējo programmas, 641 00:52:59,670 --> 00:53:08,040 Es varu izmantot nākamo komandu, ko es arī saīsināt ar n. 642 00:53:08,040 --> 00:53:12,960 Un tas būs soli pa programmas pozīcijai. 643 00:53:12,960 --> 00:53:17,530 Tātad jūs varat skatīties kā lietas izpildīt, kā mainīgie izmaiņas, kā lietas iegūt atjaunināts. 644 00:53:17,530 --> 00:53:21,550 Kas ir diezgan jauki. 645 00:53:21,550 --> 00:53:26,570 Otra atdzist lieta ir nevis atkārtojot vienu un to pašu komandu atkal un atkal un atkal, 646 00:53:26,570 --> 00:53:30,670 ja jūs vienkārši hit Enter - tāpēc šeit jūs redzat, es neesmu ievadījis jebko - 647 00:53:30,670 --> 00:53:33,780 ja es tikai hit Enter, tas būs atkārtot iepriekšējo komandu, 648 00:53:33,780 --> 00:53:36,900 vai iepriekšējo Gdb komandu, kas man tikko likts iekšā 649 00:53:36,900 --> 00:53:56,000 Es varētu glabāt hitting Enter un tas būs saglabāt pastiprināšanu caur manu kodu pozīcijai. 650 00:53:56,000 --> 00:53:59,310 Es aicinu jūs guys iet izbraukšana citas buggy programmu, kā arī. 651 00:53:59,310 --> 00:54:01,330 Mums nav laika, lai izietu cauri visiem no viņiem šodien sadaļā. 652 00:54:01,330 --> 00:54:05,890 Pirmkods ir tur, lai jūs varētu veida redzēt, kas notiek 653 00:54:05,890 --> 00:54:07,730 aizkadrā, ja jums patiešām iestrēdzis, 654 00:54:07,730 --> 00:54:11,940 bet mazākais, tikai prakse booting up GDB, 655 00:54:11,940 --> 00:54:13,940 programmas īstenošanu, līdz tas saplīst par jums, 656 00:54:13,940 --> 00:54:18,260 kļūst Izcelsme, norādītas, ko darboties crash bija, 657 00:54:18,260 --> 00:54:24,450 kādi līnija tas bija, izdrukāt dažas mainīgo vērtības, 658 00:54:24,450 --> 00:54:30,140 tikai, lai jūs iegūtu justies par to, jo tas būs tiešām palīdzēs jums iet uz priekšu. 659 00:54:30,140 --> 00:54:36,340 Šajā brīdī, mēs ejam, lai izietu no gdb, kuru jūs izmantojat atmest vai vienkārši q. 660 00:54:36,340 --> 00:54:40,460 Ja jūsu programma ir pa vidu darbojas joprojām, un tas nav izceļojis, 661 00:54:40,460 --> 00:54:43,510 tas vienmēr jautāt jums, "Vai esat pārliecināts, ka jūs patiešām vēlaties atmest smēķēšanu?" 662 00:54:43,510 --> 00:54:48,770 Jūs varat vienkārši hit jā. 663 00:54:48,770 --> 00:54:55,250 >> Tagad mēs ejam apskatīt nākamo problēmu mums ir, kas ir kaķis programma. 664 00:54:55,250 --> 00:54:59,880 Ja jūs skatīties īsā novirzīt un caurulēm, jūs redzēsiet, ka Tomijs izmanto šo programmu 665 00:54:59,880 --> 00:55:07,540 kas būtībā drukā visu izejas failu uz ekrāna. 666 00:55:07,540 --> 00:55:12,660 Tātad, ja man palaist kaķis, tas ir faktiski iebūvēts programmu ierīces, 667 00:55:12,660 --> 00:55:16,860 un ja jums ir Mac, jūs varat darīt uz jūsu Mac pārāk, ja jūs atvērt termināla. 668 00:55:16,860 --> 00:55:25,630 Un mēs - kaķis, teiksim, cp.c, un hit Enter. 669 00:55:25,630 --> 00:55:29,640 Ko tas darīja, ja mēs ritiniet uz augšu mazliet un redzēt, kur mums bija līnija, 670 00:55:29,640 --> 00:55:40,440 vai kur mums bija kaķis komandu, tas burtiski vienkārši izdrukāt saturu cp.c uz mūsu ekrāna. 671 00:55:40,440 --> 00:55:44,140 Mēs varam palaist vēlreiz un jūs varat ievietot vairākus failus kopā. 672 00:55:44,140 --> 00:55:49,880 Tātad jūs varat darīt kaķis cp.c, un tad mēs varam arī saķēdēt the cat.c failu, 673 00:55:49,880 --> 00:55:53,250 kas ir programma, mēs esam par to rakstīt, 674 00:55:53,250 --> 00:55:58,140 un tas būs drukāt gan failus atpakaļ atpakaļ uz mūsu ekrāna. 675 00:55:58,140 --> 00:56:05,490 Tātad, ja mēs ritinātu uz augšu mazliet, mēs redzam, ka tad, kad mums bija šī kaķa cp.c, cat.c, 676 00:56:05,490 --> 00:56:17,110 Sākumā tas izdrukā cp failu, un pēc tam zem tā, tas izdrukā cat.c failu tiesības uz leju šeit. 677 00:56:17,110 --> 00:56:19,650 Mēs ejam, lai izmantotu šo, lai tikai saņemtu mūsu pēdu mitrā. 678 00:56:19,650 --> 00:56:25,930 Spēlēt aptuveni ar vienkāršu drukāšanu uz terminālu, redzēt, kā tas darbojas. 679 00:56:25,930 --> 00:56:39,170 Ja jūs puiši atvērt ar gedit cat.c, hit Enter, 680 00:56:39,170 --> 00:56:43,760 Jūs varat redzēt programmu, ka mēs esam par to rakstīt. 681 00:56:43,760 --> 00:56:48,980 Mēs esam iekļāvuši šo jauku katlu dzelzs, tāpēc mums nav jātērē laiks rakstīt visu, kas ārā. 682 00:56:48,980 --> 00:56:52,310 Mēs arī pārbaudīt vairākus argumentus pagājis collas 683 00:56:52,310 --> 00:56:56,910 Mēs izdrukāt skaistu lietošanas ziņu. 684 00:56:56,910 --> 00:57:00,950 >> Tas ir tāda veida lieta, ka atkal, tāpat mēs esam runājuši par to, 685 00:57:00,950 --> 00:57:04,490 tas ir gandrīz kā muskuļu atmiņā. 686 00:57:04,490 --> 00:57:07,190 Tikai atceraties, lai saglabātu darot to pašu veida sīkumi 687 00:57:07,190 --> 00:57:11,310 un vienmēr izdrukāt kaut kādu noderīgu ziņu 688 00:57:11,310 --> 00:57:17,670 lai cilvēki zina, kā vadīt savu programmu. 689 00:57:17,670 --> 00:57:21,630 Ar kaķi, tas ir diezgan vienkārši, mēs esam tikai gatavojas iet cauri visiem dažādu argumentiem 690 00:57:21,630 --> 00:57:24,300 kas tika nodotas mūsu programmu, un mēs ejam, lai drukātu 691 00:57:24,300 --> 00:57:29,950 to saturs uzmanību uz ekrāna pa vienam. 692 00:57:29,950 --> 00:57:35,670 Lai drukātu failus, lai uz ekrāna, mēs esam gatavojas darīt kaut ko ļoti līdzīgu 693 00:57:35,670 --> 00:57:38,120 lai ko mēs darījām beigās viktorīnas. 694 00:57:38,120 --> 00:57:45,350 Beigās viktorīnu, kas nomas programmu, mums bija atvērt failu, 695 00:57:45,350 --> 00:57:48,490 un tad mums bija tā drukāt. 696 00:57:48,490 --> 00:57:54,660 Šajā gadījumā, mēs esam gatavojas atvērt failu, un mēs ejam, lai lasītu no to vietā. 697 00:57:54,660 --> 00:58:00,630 Tad mēs ejam, lai drukātu, nevis uz failu, mēs ejam, lai drukātu uz ekrāna. 698 00:58:00,630 --> 00:58:05,830 Tāpēc drukāšanu uz ekrāna jūs visi esat darījis pirms ar printf. 699 00:58:05,830 --> 00:58:08,290 Tā ka nav pārāk traks. 700 00:58:08,290 --> 00:58:12,190 Bet lasot failu ir veida dīvaini. 701 00:58:12,190 --> 00:58:17,300 Mēs iet caur šo mazliet laikā. 702 00:58:17,300 --> 00:58:20,560 Ja jūs guys iet atpakaļ uz šo pēdējo problēmu par savu viktorīnas, problēmu 33, 703 00:58:20,560 --> 00:58:27,280 Pirmā līnija ka mēs gatavojamies darīt šeit, atverot failu, ir ļoti līdzīgs tam, ko mēs darījām tur. 704 00:58:27,280 --> 00:58:36,370 Tātad Stella, ko dara, ka līnija izskatās, kad mēs atvērt failu? 705 00:58:36,370 --> 00:58:47,510 [Stella] Kapitāla FILE *, fails - >> Labi. >> - Ir vienāds ar fopen. >> Yup. 706 00:58:47,510 --> 00:58:55,980 Kas šajā gadījumā ir? Tas ir komentārā. 707 00:58:55,980 --> 00:59:06,930 >> Tas ir par komentārā? argv [i] un r? 708 00:59:06,930 --> 00:59:11,300 >> Tieši tā. Tiesības. Tātad Stella ir pilnīgi pareizi. 709 00:59:11,300 --> 00:59:13,720 Tas ir tas, ko līnija izskatās. 710 00:59:13,720 --> 00:59:19,670 Mēs ejam, lai iegūtu failu plūsma mainīgs, to uzglabā failu *, lai visi cepures, 711 00:59:19,670 --> 00:59:25,720 FILE, *, un šī mainīgā nosaukums būs fails. 712 00:59:25,720 --> 00:59:32,250 Mēs varētu to saucam kāds mums patīk. Mēs varētu saukt first_file, vai file_i, kāds mēs gribētu. 713 00:59:32,250 --> 00:59:37,590 Un tad no faila nosaukums tika pieņemts uz komandrindas uz šo programmu. 714 00:59:37,590 --> 00:59:44,450 Tātad tas glabājas argv [i,] un tad mēs spēsim atvērt šo failu lasīt režīmā. 715 00:59:44,450 --> 00:59:48,100 Tagad, ka mēs esam atvērti failu, kas ir lieta, kas mums vienmēr ir jāatceras, lai darīt 716 00:59:48,100 --> 00:59:52,230 kad mēs esam atvērti failu? Aizveriet to. 717 00:59:52,230 --> 00:59:57,220 Tātad Missy, kā mēs aizvērtu failu? 718 00:59:57,220 --> 01:00:01,020 [Missy] fclose (fails) >> fclose (fails). Tieši tā. 719 01:00:01,020 --> 01:00:05,340 Lieliski. Labi. Ja mēs skatāmies uz to darīt komentāru tieši šeit, 720 01:00:05,340 --> 01:00:11,940 tā saka, "Atvērtā argv [i] un izdrukāt tās saturu uz stdout." 721 01:00:11,940 --> 01:00:15,460 >> Standarts, kas ir dīvaini vārdu. Stdout ir tikai mūsu veids, kā pateikt 722 01:00:15,460 --> 01:00:22,880 Mēs vēlamies, lai izdrukāt to uz terminālu, mēs vēlamies, lai izdrukāt to uz standarta izvades plūsmām. 723 01:00:22,880 --> 01:00:26,450 Mēs faktiski var atbrīvoties no šī komentāra šeit. 724 01:00:26,450 --> 01:00:36,480 Es esmu gatavojas kopēt un ielīmēt to, jo tas ir tas, ko mēs darījām. 725 01:00:36,480 --> 01:00:41,290 Šajā brīdī, tagad mums ir lasīt failu pamazām. 726 01:00:41,290 --> 01:00:46,300 Mēs esam apspriests pāris veidus lasīšanas failus. 727 01:00:46,300 --> 01:00:51,830 Kādi ir jūsu favorīti līdz šim? 728 01:00:51,830 --> 01:00:57,960 Kādā veidā jūs esat redzējuši vai jūs atceraties, lai lasītu failus? 729 01:00:57,960 --> 01:01:04,870 [Daniels] fread? >> Fread? Tātad fread ir viens. Jimmy, jūs zināt kādi citi? 730 01:01:04,870 --> 01:01:12,150 [Jimmy] Nē >> Labi. Nope. Šarlote? Aleksandrs? Jebkuri citi? Labi. 731 01:01:12,150 --> 01:01:20,740 Tātad citi tiem ir fgetc, ir viens, ka mēs izmantot daudz. 732 01:01:20,740 --> 01:01:26,410 Pastāv arī fscanf; jūs puiši redzat modelis šeit? 733 01:01:26,410 --> 01:01:29,170 Viņi visi sākas ar f. Kaut ko darīt ar failu. 734 01:01:29,170 --> 01:01:35,260 Tur fread, fgetc, fscanf. Tie visi ir no lasīšanas funkciju. 735 01:01:35,260 --> 01:01:49,120 Rakstīšanai mums ir fwrite, mums ir fputc nevis fgetc. 736 01:01:49,120 --> 01:01:58,250 Mēs arī esam fprintf kā mēs redzējām uz viktorīnas. 737 01:01:58,250 --> 01:02:01,680 Tā kā šis ir problēma, kas ietver lasīšanas no faila, 738 01:02:01,680 --> 01:02:04,940 mēs spēsim izmantot vienu no šīm trim funkcijām. 739 01:02:04,940 --> 01:02:10,890 Mēs nebrauksim, lai izmantotu šīs funkcijas uz leju šeit. 740 01:02:10,890 --> 01:02:14,880 Šīs funkcijas ir viss atrodams standarta I / O bibliotēka. 741 01:02:14,880 --> 01:02:17,510 Tātad, ja paskatās uz augšu šajā programmā, 742 01:02:17,510 --> 01:02:24,110 Jūs varat redzēt, ka mēs jau esam iekļauti galvenes failu standarta I / O bibliotēka. 743 01:02:24,110 --> 01:02:27,120 Ja mēs gribam, lai noskaidrotu, kura no tām mēs vēlamies izmantot, 744 01:02:27,120 --> 01:02:29,690 mēs vienmēr varam atvērtu cilvēks lapas. 745 01:02:29,690 --> 01:02:34,350 Tātad, mēs varam rakstīt vīrieti stdio 746 01:02:34,350 --> 01:02:43,180 un izlasīt visu par stdio ieejas un izejas funkcijās C. 747 01:02:43,180 --> 01:02:49,870 Un mēs jau varam redzēt ak, izskatās. Tas ir pieminēt fgetc, tas pieminēt fputc. 748 01:02:49,870 --> 01:02:57,220 Tātad jūs varat urbt uz leju mazliet, un apskatīt, teiksim, fgetc 749 01:02:57,220 --> 01:03:00,060 un apskatīt tās man lapu. 750 01:03:00,060 --> 01:03:03,430 Jūs varat redzēt, ka tas iet kopā ar visu ķekars citas funkcijas: 751 01:03:03,430 --> 01:03:12,640 fgetc, fgets, getc, getchar, kļūst, ungetc, un tā devums rakstzīmju un stīgas. 752 01:03:12,640 --> 01:03:19,180 Tātad tas ir, kā mēs lasām burtiem un stīgas no failus no standarta ievades, 753 01:03:19,180 --> 01:03:21,990 kas būtībā ir no lietotāja. 754 01:03:21,990 --> 01:03:24,780 Un tas ir tas, kā mēs to darām to faktisko C. 755 01:03:24,780 --> 01:03:30,850 Tātad tas nav, izmantojot GetString un getchar funkcijas 756 01:03:30,850 --> 01:03:36,840 ka mēs izmantojām no CS50 bibliotēkas. 757 01:03:36,840 --> 01:03:39,710 Mēs darīsim šo problēmu pāris veidos 758 01:03:39,710 --> 01:03:43,430 lai jūs varētu redzēt divus dažādus veidus, kā darīt to. 759 01:03:43,430 --> 01:03:48,490 Gan fread funkcija, kas Daniels minēts un fgetc ir labs veids, kā to darīt. 760 01:03:48,490 --> 01:03:53,790 Es domāju fgetc ir mazliet vieglāk, jo tas ir tikai, kā jūs redzat, 761 01:03:53,790 --> 01:03:59,660 viens arguments, FILE * ka mēs cenšamies, lai izlasītu raksturu no, 762 01:03:59,660 --> 01:04:02,740 un tā atgriešanās vērtība ir int. 763 01:04:02,740 --> 01:04:05,610 Un tas ir nedaudz mulsinoši, labi? 764 01:04:05,610 --> 01:04:11,450 >> Jo mēs esam iegūt raksturs, tad kāpēc nav šī atgriešanās char? 765 01:04:11,450 --> 01:04:18,700 Jums puiši ir kādas idejas par to, kāpēc tas varētu atgriezties char? 766 01:04:18,700 --> 01:04:25,510 [Missy atbildes, nesaprotami] >> jā. Tātad Missy ir pilnīgi pareizi. 767 01:04:25,510 --> 01:04:31,570 Ja tas ir ASCII, tad šis skaitlis varētu samērot ar faktisko char. 768 01:04:31,570 --> 01:04:33,520 Varētu būt ASCII raksturs, un tas ir labi. 769 01:04:33,520 --> 01:04:36,220 Tas ir tieši tas, kas notiek. 770 01:04:36,220 --> 01:04:39,190 Mēs esam izmantojot int vienkārši tāpēc, ka tas ir vairāk bitu. 771 01:04:39,190 --> 01:04:44,750 Tas ir lielāks nekā CHAR, mūsu palija ir tikai 8 biti, ka 1 baits uz mūsu 32-bitu mašīnas. 772 01:04:44,750 --> 01:04:48,520 Un int ir visi 4 baiti vērtu telpu. 773 01:04:48,520 --> 01:04:50,940 Un izrādās, ka ceļš fgetc darbi, 774 01:04:50,940 --> 01:04:53,940 ja mēs ritiniet uz leju mūsu konspekta šajā cilvēks lapā mazliet, 775 01:04:53,940 --> 01:05:05,000 ritiniet visu ceļu uz leju. Izrādās, ka viņi izmanto šo īpašo vērtību sauc EOF. 776 01:05:05,000 --> 01:05:09,640 Tas ir īpašs nemainīgs kā atgriešanās vērtību fgetc funkcijas 777 01:05:09,640 --> 01:05:14,570 kad jūs hit beigām failu vai, ja jūs saņemsiet kļūdas. 778 01:05:14,570 --> 01:05:18,170 Un izrādās, ka to darīt šos salīdzinājumus ar EOF pareizi, 779 01:05:18,170 --> 01:05:24,060 Jūs vēlaties būt, ka papildu informācijas apjomu, kas jums ir int 780 01:05:24,060 --> 01:05:28,420 nevis izmantojot char mainīgo. 781 01:05:28,420 --> 01:05:32,130 Pat ja fgetc faktiski kļūst rakstzīmi no faila, 782 01:05:32,130 --> 01:05:38,450 Jūs vēlaties, lai atcerēties, ka tas ir atgriezies kaut kas ir int tipa jums. 783 01:05:38,450 --> 01:05:41,360 Ka teica, tas ir diezgan viegli izmantot. 784 01:05:41,360 --> 01:05:44,960 Tas notiek, lai dotu mums raksturs, tāpēc viss, kas mums ir jādara, ir saglabāt jautā failu, 785 01:05:44,960 --> 01:05:48,440 "Dodiet man nākamo rakstzīmi, dod man nākamo rakstzīmi, dod man nākamo rakstzīmi" 786 01:05:48,440 --> 01:05:51,400 kamēr mēs nokļūt līdz beigām failu. 787 01:05:51,400 --> 01:05:54,730 Un kas būs pull vienā rakstura laikā no mūsu failu, 788 01:05:54,730 --> 01:05:56,250 un tad mēs varam darīt, ko vien mums patīk ar to. 789 01:05:56,250 --> 01:06:00,160 Mēs varam uzglabāt to, mēs varam pievienot virkni, mēs varam izdrukāt. 790 01:06:00,160 --> 01:06:04,630 Vai kāds no tā. 791 01:06:04,630 --> 01:06:09,600 >> Attālināt atpakaļ, un dodas atpakaļ uz mūsu cat.c programmu, 792 01:06:09,600 --> 01:06:16,170 ja mēs spēsim izmantot fgetc, 793 01:06:16,170 --> 01:06:21,710 kā varētu mēs tuvojamies šo nākamo rindiņu kodu? 794 01:06:21,710 --> 01:06:26,020 Mēs ejam, lai izmantotu - fread darīs kaut nedaudz atšķirīga. 795 01:06:26,020 --> 01:06:32,600 Un šoreiz, mēs esam tikai gatavojas izmantot fgetc lai iegūtu vienu rakstzīmi laikā. 796 01:06:32,600 --> 01:06:40,910 Apstrādāt visu failu, kas varētu mums ir jādara? 797 01:06:40,910 --> 01:06:44,030 Cik rakstzīmes ir tur failā? 798 01:06:44,030 --> 01:06:47,390 Ir daudz. Tātad jūs, iespējams, vēlaties, lai iegūtu vienu 799 01:06:47,390 --> 01:06:49,860 un pēc tam saņemt vēl un saņemt otru un iegūt citu. 800 01:06:49,860 --> 01:06:53,330 Kāda veida algoritma jūs domājat mēs varētu būt, lai izmantotu šeit? 801 01:06:53,330 --> 01:06:55,470 Kāda veida -? [Aleksandrs] cilpa? >> Tieši tā. 802 01:06:55,470 --> 01:06:57,500 Kaut kāda veida cilpas. 803 01:06:57,500 --> 01:07:03,380 Cilpa faktiski liels, šajā gadījumā. 804 01:07:03,380 --> 01:07:08,620 Un kā jums bija sakot, tas izklausās kā jūs vēlaties cilpu pār visiem lietas materiāliem, 805 01:07:08,620 --> 01:07:11,820 iegūt rakstzīmi laikā. 806 01:07:11,820 --> 01:07:13,850 Kādi ieteikumi par to, ko tas varētu izskatīties? 807 01:07:13,850 --> 01:07:22,090 [Aleksandrs, nesaprotami] 808 01:07:22,090 --> 01:07:30,050 >> Labi, tikai man angliski, ko jūs mēģināt darīt? [Aleksandrs, nesaprotami] 809 01:07:30,050 --> 01:07:36,270 Tātad šajā gadījumā, tas izklausās kā mēs esam tikai cenšas cilpa pār visiem lietas materiāliem. 810 01:07:36,270 --> 01:07:45,330 [Aleksandrs] Tāpēc es > Izmērs -? 811 01:07:45,330 --> 01:07:49,290 I guess faila izmēru, vai ne? Izmērs - we'll tikai rakstīt to, kā šis. 812 01:07:49,290 --> 01:07:57,470 Lietas lielums pagaidām, i + +. 813 01:07:57,470 --> 01:08:04,610 Tātad izrādās, ka veids, kā jūs darīt to, izmantojot fgetc, un tas ir jauns, 814 01:08:04,610 --> 01:08:10,460 ir tas, ka tur nav viegls veids, lai tikai iegūtu izmēra failu 815 01:08:10,460 --> 01:08:16,979 ar šo "sizeof" tipa būvēt, ka jūs esat redzējis. 816 01:08:16,979 --> 01:08:20,910 Kad mēs izmantot šo fgetc funkciju, mēs ieviest kādu 817 01:08:20,910 --> 01:08:29,069 Jaunais, bailīgs sintakse šis cilpa, kurā vietā, izmantojot tikai pamata counter 818 01:08:29,069 --> 01:08:33,920 iet raksturu pēc rakstura, mēs ejam, lai vilktu vienu rakstzīmi laikā, 819 01:08:33,920 --> 01:08:37,120 viena rakstzīme laikā, un kā mēs zinām, mēs esam pie beigām 820 01:08:37,120 --> 01:08:41,290 ir nevis tad, kad mēs esam skaitot noteiktu rakstzīmju skaitu, 821 01:08:41,290 --> 01:08:49,939 bet, kad raksturs mēs izraut ka īpaša beigas faila raksturs. 822 01:08:49,939 --> 01:08:58,689 Tātad, mēs varam izdarīt, - es aicinu šo ch, un mēs ejam, lai sāktu to 823 01:08:58,689 --> 01:09:08,050 ar mūsu pirmo zvanu, lai iegūtu pirmo rakstzīmi no faila. 824 01:09:08,050 --> 01:09:14,979 Tātad šajā daļā tepat, tas ir gatavojas saņemt raksturs no faila 825 01:09:14,979 --> 01:09:20,840 un uzglabāt to uz mainīgo ch. 826 01:09:20,840 --> 01:09:25,420 Mēs ejam, lai saglabātu darot šo, kamēr mēs nokļūt līdz beigām failu, 827 01:09:25,420 --> 01:09:41,170 ko mēs darām, ko testēt raksturs nav, ir vienāda ar šo īpašo EOF raksturu. 828 01:09:41,170 --> 01:09:48,750 Un tad nevis darīt ch + +, kas vienkārši pieauguma vērtību, 829 01:09:48,750 --> 01:09:52,710 tāpēc, ja mēs izlasītu A ārā no faila, kapitāla, teiksim, 830 01:09:52,710 --> 01:09:56,810 CH + + dotu mums b, un tad mēs gribētu saņemt C un pēc tam d. 831 01:09:56,810 --> 01:09:59,310 Tas ir acīmredzami nav tas, ko mēs vēlamies. Ko mēs gribam šeit 832 01:09:59,310 --> 01:10:05,830 Šajā pēdējā mazliet ir mēs vēlamies, lai saņemtu nākamo rakstzīmi no lietas materiāliem. 833 01:10:05,830 --> 01:10:09,500 >> Tātad, kā mēs varbūt saņemtu nākamo rakstzīmi no lietas materiāliem? 834 01:10:09,500 --> 01:10:13,470 Kā mēs varam iegūt pirmo rakstzīmi no lietas materiāliem? 835 01:10:13,470 --> 01:10:17,200 [Studentu] fgetfile? >> Fgetc, vai, piedodiet, jums bija pilnīgi taisnība. 836 01:10:17,200 --> 01:10:20,470 Es nepareizi turpat. Tātad yeah. 837 01:10:20,470 --> 01:10:26,240 Šeit nevis darīt ch + +, 838 01:10:26,240 --> 01:10:29,560 mēs esam tikai gatavojas aicināt fgetc (fails) vēlreiz 839 01:10:29,560 --> 01:10:39,180 un uzglabāt rezultātu mūsu pašu ch mainīgo. 840 01:10:39,180 --> 01:10:43,730 [Studentu jautājums, nesaprotami] 841 01:10:43,730 --> 01:10:52,390 >> Tas ir, ja šie failu * puiši ir īpašs. 842 01:10:52,390 --> 01:10:59,070 Veids, kā viņi strādā, ir tie - kad pirmo reizi atvērt - kad jūs pirmo reizi darīt, ka fopen zvanu, 843 01:10:59,070 --> 01:11:04,260 fails * faktiski kalpo kā rādītājs uz sākuma failu. 844 01:11:04,260 --> 01:11:12,830 Un tad katru reizi, kad jūs zvanu fgetc, tas kustas vienu rakstzīmi pa failu. 845 01:11:12,830 --> 01:11:23,280 Tātad, ja jūs aicinu šo, jūs palielināšanai faila rādītāju par vienu rakstzīmi. 846 01:11:23,280 --> 01:11:26,210 Un, kad tu fgetc atkal, jūs pārvietojas tai citu raksturu 847 01:11:26,210 --> 01:11:28,910 un cits raksturs un cits raksturs un cits raksturs. 848 01:11:28,910 --> 01:11:32,030 [Studentu jautājums, nesaprotami] >> Un That - jā. 849 01:11:32,030 --> 01:11:34,810 Tas ir sava veida šajā maģijas ar kapuci. 850 01:11:34,810 --> 01:11:37,930 Jums tikai glabāt palielināšanai caur. 851 01:11:37,930 --> 01:11:46,510 Šajā brīdī, jūs varat faktiski strādā ar raksturu. 852 01:11:46,510 --> 01:11:52,150 Tātad, kā varētu mēs drukāt šo, uz ekrāna, tagad? 853 01:11:52,150 --> 01:11:58,340 Mēs varam izmantot to pašu printf lieta, ka mēs izmantojām agrāk. 854 01:11:58,340 --> 01:12:00,330 Ka mēs esam izmantojot visu semestri. 855 01:12:00,330 --> 01:12:05,450 Mēs varam zvanīt printf, 856 01:12:05,450 --> 01:12:21,300 un mēs varam iet uz raksturs tieši tāpat. 857 01:12:21,300 --> 01:12:27,430 Vēl viens veids, kā to izdarīt, ir nevis izmantojot printf un kam to darīt formāta virknes, 858 01:12:27,430 --> 01:12:29,490 mēs varam arī izmantot kādu no citām funkcijām. 859 01:12:29,490 --> 01:12:40,090 Mēs varam izmantot fputc, kas drukā rakstzīmi uz ekrāna, 860 01:12:40,090 --> 01:12:52,580 izņemot, ja mēs skatāmies uz fputc - ļaujiet man attālināt mazliet. 861 01:12:52,580 --> 01:12:56,430 Mēs redzētu, kas ir jauki, ir tas aizņem raksturā ka mēs lasām, izmantojot fgetc, 862 01:12:56,430 --> 01:13:05,100 bet tad mums ir arī tā plūsma, lai izdrukātu. 863 01:13:05,100 --> 01:13:11,850 Mēs varam izmantot arī putchar funkcija, kas būs likts tieši uz standarta out. 864 01:13:11,850 --> 01:13:16,070 Tātad tur ir viss ķekars dažādas iespējas, ka mēs varam izmantot drukāšanai. 865 01:13:16,070 --> 01:13:19,580 Viņi visi standarta I / O bibliotēka. 866 01:13:19,580 --> 01:13:25,150 Ikreiz, kad vēlaties drukāt - tā printf, pēc noklusējuma, būs drukāt uz īpašu standartu out plūsmā, 867 01:13:25,150 --> 01:13:27,910 kas ir, ka stdout. 868 01:13:27,910 --> 01:13:41,300 Tātad mēs varam tikai atsaukties uz to kā sava veida šo burvju vērtību, stdout šeit. 869 01:13:41,300 --> 01:13:48,410 Hmm. Ielieciet semikolu ārpus. 870 01:13:48,410 --> 01:13:52,790 >> Tas ir daudz jaunu, funky informācijas šeit. 871 01:13:52,790 --> 01:13:58,600 Šīs partijas ir ļoti vārdkopas, kas nozīmē, ka tas ir kods 872 01:13:58,600 --> 01:14:05,700 kas ir rakstīts tādā veidā tikai tāpēc, ka tas ir tīrs, lai lasītu, viegli lasīt. 873 01:14:05,700 --> 01:14:11,520 Ir daudz dažādi veidi, kā to darīt, daudz dažādas funkcijas, jūs varat izmantot, 874 01:14:11,520 --> 01:14:14,680 bet mums ir tendence vienkārši izpildiet šos pašus modeļus vairāk un vairāk. 875 01:14:14,680 --> 01:14:20,180 Tāpēc nav pārsteigts, ja jūs redzēt kodu, piemēram, tas nāk atkal un atkal. 876 01:14:20,180 --> 01:14:25,690 Labi. Šajā brīdī, mums ir nepieciešams, lai izjauktu par dienu. 877 01:14:25,690 --> 01:14:31,300 Paldies par nāk. Paldies par skatīties, ja esat tiešsaistē. Un mēs redzēt jūs nākamajā nedēļā. 878 01:14:31,300 --> 01:14:33,890 [CS50.TV]