1 00:00:00,000 --> 00:00:02,730 [Powered by Google Translate] [Дел 5: помалку удобно] 2 00:00:02,730 --> 00:00:05,180 [Нејт Hardison, Универзитетот Харвард] 3 00:00:05,180 --> 00:00:08,260 [Ова е CS50.] [CS50.TV] 4 00:00:08,260 --> 00:00:11,690 Па добредојде назад, момци. 5 00:00:11,690 --> 00:00:16,320 Добредојдовте во делот 5. 6 00:00:16,320 --> 00:00:20,220 Во овој момент, откако заврши квиз 0 и ја видел како сте го направиле, 7 00:00:20,220 --> 00:00:25,770 се надевам да се чувствувате навистина добро, бидејќи јас бев многу импресиониран од резултатите во оваа секција. 8 00:00:25,770 --> 00:00:28,050 За нашата онлајн гледачите, имавме неколку прашања 9 00:00:28,050 --> 00:00:33,680 за последните два проблема на проблемот во собата - или на квизот, а. 10 00:00:33,680 --> 00:00:39,690 Па ние ќе одиме во текот оние навистина брзо, така што секој го гледа она што се случи 11 00:00:39,690 --> 00:00:45,060 и како да одат низ вистински решение, а не само на гледање на решение себе. 12 00:00:45,060 --> 00:00:50,330 Ние ќе одиме во текот на последните неколку проблеми навистина брзо, 32 и 33. 13 00:00:50,330 --> 00:00:53,240 Само, повторно, така што онлајн гледачите може да се види тоа. 14 00:00:53,240 --> 00:00:59,080 >> Ако се свртиме кон вашиот проблем 32, кој е на страница 13, 15 00:00:59,080 --> 00:01:02,730 13 од 16, проблемот 32 е за сите свопови. 16 00:01:02,730 --> 00:01:05,010 Сето тоа е за Замена на два цели броја. 17 00:01:05,010 --> 00:01:08,740 Тоа е проблем што ние би отишол во текот на неколку пати во предавањето. 18 00:01:08,740 --> 00:01:13,590 И овде, она што се бара да направите е брз меморија трага. 19 00:01:13,590 --> 00:01:17,000 За пополнување на вредности на променливи како што се на магацинот 20 00:01:17,000 --> 00:01:20,250 како код оди преку оваа swap функција. 21 00:01:20,250 --> 00:01:24,500 Поточно, она што го барате во - I'm случува да се стави оваа iPad надолу - 22 00:01:24,500 --> 00:01:29,650 особено, она што го барате на е оваа линија нумерирани 6 право тука. 23 00:01:29,650 --> 00:01:36,740 И тоа е нумерирана 6 за само непосредна близина со претходниот проблем. 24 00:01:36,740 --> 00:01:41,720 Она што сакаме да направите е да се прикаже или етикета на состојбата на меморијата 25 00:01:41,720 --> 00:01:46,090 како што е во времето кога ние се изврши оваа линија број 6, 26 00:01:46,090 --> 00:01:52,540 која е ефикасно враќање од нашите swap функција овде. 27 00:01:52,540 --> 00:01:59,450 Ако ние дојдете тука, видовме дека на адресите на сè во меморија е обезбедена за нас. 28 00:01:59,450 --> 00:02:02,540 Ова е многу клучна, ние ќе се вратам на тоа во само еден миг. 29 00:02:02,540 --> 00:02:09,240 А потоа надолу тука на дното, имавме малку меморија дијаграм кој ние ќе се однесуваат. 30 00:02:09,240 --> 00:02:12,490 Јас всушност се направи ова на мојот iPad. 31 00:02:12,490 --> 00:02:20,720 Па ќе одам да го менува назад и напред меѓу iPad и овој код само за референца. 32 00:02:20,720 --> 00:02:26,540 >> Да почнеме. Прво, да се фокусираат на првите неколку линии на главната овде. 33 00:02:26,540 --> 00:02:30,220 За почеток, ние ќе треба да се иницијализира на X да ја 1 и y до 2. 34 00:02:30,220 --> 00:02:33,040 Значи имаме две целобројни променливи, тие двете ќе биде ставен на магацинот. 35 00:02:33,040 --> 00:02:36,050 Ние ќе се стави 1 и 2 во нив. 36 00:02:36,050 --> 00:02:43,150 Значи, ако јас флип над да мојот iPad, се надевам, да видиме - 37 00:02:43,150 --> 00:02:48,660 Apple TV mirroring, и таму ќе одиме. Во ред. 38 00:02:48,660 --> 00:02:51,670 Значи, ако јас флип над да мојот iPad, 39 00:02:51,670 --> 00:02:56,220 Сакам да се иницијализира на X да ја 1 и y до 2. 40 00:02:56,220 --> 00:03:00,580 Тоа го правиме сосема едноставно со пишување на 1 во кутија обележана x 41 00:03:00,580 --> 00:03:07,730 и 2 во кутија обележана y. Прилично едноставна. 42 00:03:07,730 --> 00:03:11,620 Па сега ајде да се вратиме на лаптоп, да видиме што ќе се случи следно. 43 00:03:11,620 --> 00:03:15,810 Значи ова следната линија е местото каде што работите се слабо. 44 00:03:15,810 --> 00:03:28,110 Ние помине на адресата на x и адресата на y како параметрите a и b на swap функција. 45 00:03:28,110 --> 00:03:32,380 Адресата на x и адреса на y работи кои не можеме да се пресмета 46 00:03:32,380 --> 00:03:36,360 без однесуваат на овие bullet поени право надолу тука. 47 00:03:36,360 --> 00:03:39,750 И за среќа, на првите две точки да ни кажете што точно одговори се. 48 00:03:39,750 --> 00:03:44,740 Адресата на x во меморија е 10, а на адреса на y во меморија е 14. 49 00:03:44,740 --> 00:03:51,870 Значи тоа се вредности кои се донесени во што a и b до врвот во нашата swap функција. 50 00:03:51,870 --> 00:04:00,760 Значи, повторно, прекинувачки назад кон нашите дијаграм, можам да пишувам 10 во 51 00:04:00,760 --> 00:04:07,400 и 14 во б. 52 00:04:07,400 --> 00:04:11,610 Сега, оваа точка е местото каде што продолжи со размена. 53 00:04:11,610 --> 00:04:14,520 Значи гледаме назад на лаптоп повторно, 54 00:04:14,520 --> 00:04:21,079 можеме да видиме дека начинот на swap работи е првпат Dereference на и чување на резултат во мали. 55 00:04:21,079 --> 00:04:27,650 Па Dereference оператор вели: "Еј. Однесувајте се кон содржината на променливата а како адреса. 56 00:04:27,650 --> 00:04:33,830 Оди до она што се чуваат на таа адреса, и оптоварување тоа. " 57 00:04:33,830 --> 00:04:41,720 Што ќе се вчита од променливата ќе се чуваат во нашата мали променлива. 58 00:04:41,720 --> 00:04:45,150 Нервира назад кон iPad. 59 00:04:45,150 --> 00:04:51,690 Ако одиме да се обрати 10, знаеме кои се однесуваат на 10 е varible x 60 00:04:51,690 --> 00:04:55,480 бидејќи ни беше кажано од страна на нашите куршум точка дека на адресата на x во меморија е 10. 61 00:04:55,480 --> 00:05:00,180 За да можеме да одиме таму, да добијат вредност од неа, кое е 1, како што гледаме на нашите iPad, 62 00:05:00,180 --> 00:05:06,300 и оптоварување тоа во мали. 63 00:05:06,300 --> 00:05:08,250 Повторно, ова не е финална содржина. 64 00:05:08,250 --> 00:05:14,350 Ние ќе одиме преку и ние ќе дојдеме до нашата крајна состојба на програмата на крајот. 65 00:05:14,350 --> 00:05:17,210 Но, токму сега, ние имаме вредност 1 чуваат во мали. 66 00:05:17,210 --> 00:05:19,210 >> И таму е брзо станува збор овде. 67 00:05:19,210 --> 00:05:23,980 [Александар] е Dereference оператор - тоа е само ѕвезда право во предниот дел на променлива? 68 00:05:23,980 --> 00:05:27,600 >> Да. Па Dereference оператор, како што флип назад кон нашите лаптоп уште еднаш, 69 00:05:27,600 --> 00:05:33,780 е оваа ѕвезда право напред. 70 00:05:33,780 --> 00:05:37,460 Во таа смисла, тоа е - што се спротивставиме со множење оператор 71 00:05:37,460 --> 00:05:42,400 која бара две работи, а Dereference оператор е унарни оператор. 72 00:05:42,400 --> 00:05:46,130 Само применува една вредност што е спротивно на бинарни оператор, 73 00:05:46,130 --> 00:05:48,810 каде што се однесуваат на две различни вредности. 74 00:05:48,810 --> 00:05:52,080 Значи тоа е она што се случува во оваа линија. 75 00:05:52,080 --> 00:05:58,390 Ние натоварен вредност 1 и чуваат тоа во нашата привремена целобројна променлива. 76 00:05:58,390 --> 00:06:05,800 Следната линија, ние зачувување на содржините на б во - 77 00:06:05,800 --> 00:06:12,630 или, поточно, ние зачувување на содржините кои б е да се покажува во местото каде што се укажува на. 78 00:06:12,630 --> 00:06:17,690 Ако ги анализираме овој од десно кон лево, ние ќе се Dereference б, 79 00:06:17,690 --> 00:06:23,580 ние ќе се обрати 14, ние ќе се обидеме да го дофати број кој е таму, 80 00:06:23,580 --> 00:06:26,900 и тогаш се случува да одат на адреса 10, 81 00:06:26,900 --> 00:06:34,240 и ние се случува да се фрли резултат на нашата Dereference на б во тој простор. 82 00:06:34,240 --> 00:06:40,080 Нервира назад кон нашите iPad, каде што може да се направи ова е малку поконкретни, 83 00:06:40,080 --> 00:06:44,070 тоа би можело да помогне ако јас пишувам броеви на сите на адреси тука. 84 00:06:44,070 --> 00:06:53,820 Па знаеме дека во y, ние сме на адреса 14, x е на адреса 10. 85 00:06:53,820 --> 00:07:00,180 Кога ќе почне во б, ние Dereference б, ние ќе треба да го дофати вредност 2. 86 00:07:00,180 --> 00:07:08,320 Ние ќе се обидеме да го зграби оваа вредност, бидејќи тоа е вредност, која живее на адреса 14. 87 00:07:08,320 --> 00:07:15,700 И ние ќе го стави во променлива која живее на адреса 10, 88 00:07:15,700 --> 00:07:19,160 кој е во право таму, што одговара на нашите променливата x. 89 00:07:19,160 --> 00:07:21,810 Значи можеме да направиме малку пребрише тука 90 00:07:21,810 --> 00:07:35,380 каде што ние да се ослободиме од нашите 1 и наместо ние пишуваме на 2. 91 00:07:35,380 --> 00:07:39,560 Па сите е добро и добро во светот, иако ние сме препишани x сега. 92 00:07:39,560 --> 00:07:44,890 Имаме чуваат старата вредност на x во нашите мали променлива. 93 00:07:44,890 --> 00:07:50,210 Значи можеме да заврши на swap со следната линија. 94 00:07:50,210 --> 00:07:53,030 Нервира назад кон нашите лаптоп. 95 00:07:53,030 --> 00:07:58,150 Сега сите што останува е да се земе на содржината надвор од нашата привремена целобројна променлива 96 00:07:58,150 --> 00:08:05,630 и ги чува во променлива која живее на адресата која б држи. 97 00:08:05,630 --> 00:08:10,230 Така ние ќе ефикасно Dereference b за да добиете пристап до променливата 98 00:08:10,230 --> 00:08:14,340 која е на адресата што б има во него, 99 00:08:14,340 --> 00:08:19,190 и ние ќе работи вредноста што tmp држи во неа. 100 00:08:19,190 --> 00:08:23,280 Нервира врати на iPad уште еднаш. 101 00:08:23,280 --> 00:08:31,290 Јас може да ја избрише оваа вредност тука, 2, 102 00:08:31,290 --> 00:08:41,010 и наместо тоа ќе копирате 1 право во неа. 103 00:08:41,010 --> 00:08:43,059 Тогаш следната линија кој извршува, се разбира - 104 00:08:43,059 --> 00:08:47,150 ако флип назад на лаптоп - е оваа точка 6, 105 00:08:47,150 --> 00:08:52,500 која е точката во која сакавме да имаме дијаграм целосно пополнети. 106 00:08:52,500 --> 00:08:58,940 Значи гледаме назад на iPad уште еднаш, само така може да се види завршен дијаграм, 107 00:08:58,940 --> 00:09:06,610 можете да видите дека ние имаме 10 во а, 14 во б, 1 во мали, 2 во X, и 1 во y. 108 00:09:06,610 --> 00:09:11,000 Дали постојат било какви прашања во врска со ова? 109 00:09:11,000 --> 00:09:14,640 Дали ова го направи повеќе смисла, откако влезе низ неа? 110 00:09:14,640 --> 00:09:24,850 Направи помалку смисла? Се надевам дека не. Во ред. 111 00:09:24,850 --> 00:09:28,230 >> Покажувачи се многу незгодно тема. 112 00:09:28,230 --> 00:09:33,420 Еден од момците ние работиме со има многу честа изрека: 113 00:09:33,420 --> 00:09:36,590 "За да се разбере совети, прво мора да се разбере совети." 114 00:09:36,590 --> 00:09:40,530 Што мислам дека е многу точно. Тоа го прави да потрае некое време да се навикнеш на него. 115 00:09:40,530 --> 00:09:45,360 Ждрепка на слики, ждрепка на меморија дијаграми како овој се многу корисни, 116 00:09:45,360 --> 00:09:49,480 и откако ќе прошетка низ пример по пример по пример, 117 00:09:49,480 --> 00:09:54,450 тоа ќе почне да се направи малку повеќе разум и малку повеќе разум и малку повеќе смисла. 118 00:09:54,450 --> 00:10:01,560 Конечно, еден ден, ќе имате сето тоа целосно владее. 119 00:10:01,560 --> 00:10:13,800 Било какви прашања пред да се движи кон следниот проблем? Во ред. 120 00:10:13,800 --> 00:10:18,840 Значи флип назад на лаптоп. 121 00:10:18,840 --> 00:10:23,300 Следниот проблем што го имаме е проблем број 33 на датотека I / O. 122 00:10:23,300 --> 00:10:26,350 Зумирате на оваа малку. 123 00:10:26,350 --> 00:10:28,710 Проблемот 33 - Да? 124 00:10:28,710 --> 00:10:32,110 >> [Даниел] Јас само имале брз прашање. Оваа ѕвезда, или ѕвездичка, 125 00:10:32,110 --> 00:10:35,590 се вика dereferencing кога користите ѕвездичка порано. 126 00:10:35,590 --> 00:10:38,820 Што е тоа се вика кога користите симболот пред тоа? 127 00:10:38,820 --> 00:10:43,140 >> На симболот пред е адресата-оператор. 128 00:10:43,140 --> 00:10:45,880 Па ајде дојдете назад. 129 00:10:45,880 --> 00:10:49,310 Упс. Јас сум во зум на владата, па не можам навистина дојдете. 130 00:10:49,310 --> 00:10:52,780 Ако ги погледнеме во овој код навистина брзо, токму тука, 131 00:10:52,780 --> 00:10:54,980 повторно, истото се случува. 132 00:10:54,980 --> 00:10:59,180 Ако ги погледнеме во овој код токму тука, на оваа линија, каде што се направи повик да се разменуваат, 133 00:10:59,180 --> 00:11:10,460 на симболот е само велејќи "ја добиете адресата на која променливата x животи." 134 00:11:10,460 --> 00:11:14,460 Кога вашиот компајлер компајлира вашиот код, 135 00:11:14,460 --> 00:11:20,590 тоа мора да всушност физички одбележи место во меморијата за сите ваши променливи да се живее. 136 00:11:20,590 --> 00:11:24,910 И така што на компајлерот, тогаш може да се направи еднаш тоа е компајлирана сè, 137 00:11:24,910 --> 00:11:31,110 тоа го знае, "О, јас се стави x на адреса 10. ставив y на адреса 14." 138 00:11:31,110 --> 00:11:34,640 Таа потоа може да се пополни во овие вредности за вас. 139 00:11:34,640 --> 00:11:44,740 Па можете да потоа - тоа тогаш може да го помине овој и помине и y во исто така. 140 00:11:44,740 --> 00:11:50,730 Овие момци добиете адресата, но тие, исто така, кога ќе ги помине во swap функција, 141 00:11:50,730 --> 00:11:55,690 овој тип на информации, овој int * токму тука, кажува на компајлерот, 142 00:11:55,690 --> 00:12:01,350 "Добро, ние ќе треба да се толкува оваа адреса како адреса на целобројна променлива." 143 00:12:01,350 --> 00:12:05,900 Како адреса на int, која е различна од адресата на лик променлива 144 00:12:05,900 --> 00:12:09,930 бидејќи int зазема, на 32-битна машина, зазема 4 бајти на просторот, 145 00:12:09,930 --> 00:12:13,310 со оглед на карактерот само зазема 1 бајт на просторот. 146 00:12:13,310 --> 00:12:17,310 Па затоа е важно да се знае и она што е - што живее, каков тип на вредност 147 00:12:17,310 --> 00:12:20,340 живее на адресата што доби помина внатре 148 00:12:20,340 --> 00:12:22,020 Или адресата што сте се занимаваат со. 149 00:12:22,020 --> 00:12:29,020 На тој начин, знаеш колку бајти на информации за да всушност се вчита од вашиот RAM меморија. 150 00:12:29,020 --> 00:12:31,780 И тогаш, да, ова Dereference оператор, како што се бара, 151 00:12:31,780 --> 00:12:37,200 оди и пристапи информации на одредена адреса. 152 00:12:37,200 --> 00:12:42,820 Така што се вели, со оваа променлива овде се третираат содржината на како адреса, 153 00:12:42,820 --> 00:12:47,880 одат на таа адреса, и извлечете, оптоварување во процесор, оптоварување во регистар 154 00:12:47,880 --> 00:12:56,340 вистинските вредности или содржини кои живеат на таа адреса. 155 00:12:56,340 --> 00:12:59,620 Други прашања? Овие се добри прашања. 156 00:12:59,620 --> 00:13:01,650 Тоа е многу новата терминологија премногу. 157 00:13:01,650 --> 00:13:09,800 Тоа е исто така еден вид на фанки, гледајќи & и * во различни места. 158 00:13:09,800 --> 00:13:13,180 >> Во ред. 159 00:13:13,180 --> 00:13:18,530 Па назад кон проблемот 33, датотека I / O. 160 00:13:18,530 --> 00:13:22,540 Ова беше еден од оние проблеми кои мислам дека неколку нешта се случија. 161 00:13:22,540 --> 00:13:25,400 Еден, тоа е прилично нова тема. 162 00:13:25,400 --> 00:13:30,590 Тоа беше презентирана наскоро пред квиз, 163 00:13:30,590 --> 00:13:33,400 и тогаш мислам дека тоа беше вид на како еден од оние зборот проблеми во математиката 164 00:13:33,400 --> 00:13:39,720 каде што тие ви даде многу информации, но вие всушност не завршуваат морале да користите еден тон на неа. 165 00:13:39,720 --> 00:13:44,060 Во првиот дел од овој проблем е опишува она CSV датотека е. 166 00:13:44,060 --> 00:13:50,620 Сега, CSV датотека, според описот, е одвоени со запирки вредности датотека. 167 00:13:50,620 --> 00:13:55,300 Причината овие се на сите интересни, но и причина што досега ги користат, 168 00:13:55,300 --> 00:14:00,800 е, затоа што, колку некогаш сте се користи нешто како Excel? 169 00:14:00,800 --> 00:14:03,240 Слика повеќето од вас, веројатно, или ќе го користи во одреден момент во вашиот живот. 170 00:14:03,240 --> 00:14:06,430 Ќе се користи нешто како Excel. 171 00:14:06,430 --> 00:14:10,940 Со цел да се добијат податоци од една табела Excel или не било вид на обработка со него, 172 00:14:10,940 --> 00:14:17,240 ако си сакал да се напише програма C или Пајтон програма, Јава програма, 173 00:14:17,240 --> 00:14:20,070 да се справи со податоци што се чуваат таму, 174 00:14:20,070 --> 00:14:23,170 еден од најчестите начини да го добие во CSV датотека. 175 00:14:23,170 --> 00:14:26,850 И може да се отвори Excel и кога одите на "Save As" дијалог, 176 00:14:26,850 --> 00:14:32,840 може да се добијат вистински CSV фајл. 177 00:14:32,840 --> 00:14:35,890 >> Корисна за да знам како да се справи со овие работи. 178 00:14:35,890 --> 00:14:42,010 Начинот на кој таа работи е дека тоа е слично на - Мислам, тоа е во суштина имитирајќи табеларни пресметки, 179 00:14:42,010 --> 00:14:47,590 каде што, како што гледаме тука, во многу лево повеќето парче, 180 00:14:47,590 --> 00:14:49,910 имаме сите презиме. 181 00:14:49,910 --> 00:14:54,670 Значи имаме Malan, тогаш Hardison, а потоа Бауден, MacWilliam, а потоа Чан. 182 00:14:54,670 --> 00:14:59,470 Сите презиме. А потоа запирка одделува последните имиња од првите имиња. 183 00:14:59,470 --> 00:15:02,970 Давид, Нејт, Роб, Томи и Zamyla. 184 00:15:02,970 --> 00:15:06,850 Јас секогаш се измеша Роби и Том. 185 00:15:06,850 --> 00:15:10,940 А потоа, конечно, третата колона е-мејл адреси. 186 00:15:10,940 --> 00:15:18,500 Откако ќе се разбере дека, остатокот од програмата е прилично лесно да се имплементира. 187 00:15:18,500 --> 00:15:23,850 Она што ние го направивме со цел да го имитираат овој ист структура во нашата Ц програма 188 00:15:23,850 --> 00:15:27,510 е ние сме користеле структура. 189 00:15:27,510 --> 00:15:30,520 Ќе почнете да играте со овие малку повеќе, како и. 190 00:15:30,520 --> 00:15:35,790 Ние ги видов за прв малку во проблем сет 3, кога ние се занимаваат со речници. 191 00:15:35,790 --> 00:15:40,290 Но, овој персонал struct продавници последно име, презиме, и-мејл. 192 00:15:40,290 --> 00:15:44,500 Исто како и нашата CSV датотека беше складирање. 193 00:15:44,500 --> 00:15:47,950 Значи ова е само конвертирање од еден формат во друг. 194 00:15:47,950 --> 00:15:54,630 Ние мора да го конвертирате, во овој случај, на персоналот struct во линија, 195 00:15:54,630 --> 00:15:59,060 на одвоени со запирки линија, исто како што. 196 00:15:59,060 --> 00:16:01,500 Дали тоа има смисла? Вие момци имаат сите преземени на квизот, 197 00:16:01,500 --> 00:16:07,680 па Претпоставувам имаш барем имаше некое време да се размислува за тоа. 198 00:16:07,680 --> 00:16:16,410 >> Во изнајмување функција, проблемот бара од нас да се земе во - we'll зумирате на оваа малку - 199 00:16:16,410 --> 00:16:22,480 земе во кадровската структура, персонал struct, со името на, 200 00:16:22,480 --> 00:16:30,900 и додаваат на неговата содржина во нашата staff.csv датотека. 201 00:16:30,900 --> 00:16:34,230 Излезе дека ова е прилично јасна да се користи. 202 00:16:34,230 --> 00:16:37,430 Ние вид на ќе се позанимавам со овие функции малку повеќе денес. 203 00:16:37,430 --> 00:16:44,510 Но, во овој случај, fprintf функција е навистина клучот. 204 00:16:44,510 --> 00:16:51,960 Значи со fprintf, можеме да печатиме, исто како вас момци биле користење printf целата оваа термин. 205 00:16:51,960 --> 00:16:55,050 Можете да printf линија во датотеката. 206 00:16:55,050 --> 00:16:59,030 Така, наместо на само правење на вообичаените printf повик, каде што го даде формат стринг 207 00:16:59,030 --> 00:17:05,380 а потоа ќе ги замени сите променливи со следниве аргументи, 208 00:17:05,380 --> 00:17:11,290 со fprintf, вашиот прв аргумент е наместо на датотеката која сакате да се напише. 209 00:17:11,290 --> 00:17:21,170 Ако бевме да се погледне на овој во апаратот, на пример, човек fprintf, 210 00:17:21,170 --> 00:17:25,980 можеме да видиме разликата помеѓу printf и fprintf. 211 00:17:25,980 --> 00:17:28,960 Ќе зумирате тука малку. 212 00:17:28,960 --> 00:17:33,140 Значи со printf, ние го даде формат стринг, а потоа следните аргументи 213 00:17:33,140 --> 00:17:37,580 се сите променливи за замена или замена во нашата формат стринг. 214 00:17:37,580 --> 00:17:47,310 Додека со fprintf, првиот аргумент е навистина оваа датотека * нарекува поток. 215 00:17:47,310 --> 00:17:51,800 >> Се движат назад над тука за да нашите изнајмување, 216 00:17:51,800 --> 00:17:54,550 ние веќе доби нашата датотека * поток отвори за нас. 217 00:17:54,550 --> 00:17:57,810 Тоа е она што оваа прва линија не, тоа отвора датотеката staff.csv, 218 00:17:57,810 --> 00:18:01,690 тоа се отвора во додавај на владата, и сето она што остана за нас да направите е да 219 00:18:01,690 --> 00:18:08,640 пишуваат на персоналот структура на датотеката. 220 00:18:08,640 --> 00:18:10,870 И, ајде да видиме, не сакам да се користи на iPad? 221 00:18:10,870 --> 00:18:17,900 Ќе се користи iPad. Имаме празнина - Да се ​​стави тоа на маса за да можам да пишувам малку подобро - 222 00:18:17,900 --> 00:18:33,680 поништат изнајмување и е потребно во еден аргумент, на персоналот структура наречена s. 223 00:18:33,680 --> 00:18:44,120 Добивме загради, ние го добивме нашиот датотека * нарекува датотека, 224 00:18:44,120 --> 00:18:48,380 ние имаме fopen линија што ни се дава, 225 00:18:48,380 --> 00:18:51,890 и јас само ќе го пишувам како точки, бидејќи тоа е веќе во Педија. 226 00:18:51,890 --> 00:19:00,530 А потоа на нашата следната линија, ние ќе треба да се направи повик да fprintf 227 00:19:00,530 --> 00:19:03,700 и ние ќе помине во датотека која сакаме да се печати, 228 00:19:03,700 --> 00:19:10,290 а потоа нашите формат стринг, кои - 229 00:19:10,290 --> 00:19:14,300 Јас ќе ти момци ми кажете што изгледа. 230 00:19:14,300 --> 00:19:20,500 Како за вас, Стела? Дали знаете што првиот дел од формат стринг личи? 231 00:19:20,500 --> 00:19:24,270 [Стела] не сум сигурен. >> Слободно можете да побарате Џими. 232 00:19:24,270 --> 00:19:27,690 Дали знаете, Џими? 233 00:19:27,690 --> 00:19:31,000 [Jimmy] Зарем тоа само да биде последно? Не знам. Јас не сум сосема сигурен. 234 00:19:31,000 --> 00:19:39,020 >> Океј. Како за, дали некој го добивате ова точно на испит? 235 00:19:39,020 --> 00:19:41,770 Бр ред. 236 00:19:41,770 --> 00:19:47,920 Излегува дека тука сите ние треба да направите е да сакаме секој дел од нашиот тим структура 237 00:19:47,920 --> 00:19:53,290 да бидат испечатени како стринг во нашата датотека. 238 00:19:53,290 --> 00:19:59,900 Ние само го користите низа замена карактер три различни времиња, бидејќи имаме презиме 239 00:19:59,900 --> 00:20:07,160 проследено со запирка, тогаш првото име проследено со запирка, 240 00:20:07,160 --> 00:20:12,430 а потоа конечно е-мејл адреса која следеше - што не е 241 00:20:12,430 --> 00:20:15,140 монтирање на мојот екран - но тоа е проследено со нова линија карактер. 242 00:20:15,140 --> 00:20:20,060 Па јас сум ќе го напишам само таму долу. 243 00:20:20,060 --> 00:20:23,560 А потоа по нашите формат стринг, 244 00:20:23,560 --> 00:20:27,880 ние само имаме замени кои ние пристап со користење на нотација точка 245 00:20:27,880 --> 00:20:31,370 што сме го виделе проблем сет 3. 246 00:20:31,370 --> 00:20:48,820 Можеме да го користиме s.last, s.first и s.email 247 00:20:48,820 --> 00:20:58,990 за замена во овие три вредности во нашата формат стринг. 248 00:20:58,990 --> 00:21:06,190 Па како не, кои одат? Смисла? 249 00:21:06,190 --> 00:21:09,700 Да? Не? Можеби? Во ред. 250 00:21:09,700 --> 00:21:14,180 >> Конечниот нешто што правиме после ние сме печатени и откако ќе го отвори нашиот датотека: 251 00:21:14,180 --> 00:21:17,370 кога сме отвори датотеката, ние секогаш да се сеќавам да го затворите. 252 00:21:17,370 --> 00:21:19,430 Затоа што во спротивно ние ќе завршуваат протекување на меморија, 253 00:21:19,430 --> 00:21:22,500 користење на датотеката дескриптори. 254 00:21:22,500 --> 00:21:25,950 Значи за да го затворите, кои функционираат ние ги користиме? Даниел? 255 00:21:25,950 --> 00:21:30,120 [Даниел] запишам? >> Запишам, точно. 256 00:21:30,120 --> 00:21:37,520 Значи последниот дел од овој проблем беше правилно да го затворите датотека, со употреба на запишам функција, 257 00:21:37,520 --> 00:21:40,370 што само изгледа како тоа. 258 00:21:40,370 --> 00:21:43,880 Не е премногу луд. 259 00:21:43,880 --> 00:21:46,990 Кул. 260 00:21:46,990 --> 00:21:49,520 Па тоа е проблемот 33 на квизот. 261 00:21:49,520 --> 00:21:52,480 Ќе имаме дефинитивно повеќе датотека I / O доаѓа. 262 00:21:52,480 --> 00:21:55,130 Ние ќе се направи малку повеќе во предавање денес, или во делот денес, 263 00:21:55,130 --> 00:22:01,710 бидејќи тоа е она што се случува да се формира најголемиот дел од оваа претстојните pset. 264 00:22:01,710 --> 00:22:05,020 Ајде да се движи на од квизот во овој момент. Да? 265 00:22:05,020 --> 00:22:10,880 >> [Шарлот]] Зошто запишам (датотека) наместо запишам (staff.csv)? 266 00:22:10,880 --> 00:22:19,100 >> Ах. Поради тоа што излегува дека - па прашање, кое е голем, 267 00:22:19,100 --> 00:22:27,800 Затоа, кога ние пишуваме запишам, дали сме пишување запишам (датотека) ѕвезда променлива 268 00:22:27,800 --> 00:22:33,680 за разлика од името на датотеката, staff.csv? Дали е тоа точно? Да. 269 00:22:33,680 --> 00:22:39,570 Па ајде да ги разгледаме. Ако јас се вратиш назад на мојот лаптоп, 270 00:22:39,570 --> 00:22:45,040 и нека се погледне на запишам функција. 271 00:22:45,040 --> 00:22:51,460 Значи запишам функција затвора поток и е потребно во покажувачот на потокот дека сакате да го затворите, 272 00:22:51,460 --> 00:22:57,010 за разлика од вистинските името на датотеката што сакате да го затворите. 273 00:22:57,010 --> 00:23:01,620 И ова е поради тоа зад сцената, кога ќе се направи повик fopen, 274 00:23:01,620 --> 00:23:12,020 кога ќе се отвори датотеката, ти си, всушност доделување меморија за складирање на информации за датотека. 275 00:23:12,020 --> 00:23:16,380 Па имате датотека покажувач кој има информации за датотека, 276 00:23:16,380 --> 00:23:23,080 како што е отворен, неговата големина, каде и да сте во моментов во датотеката, 277 00:23:23,080 --> 00:23:29,100 така што ќе може да направи за читање и пишување повици кон тоа конкретно место во рамките на датотека. 278 00:23:29,100 --> 00:23:38,060 Вие завршуваат затворање на покажувачот наместо на затворање на името на датотеката. 279 00:23:38,060 --> 00:23:48,990 >> Да? [Даниел] Значи, со цел да се користи изнајмување, дали би рекле - како да го добие на корисникот влез? 280 00:23:48,990 --> 00:23:53,830 Дали fprintf дејствува како GetString во смисла дека тоа само ќе чека за корисникот влез 281 00:23:53,830 --> 00:23:57,180 и побара од вас да напишеш ова - или чекаат за да напишете овие три работи во? 282 00:23:57,180 --> 00:24:00,480 Или не ви треба да користите нешто да се имплементира изнајмување? 283 00:24:00,480 --> 00:24:04,100 >> Да. Значи ние не сме - прашањето е, како ние да добие корисник влез 284 00:24:04,100 --> 00:24:09,220 со цел да се спроведе изнајмување? И она што го имаме тука е на повикувачот на изнајмување, 285 00:24:09,220 --> 00:24:17,690 донесен во овој персонал struct со сите податоци складирани во struct веќе. 286 00:24:17,690 --> 00:24:22,990 Значи fprintf е во состојба само да се напише дека податоците директно во датотеката. 287 00:24:22,990 --> 00:24:25,690 Нема чекање за корисникот влез. 288 00:24:25,690 --> 00:24:32,110 Корисникот е веќе дадено влезот од правилно да го стави во овој персонал struct. 289 00:24:32,110 --> 00:24:36,510 И работите, се разбира, ќе се скрши ако било која од овие совети се нула, 290 00:24:36,510 --> 00:24:40,370 па ние дојдете назад до тука и ќе погледнеме во нашите struct. 291 00:24:40,370 --> 00:24:43,640 Имаме низа последен, стринг прво, стринг е-мејл. 292 00:24:43,640 --> 00:24:48,530 Ние сега знаеме дека сите оние, навистина, под хауба, се char * променливи. 293 00:24:48,530 --> 00:24:53,470 Кои може или не може да се укажува на нула. 294 00:24:53,470 --> 00:24:55,800 Тие може да се укажува на меморијата на грамада, 295 00:24:55,800 --> 00:24:59,650 можеби меморија на магацинот. 296 00:24:59,650 --> 00:25:04,580 Ние навистина не знаеме, но ако било кој од овие совети се ништовни, валиден или, 297 00:25:04,580 --> 00:25:08,120 дека тоа дефинитивно ќе се сруши нашата изнајмување функција. 298 00:25:08,120 --> 00:25:11,050 Тоа беше нешто што беше вид на надвор од опсегот на испитот. 299 00:25:11,050 --> 00:25:16,440 Ние не сме се грижиш за тоа. 300 00:25:16,440 --> 00:25:22,170 Велики. Во ред. Значи се движат на од квизот. 301 00:25:22,170 --> 00:25:25,760 >> Да го затворите овој човек, и ние ќе се погледне во pset 4. 302 00:25:25,760 --> 00:25:34,700 Значи, ако вие момци се погледне на спецификации pset, штом ќе може да го пристап, cs50.net/quizzes, 303 00:25:34,700 --> 00:25:42,730 ние се случува да поминат низ неколку од делот проблеми денес. 304 00:25:42,730 --> 00:25:52,240 Јас сум лизгање надолу - дел од прашањата започнува на третата страница на pset спецификации. 305 00:25:52,240 --> 00:25:57,800 И првиот дел ќе бара да се оди и види краток за пренасочување и цевки. 306 00:25:57,800 --> 00:26:02,820 Која беше вид на кул кратко, ви покажува некои нови, кул командната линија трикови кои можете да го користите. 307 00:26:02,820 --> 00:26:06,050 И тогаш имаме неколку прашања за вас, како и. 308 00:26:06,050 --> 00:26:10,860 Ова првото прашање околу потоци, на која printf пишува по дифолт, 309 00:26:10,860 --> 00:26:15,920 ние вид на осврна и на само малку пред еден момент. 310 00:26:15,920 --> 00:26:22,380 Ова fprintf дека сме биле само дискутирање зема во датотека * поток како свој аргумент. 311 00:26:22,380 --> 00:26:26,580 запишам зема во датотека * поток, како и, 312 00:26:26,580 --> 00:26:32,660 и повратната вредност на fopen ви дава датотека * поток, како и. 313 00:26:32,660 --> 00:26:36,060 Причината не сме виделе оние пред кога ние сме се занимаваа со printf 314 00:26:36,060 --> 00:26:39,450 е затоа printf има стандардно поток. 315 00:26:39,450 --> 00:26:41,810 И стандардниот поток на кој пишува 316 00:26:41,810 --> 00:26:45,190 ќе дознаете за во краток. 317 00:26:45,190 --> 00:26:50,080 Значи дефинитивно ги погледне во него. 318 00:26:50,080 --> 00:26:53,010 >> Во делот денес, ние ќе зборуваме малку за GDB, 319 00:26:53,010 --> 00:26:57,720 бидејќи повеќе сте запознаени со тоа, повеќе пракса ќе добијат со тоа, 320 00:26:57,720 --> 00:27:01,390 толку подобро можност ќе биде да всушност ги фатат грешки во свој код. 321 00:27:01,390 --> 00:27:05,540 Оваа забрзува процесот на дебагирање до неверојатно. 322 00:27:05,540 --> 00:27:09,230 Значи со користење printf, секој пат кога ќе го направите тоа што треба да го прекомпајлирате вашиот код, 323 00:27:09,230 --> 00:27:13,000 ќе мора да се кандидира повторно, понекогаш треба да се преселат на printf повик наоколу, 324 00:27:13,000 --> 00:27:17,100 Коментар од кодот, потребно е само време. 325 00:27:17,100 --> 00:27:20,850 Нашата цел е да се обиде да го убеди дека со GDB, можете суштина 326 00:27:20,850 --> 00:27:26,810 printf ништо во било која точка во вашиот код и никогаш не треба да го прекомпајлирате. 327 00:27:26,810 --> 00:27:35,120 Вие никогаш не треба да се започне и задржи Сомневајќи каде да printf следната. 328 00:27:35,120 --> 00:27:40,910 Првото нешто да направите е да ископирате оваа линија и да добијат дел кодот исклучување на интернет. 329 00:27:40,910 --> 00:27:47,530 Јас сум копирање оваа линија на кодот кој вели: "wget ​​http://cdn.cs50.net". 330 00:27:47,530 --> 00:27:49,510 Одам да го ископирате. 331 00:27:49,510 --> 00:27:55,950 Одам да се оди во текот на мојот апарат, одзумирате па можете да видите она што го правам, 332 00:27:55,950 --> 00:28:01,890 вметнување во таму, и кога ќе притиснете ентер, ова wget команда буквално е веб добие. 333 00:28:01,890 --> 00:28:06,210 Тоа се случува да ги повлечат надолу оваа датотека исклучување на интернет, 334 00:28:06,210 --> 00:28:11,790 и тоа се случува да го зачувате тековниот директориум. 335 00:28:11,790 --> 00:28:21,630 Сега, ако јас листата мојот тековниот директориум можете да видите дека имам оваа section5.zip датотека во право таму. 336 00:28:21,630 --> 00:28:25,260 На начин да се справи со тоа човек е да го отпакувате, 337 00:28:25,260 --> 00:28:27,650 што можете да направите во командната линија, исто како и оваа. 338 00:28:27,650 --> 00:28:31,880 Section5.zip. 339 00:28:31,880 --> 00:28:36,980 Тоа ќе го отпакувате, се создаде папка за мене, 340 00:28:36,980 --> 00:28:40,410 надува целата содржина, ги стави во таму. 341 00:28:40,410 --> 00:28:47,410 Па сега можам да одам во мојата делот 5 директориум со помош на CD команда. 342 00:28:47,410 --> 00:28:58,310 Исчистите екранот користејќи јасно. Па го исчистите екранот. 343 00:28:58,310 --> 00:29:02,280 Сега имам убав чист терминал за да се справи со. 344 00:29:02,280 --> 00:29:06,200 >> Сега, ако јас на листата на сите датотеки што гледам во овој директориум, 345 00:29:06,200 --> 00:29:12,270 ќе видите дека имам датотеки четири: buggy1, buggy2, buggy3 и buggy4. 346 00:29:12,270 --> 00:29:16,180 Јас сум исто така доби нивните соодветни. В датотеки. 347 00:29:16,180 --> 00:29:20,400 Ние нема да се погледне на. В датотеки за сега. 348 00:29:20,400 --> 00:29:24,140 Наместо тоа, ние ќе ги користат кога ќе се отвори gdb. 349 00:29:24,140 --> 00:29:28,220 Ние ги чуваат околу, така што ќе имаат пристап до вистинските изворниот код, кога ние сме со користење GDB, 350 00:29:28,220 --> 00:29:32,740 но целта на овој дел од делницата е да нескопосник околу со GDB 351 00:29:32,740 --> 00:29:40,370 и да видиме како можеме да ја искористиме да дознаам што се случува погрешно со секој од овие четири кабриолет програми. 352 00:29:40,370 --> 00:29:43,380 Значи, ние сме само ќе низ собата навистина брзо, 353 00:29:43,380 --> 00:29:47,000 и јас одам да прашам некој да се кандидира една од кабриолет програми, 354 00:29:47,000 --> 00:29:54,730 а потоа ќе одиме како група преку GDB и ќе видиме што можеме да направиме за да го надминете овие програми, 355 00:29:54,730 --> 00:29:58,460 или барем да се идентификува она што се случува погрешно во секоја од нив. 356 00:29:58,460 --> 00:30:04,760 Да почнеме овде со Daniel. Ќе се кандидира buggy1? Ајде да видиме што се случува. 357 00:30:04,760 --> 00:30:09,470 [Даниел] Таа вели дека има барање вина. >> Да. Точно. 358 00:30:09,470 --> 00:30:12,460 Значи, ако јас се кандидира buggy1, добивам сегмент вина. 359 00:30:12,460 --> 00:30:16,210 Во овој момент, би можел да оди и да се отвори buggy1.c, 360 00:30:16,210 --> 00:30:19,450 се обиде да дознаам што се случува погрешно, 361 00:30:19,450 --> 00:30:22,000 но една од најпознатите ништожно работи за овој сегмент грешка грешка 362 00:30:22,000 --> 00:30:27,610 е тоа што не ви каже за тоа што линијата на програмата нешта, всушност не беше во ред и се скрши. 363 00:30:27,610 --> 00:30:29,880 Можете вид на треба да се погледне во кодот 364 00:30:29,880 --> 00:30:33,990 и дознаам користење погоди и да се провери или printf да се види што се случува погрешно. 365 00:30:33,990 --> 00:30:37,840 Една од најкул работи за GDB е дека тоа е навистина, навистина лесно 366 00:30:37,840 --> 00:30:42,170 да дознаам линија во која вашата програма падне. 367 00:30:42,170 --> 00:30:46,160 Тоа е целосно достоен за тоа да го користат, дури и ако само за тоа. 368 00:30:46,160 --> 00:30:56,190 Така да го подигнете нагоре GDB, тип I GDB, а потоа го даде на патот на извршна дека сакам да се кандидира. 369 00:30:56,190 --> 00:31:01,960 Еве јас сум пишување gdb ./buggy1. 370 00:31:01,960 --> 00:31:06,600 Хит Enter. Ми дава сите овој авторските права на информациите, 371 00:31:06,600 --> 00:31:13,000 и овде ќе видите оваа линија во која се вели: "Читање симболи од / home / 372 00:31:13,000 --> 00:31:17,680 jharvard/section5/buggy1. " 373 00:31:17,680 --> 00:31:22,060 И ако се оди добро, ќе видите го испечатите порака што личи ова. 374 00:31:22,060 --> 00:31:25,500 Тоа ќе прочитате симболи, тоа ќе се каже "Јас читам симболи од вашиот извршна датотека," 375 00:31:25,500 --> 00:31:29,900 а потоа ќе ја имаат оваа "направено" порака овде. 376 00:31:29,900 --> 00:31:35,410 Ако видите некоја друга варијација на ова, или можете да ја видите не може да се најде на симболи 377 00:31:35,410 --> 00:31:41,460 или нешто слично, што значи тоа е дека едноставно не се составени вашиот извршна правилно. 378 00:31:41,460 --> 00:31:49,980 Кога ќе се собере програми за употреба со GDB, ние треба да го користат специјални г знаме, 379 00:31:49,980 --> 00:31:54,540 и тоа е направено по дифолт ако ги собира вашите програми, само со пишување се направи 380 00:31:54,540 --> 00:31:59,320 или да направи кабриолет или да се опорави, секоја од нив. 381 00:31:59,320 --> 00:32:07,800 Но, ако сте составувањето рачно со ѕвекот, а потоа ќе мора да одат во и вклучуваат што-е знамето. 382 00:32:07,800 --> 00:32:10,310 >> Во овој момент, сега кога имаме GDB брза, 383 00:32:10,310 --> 00:32:12,310 тоа е прилично едноставна да ја стартувате програмата. 384 00:32:12,310 --> 00:32:19,740 Ние или може да внесете рок, или едноставно можете да напишете r. 385 00:32:19,740 --> 00:32:22,820 Повеќето GDB команди може да биде скратен. 386 00:32:22,820 --> 00:32:25,940 Обично на само една или неколку букви, што е прилично убаво. 387 00:32:25,940 --> 00:32:30,980 Значи Saad, ако го напишете r и притиснете ентер, што се случува? 388 00:32:30,980 --> 00:32:39,390 [Саад] добив SIGSEGV, сегментација на вина, а потоа сето ова gobbledygook. 389 00:32:39,390 --> 00:32:43,650 >> Да. 390 00:32:43,650 --> 00:32:47,990 Како што гледате на екранот во право сега, и како Саад рече, 391 00:32:47,990 --> 00:32:53,430 кога ќе напишете рок или r и притиснете Enter, ние сеуште го добиете истиот сегмент вина. 392 00:32:53,430 --> 00:32:55,830 Значи со користење GDB не се реши нашиот проблем. 393 00:32:55,830 --> 00:32:59,120 Но, тоа ни дава некои gobbledygook, и испоставува дека ова gobbledygook 394 00:32:59,120 --> 00:33:03,080 всушност ни кажува каде тоа се случува. 395 00:33:03,080 --> 00:33:10,680 Да го анализирам овој малку, овој првиот бит е во функција во која што се случува погрешно. 396 00:33:10,680 --> 00:33:20,270 Има оваа __ strcmp_sse4_2, а тоа ни кажува дека тоа се случува во оваа датотека 397 00:33:20,270 --> 00:33:29,450 наречен sysdeps/i386, сето ова, пак, вид на хаос - но линија 254. 398 00:33:29,450 --> 00:33:31,670 Тоа е вид на тешко да се интерпретира. Обично, кога ќе видите нешто како ова, 399 00:33:31,670 --> 00:33:38,770 тоа значи дека тоа е секунда Разлом во една од системски библиотеки. 400 00:33:38,770 --> 00:33:43,220 Така нешто да се направи со strcmp. Вие момци сте виделе strcmp порано. 401 00:33:43,220 --> 00:33:52,730 Не е премногу лудо, но дали тоа значи дека strcmp е скршен или дека има проблем со strcmp? 402 00:33:52,730 --> 00:33:57,110 Што мислите, Александар? 403 00:33:57,110 --> 00:34:04,890 [Александар] Дали е тоа - е 254 на линија? И - не бинарни, но тоа не е нивната тавани, 404 00:34:04,890 --> 00:34:10,590 а потоа има уште еден јазик за секоја функција. Е дека 254 во таа функција, или - 405 00:34:10,590 --> 00:34:21,460 >> Тоа е линија 254. Тоа изгледа како во тоа. Кликнете датотека, па тоа е асемблерски код веројатно. 406 00:34:21,460 --> 00:34:25,949 >> Но, претпоставувам дека повеќе притискање работа е, затоа што ние сме добиле сегмент грешка, 407 00:34:25,949 --> 00:34:29,960 и тоа изгледа како да доаѓа од strcmp функција, 408 00:34:29,960 --> 00:34:38,030 дали ова значи, тогаш, дека strcmp е скршен? 409 00:34:38,030 --> 00:34:42,290 Тоа не треба, се надевам. Па само затоа што имаат сегментација грешка 410 00:34:42,290 --> 00:34:49,480 во една од функциите на системот, обично тоа значи дека вие едноставно не го нарекуваат правилно. 411 00:34:49,480 --> 00:34:52,440 Најбрзиот нешто што треба да направите за да дознаам што е всушност се случува 412 00:34:52,440 --> 00:34:55,500 кога ќе видите нешто лудо како ова, секогаш кога ќе видите сегмент грешка, 413 00:34:55,500 --> 00:34:59,800 особено ако имате програма која е со користење на повеќе од само главната, 414 00:34:59,800 --> 00:35:03,570 е да се користи трагата. 415 00:35:03,570 --> 00:35:13,080 Јас abbreviate трагата со пишување на БТ, за разлика од полно трагата збор. 416 00:35:13,080 --> 00:35:16,510 Но Шарлот, што се случува кога ќе напишете БТ и притиснете Ентер? 417 00:35:16,510 --> 00:35:23,200 [Шарлот] Тоа ми покажува две линии, линија 0 и линија 1. 418 00:35:23,200 --> 00:35:26,150 >> Да. Значи линија 0 и линија 1. 419 00:35:26,150 --> 00:35:34,560 Овие се вистинските магацинот рамки кои беа моментално во игра кога вашата програма се урна. 420 00:35:34,560 --> 00:35:42,230 Почнувајќи од врвниот рамка, рамка 0, и оди на дното повеќето, која е рамка 1. 421 00:35:42,230 --> 00:35:45,140 Нашите врвниот рамка е strcmp рамка. 422 00:35:45,140 --> 00:35:50,080 Можеш да мислиш за тоа како сличен на оној проблем бевме само прави на квизот со покажувачи, 423 00:35:50,080 --> 00:35:54,890 каде што се разменуваат магацинот рамка на врвот на главниот магацинот рамка, 424 00:35:54,890 --> 00:35:59,700 и имавме варијабли кои трампа е користење на врвот на променливи кои главни се користи. 425 00:35:59,700 --> 00:36:08,440 Еве нашата несреќа што се случи во нашата strcmp функција, која беше наречен од страна на нашата главна функција, 426 00:36:08,440 --> 00:36:14,370 и трагата ни дава не само функциите во која работите не успеа, 427 00:36:14,370 --> 00:36:16,440 но тоа е, исто така, ни кажува каде што сè беше наречен од. 428 00:36:16,440 --> 00:36:18,830 Значи, ако јас дојдете во текот на еден малку повеќе на десно, 429 00:36:18,830 --> 00:36:26,110 можеме да видиме дека да, бевме на линија 254 на овој strcmp-sse4.s датотека. 430 00:36:26,110 --> 00:36:32,540 Но, повикот беше донесена на buggy1.c, алинеа 6. 431 00:36:32,540 --> 00:36:35,960 Па тоа значи дека можеме да го направиме - е ние едноставно може да оди провери и да видиме што се случува 432 00:36:35,960 --> 00:36:39,930 на buggy1.c, алинеа 6. 433 00:36:39,930 --> 00:36:43,780 Повторно, постојат неколку начини да го направите тоа. Една од нив е да излезете надвор од GDB 434 00:36:43,780 --> 00:36:49,460 или вашиот код отворена во друг прозорец и крос референца. 435 00:36:49,460 --> 00:36:54,740 Тоа, само по себе, е прилично корисна, бидејќи сега ако сте на работното време 436 00:36:54,740 --> 00:36:57,220 и имаш сегмент грешка и вашата ТФ се прашувате каде што сè е кршење, 437 00:36:57,220 --> 00:36:59,710 можете само да се каже, "О, алинеа 6. Не знам што се случува, 438 00:36:59,710 --> 00:37:03,670 но нешто во врска со алинеа 6 предизвикува мојата програма да се скрши. " 439 00:37:03,670 --> 00:37:10,430 На друг начин да го направите е да можете да го користите оваа команда се нарекува листата во gdb. 440 00:37:10,430 --> 00:37:13,650 Исто така можете да го abbreviate со l. 441 00:37:13,650 --> 00:37:18,910 Значи, ако ние хит л, што сме се нашле? 442 00:37:18,910 --> 00:37:21,160 Ние се еден куп на чудни нешта. 443 00:37:21,160 --> 00:37:26,030 Ова е вистинскиот асемблерски код 444 00:37:26,030 --> 00:37:29,860 што е во strcmp_sse4_2. 445 00:37:29,860 --> 00:37:32,440 Ова изгледа вид на фанки, 446 00:37:32,440 --> 00:37:36,520 и причина ние сме добивање ова е затоа што токму сега, 447 00:37:36,520 --> 00:37:40,160 GDB нас има во рамката 0. 448 00:37:40,160 --> 00:37:43,070 >> Па во секое време гледаме променливи, во секое време ќе погледнеме во изворниот код, 449 00:37:43,070 --> 00:37:50,530 ние сме во потрага на изворниот код што се однесува на магацинот рамка ние сме во моментов внатре 450 00:37:50,530 --> 00:37:53,200 Значи, со цел да се добие ништо значајно, ние треба да 451 00:37:53,200 --> 00:37:57,070 се преселат во магацинот рамка што го прави повеќе смисла. 452 00:37:57,070 --> 00:38:00,180 Во овој случај, главниот магацинот рамка ќе се направи малку повеќе смисла, 453 00:38:00,180 --> 00:38:02,680 бидејќи тоа е всушност код кој ние напиша. 454 00:38:02,680 --> 00:38:05,330 Не strcmp код. 455 00:38:05,330 --> 00:38:08,650 Начинот на кој можете да се движите помеѓу рамки, во овој случај, бидејќи имаме две, 456 00:38:08,650 --> 00:38:10,430 имаме 0 и 1, 457 00:38:10,430 --> 00:38:13,650 да го направите тоа со нагоре и надолу команди. 458 00:38:13,650 --> 00:38:18,480 Ако јас се движат нагоре една рамка, 459 00:38:18,480 --> 00:38:21,770 сега сум во главниот магацинот рамка. 460 00:38:21,770 --> 00:38:24,330 Јас може да се движи надолу за да се врати на местото каде што беше, 461 00:38:24,330 --> 00:38:32,830 одат нагоре, повторно, оди надолу, повторно, и да си одат повторно. 462 00:38:32,830 --> 00:38:39,750 Ако некогаш направите вашата програма во GDB, ќе добиете несреќа, ќе го добиете трагата, 463 00:38:39,750 --> 00:38:42,380 и ќе видите дека тоа е во некои датотеки кои не знаете што се случува. 464 00:38:42,380 --> 00:38:45,460 Ќе се обидат листа, кодот не изгледаат познатите за вас, 465 00:38:45,460 --> 00:38:48,150 погледнете во вашата рамки и дознаам каде се наоѓате. 466 00:38:48,150 --> 00:38:51,010 Ти си веројатно во ред магацинот рамка. 467 00:38:51,010 --> 00:38:58,760 Или барем сте во магацинот рамка која не е онаа која навистина може да debug. 468 00:38:58,760 --> 00:39:03,110 Сега дека ние сме во соодветна оџакот рамка, ние сме во главната, 469 00:39:03,110 --> 00:39:08,100 сега можеме да го користиме на листата команда за да дознаам што линијата беше. 470 00:39:08,100 --> 00:39:13,590 И може да се види, тоа го печатат за нас овде. 471 00:39:13,590 --> 00:39:19,470 Но, ние може да ја погоди листата сите исти, како и листа ни дава оваа убава отпечатоците 472 00:39:19,470 --> 00:39:23,920 на реалните изворниот код што се случува овде. 473 00:39:23,920 --> 00:39:26,420 >> Особено, можеме да погледнеме во алинеја 6. 474 00:39:26,420 --> 00:39:29,330 Можеме да видиме што се случува овде. 475 00:39:29,330 --> 00:39:31,250 И тоа изгледа како правиме низа споредба 476 00:39:31,250 --> 00:39:41,050 меѓу стринг "CS50 карпи" и avg [1]. 477 00:39:41,050 --> 00:39:45,700 Нешто во врска со ова беше паѓа. 478 00:39:45,700 --> 00:39:54,120 Значи ма, не имате било какви размислувања за она што може да се случува овде? 479 00:39:54,120 --> 00:39:59,400 [Ма] Не знам зошто тоа е паѓа. >> Ти не знаеш зошто тоа е кршењето? 480 00:39:59,400 --> 00:40:02,700 Џими, секој мисли? 481 00:40:02,700 --> 00:40:06,240 [Jimmy] Јас не сум сосема сигурен, но во последно време ние се користи низа споредба, 482 00:40:06,240 --> 00:40:10,260 или strcmp, имавме како три различни случаи под неа. 483 00:40:10,260 --> 00:40:12,800 Ние не имаат ==, јас не мислам, десно во првата линија. 484 00:40:12,800 --> 00:40:16,700 Наместо тоа, таа беше поделен на три, а еден беше == 0, 485 00:40:16,700 --> 00:40:19,910 еден е <0, мислам, а еден беше> 0. 486 00:40:19,910 --> 00:40:22,590 Па можеби нешто слично? >> Да. Па таму е ова прашање 487 00:40:22,590 --> 00:40:27,200 на правиме споредба правилно? 488 00:40:27,200 --> 00:40:31,660 Stella? Секој мисли? 489 00:40:31,660 --> 00:40:38,110 [Стела] не сум сигурен. >> Не сум сигурен. Даниел? Мисли? Во ред. 490 00:40:38,110 --> 00:40:44,770 Излегува она што се случува токму тука е кога ќе истрча на програмата 491 00:40:44,770 --> 00:40:48,370 и добивме сегмент грешка, кога ќе истрча на програмата за прв пат, Даниел, 492 00:40:48,370 --> 00:40:50,800 му го даде тоа било командната линија аргументи? 493 00:40:50,800 --> 00:40:58,420 [Даниел] бр >> бр Во тој случај, она што е вредноста на avg [1]? 494 00:40:58,420 --> 00:41:00,920 >> Нема вредност. >> Право. 495 00:41:00,920 --> 00:41:06,120 Па, не постои соодветна вредноста на стрингот. 496 00:41:06,120 --> 00:41:10,780 Но има некои вредност. Која е вредноста која добива се чуваат таму? 497 00:41:10,780 --> 00:41:15,130 >> А ѓубре вредност? >> Тоа е или ѓубре вредност или, во овој случај, 498 00:41:15,130 --> 00:41:19,930 на крајот на низата argv е секогаш прекинува со нула. 499 00:41:19,930 --> 00:41:26,050 Значи она што всушност доби чуваат во таму е нула. 500 00:41:26,050 --> 00:41:30,810 На друг начин да се реши овој, наместо мислејќи дека преку, 501 00:41:30,810 --> 00:41:33,420 е да се обиде печатење тоа надвор. 502 00:41:33,420 --> 00:41:35,880 Ова е местото каде што беше велејќи дека користењето GDB е голема, 503 00:41:35,880 --> 00:41:40,640 затоа што може да испечатите сите променливи, сите вредности што сакате 504 00:41:40,640 --> 00:41:43,230 користење на оваа корисна-елегантен p команда. 505 00:41:43,230 --> 00:41:48,520 Значи, ако јас внесете стр а потоа внесете вредноста на променлива или името на променливата, 506 00:41:48,520 --> 00:41:55,320 да речеме, argc, гледам дека argc е 1. 507 00:41:55,320 --> 00:42:01,830 Ако сакам да се печати avg [0], можам да го стори тоа само така. 508 00:42:01,830 --> 00:42:04,840 И како што видовме, avg [0] е секогаш името на вашата програма, 509 00:42:04,840 --> 00:42:06,910 секогаш името на извршната датотека. 510 00:42:06,910 --> 00:42:09,740 Овде можете да ја видите доби целосната патека име. 511 00:42:09,740 --> 00:42:15,920 Јас, исто така може да испечатите avg [1] и да видиме што се случува. 512 00:42:15,920 --> 00:42:20,890 >> Тука имаме овој вид на мистичен вредност. 513 00:42:20,890 --> 00:42:23,890 Добивме овој 0x0. 514 00:42:23,890 --> 00:42:27,850 Запомни на почетокот на терминот кога ние разговаравме за хексадецимално броеви? 515 00:42:27,850 --> 00:42:34,680 Или дека малку прашање на крајот на pset 0 за тоа како да претставуваат 50 во хексадецимален? 516 00:42:34,680 --> 00:42:39,410 Начинот на кој ние пишуваме хексадецимален број во CS, само да не се збуни 517 00:42:39,410 --> 00:42:46,080 со децимални броеви, е ние секогаш им префиксот со 0x. 518 00:42:46,080 --> 00:42:51,420 Значи ова 0x префикс секогаш само значи толкуваат на следниот број како хексадецимален број, 519 00:42:51,420 --> 00:42:57,400 не како стринг, а не како децимален број, а не како бинарен број. 520 00:42:57,400 --> 00:43:02,820 Бидејќи бројот 5-0 е валиден број во хексадецимално. 521 00:43:02,820 --> 00:43:06,240 И тоа е број во децимала, 50. 522 00:43:06,240 --> 00:43:10,050 Значи ова е само како disambiguate. 523 00:43:10,050 --> 00:43:14,860 Значи 0x0 средства хексадецимален 0, која е исто така децимална 0, бинарна 0. 524 00:43:14,860 --> 00:43:17,030 Тоа е само вредност 0. 525 00:43:17,030 --> 00:43:22,630 Излезе дека ова е она нула е, всушност, во меморијата. 526 00:43:22,630 --> 00:43:25,940 Нула е само 0. 527 00:43:25,940 --> 00:43:37,010 Еве, елементот се чуваат во avg [1] е нула. 528 00:43:37,010 --> 00:43:45,220 Значи ние се обидуваме да се споредат нашите "CS50 карпи" стринг со нула стринг. 529 00:43:45,220 --> 00:43:48,130 Значи dereferencing нула, се обидуваат да пристапите работи на нула, 530 00:43:48,130 --> 00:43:55,050 тие обично ќе предизвика некој вид на сегментација на вина или други лоши работи да се случи. 531 00:43:55,050 --> 00:43:59,350 И излегува дека strcmp не се провери да се види 532 00:43:59,350 --> 00:44:04,340 дали или не сте се донесени во вредност тоа е нула. 533 00:44:04,340 --> 00:44:06,370 Напротив, тоа само оди напред, се обидува да си ја работи својата работа, 534 00:44:06,370 --> 00:44:14,640 и ако секунда грешки, тоа seg грешки, а тоа е вашиот проблем. Мора да се оди поправите тоа. 535 00:44:14,640 --> 00:44:19,730 Навистина брзо, како да го надминете овој проблем? Шарлот? 536 00:44:19,730 --> 00:44:23,540 [Шарлот] Можете да проверите користење ако. 537 00:44:23,540 --> 00:44:32,240 Значи, ако avg [1] е нула, == 0, а потоа се врати 1, или нешто [неразбирливо]. 538 00:44:32,240 --> 00:44:34,590 >> Да. Значи тоа е еден одличен начин да го направи тоа, како можеме да се провери да се види, 539 00:44:34,590 --> 00:44:39,230 вредноста ние сме за да помине во strcmp, avg [1], е тоа нула? 540 00:44:39,230 --> 00:44:45,830 Ако тоа е нула, тогаш можеме да кажеме во ред, прекин. 541 00:44:45,830 --> 00:44:49,450 >> А повеќе заеднички начин да го направите ова е да се користи argc вредност. 542 00:44:49,450 --> 00:44:52,040 Можете да видите тука на почетокот на главната, 543 00:44:52,040 --> 00:44:58,040 ние испушти тој тест кој обично се прави кога ние ги користиме командната линија аргументи, 544 00:44:58,040 --> 00:45:05,240 која е да се тестира дали или не нашите argc вредност е она што го очекуваме. 545 00:45:05,240 --> 00:45:10,290 Во овој случај, ние очекуваме најмалку два аргументи, 546 00:45:10,290 --> 00:45:13,660 името на програмата, плус еден друг. 547 00:45:13,660 --> 00:45:17,140 Бидејќи ние сме за да се користи вториот аргумент тука. 548 00:45:17,140 --> 00:45:21,350 Значи има некој вид на тест однапред, пред нашите strcmp повик 549 00:45:21,350 --> 00:45:37,390 дека тестовите дали или не argv е барем 2, исто така, ќе го стори истото вид на работа. 550 00:45:37,390 --> 00:45:40,620 Можеме да видиме ако тоа работи со извршување на програмата повторно. 551 00:45:40,620 --> 00:45:45,610 Секогаш можете да го рестартирате вашата програма во рамките GDB, што е навистина убаво. 552 00:45:45,610 --> 00:45:49,310 Можете да го извршите, и кога ќе помине во аргументите за вашата програма, 553 00:45:49,310 --> 00:45:53,060 ќе ги помине во кога ќе се јавите работи, а не кога ќе го подигнете gdb. 554 00:45:53,060 --> 00:45:57,120 На тој начин можете да ги повикувајќи вашата програма со различни аргументи секој пат. 555 00:45:57,120 --> 00:46:08,080 Значи се кандидира, или пак, можам да Type R, и да видиме што ќе се случи ако напишете "здраво". 556 00:46:08,080 --> 00:46:11,140 Тоа секогаш ќе ве праша дали сакате да ја почне од почеток. 557 00:46:11,140 --> 00:46:17,490 Вообичаено, вие не сакате да го почне од почеток. 558 00:46:17,490 --> 00:46:25,010 И во овој момент, се рестартира повторно, тоа отпечатоци од 559 00:46:25,010 --> 00:46:28,920 на програмата, дека ние сме трчање, buggy1, со аргументот здраво, 560 00:46:28,920 --> 00:46:32,720 и тоа отпечатоци овој стандард надвор; тој вели: "Ќе добиете Д", тажно лице. 561 00:46:32,720 --> 00:46:37,610 Но, ние не секунда грешка. Таа рече дека процесот излезено нормално. 562 00:46:37,610 --> 00:46:39,900 Така што изгледа прилично добро. 563 00:46:39,900 --> 00:46:43,050 Нема повеќе сегменти вина, ние го направи минатото, 564 00:46:43,050 --> 00:46:48,190 па изгледа дека беше навистина сегмент вина бубачка дека сме биле добивање. 565 00:46:48,190 --> 00:46:51,540 За жал, тоа ни кажува дека ние сме добивање на Д 566 00:46:51,540 --> 00:46:54,090 >> Можеме да одиме назад и се погледне на код и да видиме што се случува таму 567 00:46:54,090 --> 00:46:57,980 да дознаам што беше - зошто беше ни кажува дека имаме Д 568 00:46:57,980 --> 00:47:03,690 Ајде да видиме, тука е овој printf велејќи дека ли Д 569 00:47:03,690 --> 00:47:08,540 Ако ние напишете листа, како што се задржи пишување листата, се држи процесирањето надолу низ вашата програма, 570 00:47:08,540 --> 00:47:10,940 па тоа ќе ви покажам првите неколку линии на вашата програма. 571 00:47:10,940 --> 00:47:15,450 Тогаш тоа ќе ви покажам следните неколку линии, а во следниот дел и следниот дел. 572 00:47:15,450 --> 00:47:18,240 И тоа ќе се обидувам да одат надолу. 573 00:47:18,240 --> 00:47:21,180 И сега ние ќе дојдеме до "линијата број 16 е надвор од опсегот". 574 00:47:21,180 --> 00:47:23,940 Поради тоа што има само 15 линии. 575 00:47:23,940 --> 00:47:30,310 Ако дојде до оваа точка и вашиот прашувајќи, "Што да правам?" можете да го користите помош команда. 576 00:47:30,310 --> 00:47:34,340 Користете помогне, а потоа го даде името на команда. 577 00:47:34,340 --> 00:47:36,460 И можете да го видите GDB ни ги дава сите овој вид на работи. 578 00:47:36,460 --> 00:47:43,870 Таа вели: "Без аргументи, наведува уште десет линии по или околу претходниот оглас. 579 00:47:43,870 --> 00:47:47,920 Листа - список на десет линии пред - " 580 00:47:47,920 --> 00:47:52,960 Па ајде обидете се со користење листа минус. 581 00:47:52,960 --> 00:47:57,000 И со список на 10 линии претходната, можете да се позанимавам со листа малку. 582 00:47:57,000 --> 00:48:02,330 Можете да го направите листа, листа -, можете дури и може да даде листа на број, како листа 8, 583 00:48:02,330 --> 00:48:07,500 и тоа ќе листата на 10 линии околу алинеја 8. 584 00:48:07,500 --> 00:48:10,290 И можете да видите што се случува тука е имаш едноставна ако друго. 585 00:48:10,290 --> 00:48:13,980 Ако го напишете во CS50 карпи, тоа отпечатоци од "Можете да добиете А" 586 00:48:13,980 --> 00:48:16,530 Инаку тоа отпечатоци од "Ќе добиете Д" 587 00:48:16,530 --> 00:48:23,770 Bummer градот. Во ред. Да? 588 00:48:23,770 --> 00:48:26,730 >> [Даниел] Значи, кога се обидов прави CS50 карпи без наводници, 589 00:48:26,730 --> 00:48:29,290 тој вели: "Ќе добиете Д" 590 00:48:29,290 --> 00:48:32,560 Требаше наводниците да се добие тоа да работат, зошто е тоа така? 591 00:48:32,560 --> 00:48:38,490 >> Да. Излегува дека кога - ова е уште една забава малку хапка - 592 00:48:38,490 --> 00:48:47,900 кога ќе ја стартувате програмата, ако се работи и напишете CS50 карпи, 593 00:48:47,900 --> 00:48:50,800 само како Даниел велеше тој, и притиснете ентер, 594 00:48:50,800 --> 00:48:52,870 сепак вели добиеме Д 595 00:48:52,870 --> 00:48:55,580 А прашањето е, зошто е ова? 596 00:48:55,580 --> 00:49:02,120 И излегува дека нашите терминал и GDB анализира овие како два одделни аргументи. 597 00:49:02,120 --> 00:49:04,800 Бидејќи кога постои простор, тоа е имплицирана како 598 00:49:04,800 --> 00:49:08,730 првиот аргумент заврши; следниот аргумент е за да започне. 599 00:49:08,730 --> 00:49:13,260 На начин да се комбинираат тие во две или жал, во еден аргумент, 600 00:49:13,260 --> 00:49:18,510 е да се користи цитати. 601 00:49:18,510 --> 00:49:29,560 Па сега, ако ние го стави во наводници и да ја стартувате повторно, се добива А 602 00:49:29,560 --> 00:49:38,780 Значи само да повториме, нема цитати, CS50 и карпи се разложени, како два посебни аргументи. 603 00:49:38,780 --> 00:49:45,320 Со цитати, тоа е разложени, како еден аргумент заедно. 604 00:49:45,320 --> 00:49:53,070 >> Можеме да видиме ова со точка на прекин. 605 00:49:53,070 --> 00:49:54,920 Досега сме се работи нашата програма, а тоа е се одржува 606 00:49:54,920 --> 00:49:58,230 до или таа секунда грешки или хитови грешка 607 00:49:58,230 --> 00:50:05,930 или додека не излезе и сите е сосема во ред. 608 00:50:05,930 --> 00:50:08,360 Ова не значи дека тоа е најкорисен работа, бидејќи понекогаш 609 00:50:08,360 --> 00:50:11,840 Имаш грешка во вашата програма, но тоа не е предизвикува сегментација грешка. 610 00:50:11,840 --> 00:50:16,950 Тоа не се предизвикува вашата програма да се запре или нешто слично. 611 00:50:16,950 --> 00:50:20,730 На начин да се добие GDB за да го паузирате вашата програма во одредена точка 612 00:50:20,730 --> 00:50:23,260 е да се постави точка на прекин. 613 00:50:23,260 --> 00:50:26,520 Можете или да го направите ова со поставување на точки на прекин на името на функцијата 614 00:50:26,520 --> 00:50:30,770 или можете да поставите точки на прекин на одредена линија код. 615 00:50:30,770 --> 00:50:34,450 Ми се допаѓа да го поставите точки на прекин на имиња на функции, бидејќи - лесно да се запомни, 616 00:50:34,450 --> 00:50:37,700 и ако навистина оди во и менувате вашите изворниот код се малку, 617 00:50:37,700 --> 00:50:42,020 тогаш вашата точка на прекин, всушност, ќе остане на истото место во рамките на вашиот код. 618 00:50:42,020 --> 00:50:44,760 А ако сте со користење броеви и броевите на линијата промени 619 00:50:44,760 --> 00:50:51,740 затоа што ќе додадете или избришете некој код, тогаш вашиот поминувања сите се целосно зезнав. 620 00:50:51,740 --> 00:50:58,590 Еден од најчестите нешта направите е да поставите точки на прекин на главната функција. 621 00:50:58,590 --> 00:51:05,300 Често јас ќе го подигнете нагоре GDB, јас ќе тип Б главни, притиснете ентер, и дека ќе се постави точка на прекин 622 00:51:05,300 --> 00:51:10,630 на главната функција што само вели, "пауза на програмата штом ќе почнат да оперираат" 623 00:51:10,630 --> 00:51:17,960 и на тој начин, кога ќе ја стартувате мојата програма со, да речеме, CS50 карпи како два аргументи 624 00:51:17,960 --> 00:51:24,830 и притиснете Enter, таа добива на главната функција и запира на првата линија, 625 00:51:24,830 --> 00:51:30,620 непосредно пред тоа го оценува strcmp функција. 626 00:51:30,620 --> 00:51:34,940 >> Бидејќи јас сум на пауза, сега можам да почнам mucking наоколу и види што се случува 627 00:51:34,940 --> 00:51:40,250 со сите на различни варијабли кои се пренесуваат во мојата програма. 628 00:51:40,250 --> 00:51:43,670 Еве јас може да испечатите argc и да видиме што се случува. 629 00:51:43,670 --> 00:51:50,030 Види дека argc е 3, затоа што доби 3 различни вредности во него. 630 00:51:50,030 --> 00:51:54,060 Тоа доби името на програмата, тоа е се здобија првиот аргумент и вториот аргумент. 631 00:51:54,060 --> 00:52:09,330 Можеме да печатиме оние надвор од страна гледајќи во avg [0], avg [1], и avg [2]. 632 00:52:09,330 --> 00:52:12,030 Па сега вие исто така може да се види зошто овој повик strcmp се случува да не успее, 633 00:52:12,030 --> 00:52:21,650 бидејќи ќе видите дека тоа не подели на CS50 и карпи во две одделни аргументи. 634 00:52:21,650 --> 00:52:27,250 Во овој момент, откако ќе ја погоди точки на прекин, може да продолжи да се зајакне преку вашата програма 635 00:52:27,250 --> 00:52:32,920 линија по линија, за разлика ја стартувате програмата повторно. 636 00:52:32,920 --> 00:52:35,520 Значи, ако не сакате да ја стартувате програмата повторно и само продолжи од овде, 637 00:52:35,520 --> 00:52:41,970 можете да го користите продолжи команда и понатаму ќе ја стартувате програмата до крај. 638 00:52:41,970 --> 00:52:45,010 Исто како што беше тука. 639 00:52:45,010 --> 00:52:54,880 Сепак, ако рестартирам програмата, CS50 карпи, тоа хитови мојата точка на прекин, повторно, 640 00:52:54,880 --> 00:52:59,670 и овој пат, ако не сакате само да одат по целиот пат низ остатокот на програмата, 641 00:52:59,670 --> 00:53:08,040 Јас може да се користи следната команда, која Јас, исто така abbreviate со n. 642 00:53:08,040 --> 00:53:12,960 И ова ќе влезете низ програмата линија по линија. 643 00:53:12,960 --> 00:53:17,530 Така може да се види како работите се изврши, како варијабли промени, како работите да се ажурираат. 644 00:53:17,530 --> 00:53:21,550 Што е прилично убаво. 645 00:53:21,550 --> 00:53:26,570 Од друга кул работа е наместо повторување на истата команда одново и одново и одново, 646 00:53:26,570 --> 00:53:30,670 ако само кликнете Enter - па овде ќе види дека не ја внеле во нешто - 647 00:53:30,670 --> 00:53:33,780 ако јас само кликнете Enter, ќе го повтори претходната наредба, 648 00:53:33,780 --> 00:53:36,900 или претходната GDB команда која јас само се стави внатре 649 00:53:36,900 --> 00:53:56,000 Јас може да се задржи притискање на Enter и ќе продолжиме повлекува низ моите кодот линија по линија. 650 00:53:56,000 --> 00:53:59,310 Јас би ве охрабруваме да момци да оди провери од други кабриолет програми, како и. 651 00:53:59,310 --> 00:54:01,330 Ние немаме време да се добие преку сите нив денес во секција. 652 00:54:01,330 --> 00:54:05,890 Изворниот код е таму, па можете да вид на се види што се случува 653 00:54:05,890 --> 00:54:07,730 зад сцената, ако се навистина заглавени, 654 00:54:07,730 --> 00:54:11,940 но во најмала рака, само пракса подигнување GDB, 655 00:54:11,940 --> 00:54:13,940 водење на програма додека не се крши за вас, 656 00:54:13,940 --> 00:54:18,260 добивање на трагата, да пронајдат она што функционира на несреќата беше во, 657 00:54:18,260 --> 00:54:24,450 она што линијата што беше, печатење некои променлива вредности, 658 00:54:24,450 --> 00:54:30,140 само така ќе се добие чувство за тоа, бидејќи тоа навистина ќе ви помогнат да оди напред. 659 00:54:30,140 --> 00:54:36,340 Во овој момент, ние ќе треба да се откажат од GDB, кои се користат да престанам или само q. 660 00:54:36,340 --> 00:54:40,460 Ако вашата програма е во средината на водење сепак, и тоа не излезе, 661 00:54:40,460 --> 00:54:43,510 таа секогаш ќе ве праша "Дали сте сигурни дека навистина сакате да напуштите?" 662 00:54:43,510 --> 00:54:48,770 Вие само може да се погоди да. 663 00:54:48,770 --> 00:54:55,250 >> Сега ние ќе се погледне на следниот проблем што го имаме, кој е мачка програма. 664 00:54:55,250 --> 00:54:59,880 Ако се види на кратки за пренасочување и цевки, ќе видите дека Томи користи оваа програма 665 00:54:59,880 --> 00:55:07,540 дека во основа отпечатоци сите излез на датотека на екранот. 666 00:55:07,540 --> 00:55:12,660 Значи, ако јас се кандидира мачка, ова е всушност вграден во програмата на апаратот, 667 00:55:12,660 --> 00:55:16,860 и ако имате Macs можете да го направите ова на вашиот Mac исто така, ако се отвори терминал. 668 00:55:16,860 --> 00:55:25,630 А ние - мачка, да речеме, cp.c, и притиснете Enter. 669 00:55:25,630 --> 00:55:29,640 Што ова не, ако скролувате нагоре малку и да видиме каде се трчаше на линија, 670 00:55:29,640 --> 00:55:40,440 или каде што се трчаше на мачка команда, тој буквално само отпечатени содржината на cp.c на нашите екран. 671 00:55:40,440 --> 00:55:44,140 Ние можеме да се кандидира повторно и може да се стави во повеќе датотеки заедно. 672 00:55:44,140 --> 00:55:49,880 Па можете да направите мачка cp.c, а потоа ние исто така може да concatenate на cat.c датотека, 673 00:55:49,880 --> 00:55:53,250 кој е на програмата ние сме за да се напише, 674 00:55:53,250 --> 00:55:58,140 и тоа ќе печати двете датотеки назад да се врати на нашите екран. 675 00:55:58,140 --> 00:56:05,490 Значи, ако ние движете нагоре малку, ќе видиме дека кога ние трчаше оваа мачка cp.c, cat.c, 676 00:56:05,490 --> 00:56:17,110 прво отпечатени на КП датотека, а потоа под неа, тоа отпечатени на cat.c датотека десно надолу тука. 677 00:56:17,110 --> 00:56:19,650 Ние ќе ја користите оваа само да добијат нашите нозе влажни. 678 00:56:19,650 --> 00:56:25,930 Позанимавам со едноставни печатење на терминал, да видиме како тоа функционира. 679 00:56:25,930 --> 00:56:39,170 Ако вие момци се отвори со gedit cat.c, притиснете ентер, 680 00:56:39,170 --> 00:56:43,760 можете да видите на програма која ние сме за да пишувам. 681 00:56:43,760 --> 00:56:48,980 Ние сме вклучени во ова фино котел плоча, така што не мора да потрошите време пишување сето тоа надвор. 682 00:56:48,980 --> 00:56:52,310 Ние, исто така провери бројот на аргументи предадена внатре 683 00:56:52,310 --> 00:56:56,910 Ние печати убав порака за употреба. 684 00:56:56,910 --> 00:57:00,950 >> Ова е вид на нешто што, пак, како ние сме биле зборува за, 685 00:57:00,950 --> 00:57:04,490 тоа е речиси како мускулите меморија. 686 00:57:04,490 --> 00:57:07,190 Само не заборавајте да го задржи тоа на ист вид на работи 687 00:57:07,190 --> 00:57:11,310 и секогаш печатење некој вид на корисни порака 688 00:57:11,310 --> 00:57:17,670 така што луѓето знаат како да се кандидира на вашиот програма. 689 00:57:17,670 --> 00:57:21,630 Со мачка, тоа е прилично едноставна, ние сме само ќе да поминат низ сите на различни аргументи 690 00:57:21,630 --> 00:57:24,300 кои беа предадени на нашата програма, и ние ќе печати 691 00:57:24,300 --> 00:57:29,950 нивната содржина надвор на екранот едно по едно време. 692 00:57:29,950 --> 00:57:35,670 Со цел да се печати фајлови на екран, ние ќе треба да се направи нешто многу слични 693 00:57:35,670 --> 00:57:38,120 на она што ние го сторивме на крајот на квизот. 694 00:57:38,120 --> 00:57:45,350 На крајот на квизот, кои вработуваат програма, моравме да се отвори датотеката, 695 00:57:45,350 --> 00:57:48,490 а потоа моравме да се печати на него. 696 00:57:48,490 --> 00:57:54,660 Во овој случај, ние ќе треба да се отвори датотеката, и ние ќе треба да читаат од неа наместо тоа. 697 00:57:54,660 --> 00:58:00,630 Тогаш ние ќе треба да се печати, наместо во датотека, ние ќе печати на екран. 698 00:58:00,630 --> 00:58:05,830 Значи печатење на екран сте Сето тоа е направено пред со printf. 699 00:58:05,830 --> 00:58:08,290 Значи тоа не е премногу луд. 700 00:58:08,290 --> 00:58:12,190 Но, читањето на датотеката е вид на чудно. 701 00:58:12,190 --> 00:58:17,300 Ќе одиме преку тоа малку во исто време. 702 00:58:17,300 --> 00:58:20,560 Ако вие момци се врати во тоа последниот проблем на вашиот квиз, проблем 33, 703 00:58:20,560 --> 00:58:27,280 првата линија која ние ќе го направите тука, за отворање на датотека, е многу слична на она што го правевме таму. 704 00:58:27,280 --> 00:58:36,370 Значи Стела, што значи дека линијата изгледа, кога се отвори датотеката? 705 00:58:36,370 --> 00:58:47,510 [Стела] Капитал Датотека *, датотеката - >> Океј. >> - Е еднаков на fopen. >> То. 706 00:58:47,510 --> 00:58:55,980 Кој во овој случај е тоа? Тоа е во коментар. 707 00:58:55,980 --> 00:59:06,930 >> Тоа е во коментар? avg [i] и r? 708 00:59:06,930 --> 00:59:11,300 >> Токму така. Право на. Значи Стела е сосема во право. 709 00:59:11,300 --> 00:59:13,720 Тоа е она што линија изгледа. 710 00:59:13,720 --> 00:59:19,670 Ние ќе добиете датотека поток променлива, чувајте го во датотека *, така што сите капи, 711 00:59:19,670 --> 00:59:25,720 Датотека, *, и името на оваа променлива ќе биде датотека. 712 00:59:25,720 --> 00:59:32,250 Ние би можеле да го наречеме она што го сакаме. Ние би можеле да го наречеме first_file, или file_i, она што ние би сакале. 713 00:59:32,250 --> 00:59:37,590 А потоа името на датотеката беше донесен во на командната линија во оваа програма. 714 00:59:37,590 --> 00:59:44,450 Така, тоа е се чуваат во avg [i,] а потоа ние ќе ја отворите оваа датотека во читање на владата. 715 00:59:44,450 --> 00:59:48,100 Сега дека ние сме ја отвори датотеката, што е нешто што ние секогаш треба да се запамети да се направи 716 00:59:48,100 --> 00:59:52,230 кога сме отвори датотеката? Затворете го. 717 00:59:52,230 --> 00:59:57,220 Значи Missy, како ние да го затворите датотеката? 718 00:59:57,220 --> 01:00:01,020 [Ма] запишам (датотека) >> запишам (датотека). Точно. 719 01:00:01,020 --> 01:00:05,340 Велики. Во ред. Ако ги погледнеме во тоа да го стори коментар токму тука, 720 01:00:05,340 --> 01:00:11,940 тој вели: "Отвори avg [i] и печати неговата содржина на stdout." 721 01:00:11,940 --> 01:00:15,460 >> Стандарден излез е чудно име. Stdout е само нашиот начин на велејќи 722 01:00:15,460 --> 01:00:22,880 ние сакаме да го испечатите до терминалот, ние сакаме да го испечатите на стандардниот излезен поток. 723 01:00:22,880 --> 01:00:26,450 Ние всушност може да се ослободи од овој коментар овде. 724 01:00:26,450 --> 01:00:36,480 Одам да го копирате и залепите, бидејќи тоа е она што ние го сторивме. 725 01:00:36,480 --> 01:00:41,290 Во овој момент, ние сега треба да ја прочита датотеката малку од малку. 726 01:00:41,290 --> 01:00:46,300 Сме разговараа неколку начини на читање датотеки. 727 01:00:46,300 --> 01:00:51,830 Кои од нив се вашите омилени досега? 728 01:00:51,830 --> 01:00:57,960 Кој начин си ја видел или се сеќаваш ли, да чита датотеки? 729 01:00:57,960 --> 01:01:04,870 [Даниел] fread? >> Fread? Значи fread е еден. Џими, знаеш сите други? 730 01:01:04,870 --> 01:01:12,150 [Jimmy] бр >> Океј. Не бе. Шарлот? Александар? Сите други? Во ред. 731 01:01:12,150 --> 01:01:20,740 Па останатите се fgetc, е оној кој ќе го користите многу. 732 01:01:20,740 --> 01:01:26,410 Постои, исто така fscanf, вие момци видите шаблон овде? 733 01:01:26,410 --> 01:01:29,170 Тие сите почнуваат со F. Ништо да се направи со датотеката. 734 01:01:29,170 --> 01:01:35,260 Има fread, fgetc, fscanf. Овие се сите на читање функции. 735 01:01:35,260 --> 01:01:49,120 За пишување имаме запишување, имаме fputc наместо fgetc. 736 01:01:49,120 --> 01:01:58,250 Ние исто така имаат fprintf како што видов на квизот. 737 01:01:58,250 --> 01:02:01,680 Бидејќи ова е проблем кој вклучува читање од датотека, 738 01:02:01,680 --> 01:02:04,940 ние ќе користите една од овие три функции. 739 01:02:04,940 --> 01:02:10,890 Ние нема да ги користат овие функции овде долу. 740 01:02:10,890 --> 01:02:14,880 Овие функции сите се наоѓаат во стандардната библиотека I / O. 741 01:02:14,880 --> 01:02:17,510 Значи, ако се погледне на врвот на оваа програма, 742 01:02:17,510 --> 01:02:24,110 можете да видите дека ние сме веќе вклучени во хедер датотека за стандардна библиотека I / O. 743 01:02:24,110 --> 01:02:27,120 Ако сакаме да дознаам кој сакаме да се користи, 744 01:02:27,120 --> 01:02:29,690 ние секогаш може да се отвори човек страници. 745 01:02:29,690 --> 01:02:34,350 Значи можеме да напишете човек stdio 746 01:02:34,350 --> 01:02:43,180 и прочитате сите за stdio влезни и излезни функции во C. 747 01:02:43,180 --> 01:02:49,870 И веќе може да се види ох, погледнете. Тоа е да се спомене fgetc, тоа е да се спомене fputc. 748 01:02:49,870 --> 01:02:57,220 Па можете да разбивка малку и се погледне во, да речеме, fgetc 749 01:02:57,220 --> 01:03:00,060 и се погледне во својата човек страница. 750 01:03:00,060 --> 01:03:03,430 Можете да видите дека тоа оди заедно со целиот куп на други функции: 751 01:03:03,430 --> 01:03:12,640 fgetc, fgets, getc, getchar, добива, ungetc, и внесување на карактери и стрингови. 752 01:03:12,640 --> 01:03:19,180 Значи ова е како што читаме во карактери и стрингови од датотеки од стандарден влез, 753 01:03:19,180 --> 01:03:21,990 која е во суштина од страна на корисникот. 754 01:03:21,990 --> 01:03:24,780 И ова е како да го направи тоа во вистински В 755 01:03:24,780 --> 01:03:30,850 Значи ова не е со користење на GetString и GetChar функции 756 01:03:30,850 --> 01:03:36,840 дека ние се користи од CS50 библиотека. 757 01:03:36,840 --> 01:03:39,710 Ние ќе го направите овој проблем во неколку начини 758 01:03:39,710 --> 01:03:43,430 така што можете да видите две различни начини да ја направиш. 759 01:03:43,430 --> 01:03:48,490 И fread функција која Даниел споменува и fgetc се добри начини да го стори тоа. 760 01:03:48,490 --> 01:03:53,790 Мислам fgetc е малку полесно, бидејќи тоа само ги има, како што гледате, 761 01:03:53,790 --> 01:03:59,660 еден аргумент, на датотеката * дека ние се обидуваме да го прочитате лик од, 762 01:03:59,660 --> 01:04:02,740 и нејзините вратената вредност е цел број. 763 01:04:02,740 --> 01:04:05,610 И ова е малку збунувачки, нели? 764 01:04:05,610 --> 01:04:11,450 >> Бидејќи ние сме добивање карактер, па зошто да не го прави ова враќање на знак? 765 01:04:11,450 --> 01:04:18,700 Вие момци имате било какви идеи за тоа зошто тоа не може да се врати знак? 766 01:04:18,700 --> 01:04:25,510 [Missy одговори, неразбирливо] >> Да. Значи Missy е сосема во право. 767 01:04:25,510 --> 01:04:31,570 Ако тоа е ASCII, тогаш оваа цел број може да биде одбележан на вистински знак. 768 01:04:31,570 --> 01:04:33,520 Може да биде ASCII карактер, и дека е во право. 769 01:04:33,520 --> 01:04:36,220 Тоа е токму она што се случува. 770 01:04:36,220 --> 01:04:39,190 Ние сме со користење на int едноставно поради тоа што има повеќе битови. 771 01:04:39,190 --> 01:04:44,750 Тоа е поголема од знак, нашите знак има само 8 бита, дека 1 бајт на нашата 32-битна машини. 772 01:04:44,750 --> 01:04:48,520 И int има сите 4 бајти во вредност од простор. 773 01:04:48,520 --> 01:04:50,940 И излегува дека начинот на кој fgetc работи, 774 01:04:50,940 --> 01:04:53,940 ако дојдете во нашата синопсисот на овој човек страница малку, 775 01:04:53,940 --> 01:05:05,000 дојдете сите на патот надолу. Излегува дека тие ги користат оваа посебна вредност наречена EOF. 776 01:05:05,000 --> 01:05:09,640 Тоа е специјална постојана како повратната вредност на fgetc функција 777 01:05:09,640 --> 01:05:14,570 кога ќе удри на крајот на датотеката или ако добиете грешка. 778 01:05:14,570 --> 01:05:18,170 И излегува дека да се направи овие споредби со EOF правилно, 779 01:05:18,170 --> 01:05:24,060 дека сакате да го имаат тоа екстра количината на информации кои имате во int 780 01:05:24,060 --> 01:05:28,420 за разлика од користење на знак променлива. 781 01:05:28,420 --> 01:05:32,130 Иако fgetc е ефикасно добивање на лик од датотека, 782 01:05:32,130 --> 01:05:38,450 сакате да се запамети дека тоа е враќање на нешто што е од тип int за вас. 783 01:05:38,450 --> 01:05:41,360 Тоа, рече, тоа е прилично лесен за употреба. 784 01:05:41,360 --> 01:05:44,960 Тоа ќе ни даде карактер, па сите ние треба да направите е да ги прашува датотеката, 785 01:05:44,960 --> 01:05:48,440 "Дајте ми следниот знак, дај ми следниот знак, дај ми следниот карактер," 786 01:05:48,440 --> 01:05:51,400 додека не се дојде до крајот на датотеката. 787 01:05:51,400 --> 01:05:54,730 И дека ќе се повлече во еден лик во еден момент од нашиот датотека, 788 01:05:54,730 --> 01:05:56,250 и потоа можеме да направиме она што го сакаме со него. 789 01:05:56,250 --> 01:06:00,160 Ние можеме да се чува, ние може да го додадете во низа, можеме да го испечатите. 790 01:06:00,160 --> 01:06:04,630 Дали некој од тоа. 791 01:06:04,630 --> 01:06:09,600 >> Зумирање назад и да се вратам на нашите cat.c програма, 792 01:06:09,600 --> 01:06:16,170 ако сте ќе се користи fgetc, 793 01:06:16,170 --> 01:06:21,710 како да им пријде на ова следната линија на кодот? 794 01:06:21,710 --> 01:06:26,020 Одиме да се користи - fread ќе направи нешто малку поинаква. 795 01:06:26,020 --> 01:06:32,600 И овој пат, ние сме само ќе ги користи fgetc да се добие еден лик во исто време. 796 01:06:32,600 --> 01:06:40,910 За процесирање на целата датотека, она што можеби ќе треба да се направи? 797 01:06:40,910 --> 01:06:44,030 Колку знаци постојат во датотека? 798 01:06:44,030 --> 01:06:47,390 Постојат голем број. Па веројатно сакате да се добие една 799 01:06:47,390 --> 01:06:49,860 а потоа да добијат уште еден и да добијат друга и се друго. 800 01:06:49,860 --> 01:06:53,330 Каков вид на алгоритам мислите ние можеби ќе мора да се користи тука? 801 01:06:53,330 --> 01:06:55,470 Каков вид на - [Александар] А за телефонска линија? >> Токму така. 802 01:06:55,470 --> 01:06:57,500 Некој вид на јамка. 803 01:06:57,500 --> 01:07:03,380 А за телефонска линија е, всушност, голема, во овој случај. 804 01:07:03,380 --> 01:07:08,620 И како што велеа, тоа звучи како сакате јамка во текот на целата датотека, 805 01:07:08,620 --> 01:07:11,820 добивање на карактер во исто време. 806 01:07:11,820 --> 01:07:13,850 Било какви предлози за тоа што тоа може да изгледа како? 807 01:07:13,850 --> 01:07:22,090 [Александар, неразбирливо] 808 01:07:22,090 --> 01:07:30,050 >> Океј, само кажете ми на англиски јазик она што се обидувате да го направите? [Александар, неразбирливо] 809 01:07:30,050 --> 01:07:36,270 Значи во овој случај, тоа звучи како ние сме само се обидува да јамка во текот на целата датотека. 810 01:07:36,270 --> 01:07:45,330 [Александар] Па јас <големината на int? >> Големината на - 811 01:07:45,330 --> 01:07:49,290 Претпоставувам дека големината на датотеката, нели? Големината - we'll само напиши го тоа како оваа. 812 01:07:49,290 --> 01:07:57,470 Големина на датотеката засега, i + +. 813 01:07:57,470 --> 01:08:04,610 Значи излегува дека начинот на кој го направите тоа користејќи fgetc, и ова е ново, 814 01:08:04,610 --> 01:08:10,460 е дека нема лесен начин да се само да добие со големина на датотека 815 01:08:10,460 --> 01:08:16,979 со овој "sizeof" тип на изградба дека сте виделе порано. 816 01:08:16,979 --> 01:08:20,910 Кога ние ги користиме која fgetc функција, ние сме за воведување на некои вид на 817 01:08:20,910 --> 01:08:29,069 нова, фанки синтаксата на овој за телефонска линија, каде што, наместо користење на само основните контра 818 01:08:29,069 --> 01:08:33,920 да одат знак по знак, ние ќе треба да се повлече еден карактер во еден момент, 819 01:08:33,920 --> 01:08:37,120 еден карактер во еден момент, и начинот на кој ние знаеме дека сме на крајот 820 01:08:37,120 --> 01:08:41,290 е кога не сме сметаат одреден број на карактери, 821 01:08:41,290 --> 01:08:49,939 но кога ликот ќе се повлече е тој посебен крајот на датотеката карактер. 822 01:08:49,939 --> 01:08:58,689 Значи можеме да го правиме ова преку - Јас ова го нарекуваат ch, и ние ќе го иницијализира 823 01:08:58,689 --> 01:09:08,050 со нашиот прв повик за да се добие првиот карактер од датотеката. 824 01:09:08,050 --> 01:09:14,979 Значи овој дел токму тука, ова се случува да се добие лик од датотека 825 01:09:14,979 --> 01:09:20,840 и се чува во променлива ch. 826 01:09:20,840 --> 01:09:25,420 Ние ќе го задржи тоа се додека не стигнете до крајот на датотеката, 827 01:09:25,420 --> 01:09:41,170 што правиме со тестирање за карактерот не е еднаква на таа специјална EOF карактер. 828 01:09:41,170 --> 01:09:48,750 А потоа наместо да прави CH + +, што само би зголемување на вредноста, 829 01:09:48,750 --> 01:09:52,710 па ако читаме А од датотека, капитал, да речеме, 830 01:09:52,710 --> 01:09:56,810 CH + + ќе ни даде б, а потоа ние ќе добијам в а потоа г. 831 01:09:56,810 --> 01:09:59,310 Тоа не е јасно она што го сакаме. Она што сакаме тука 832 01:09:59,310 --> 01:10:05,830 во оваа последната трошка е што сакаме да го добиете следниот карактер од датотеката. 833 01:10:05,830 --> 01:10:09,500 >> Па како да го добиете следниот карактер од датотеката? 834 01:10:09,500 --> 01:10:13,470 Како да ја добиете првиот карактер од датотеката? 835 01:10:13,470 --> 01:10:17,200 [Студентски] fgetfile? >> Fgetc, или, жал, сте биле сосема во право. 836 01:10:17,200 --> 01:10:20,470 Јас го згрешивте во пишувањето право таму. Така да. 837 01:10:20,470 --> 01:10:26,240 Еве, наместо за правење на ch + +, 838 01:10:26,240 --> 01:10:29,560 ние сме само ќе да се јавите fgetc (датотека) повторно 839 01:10:29,560 --> 01:10:39,180 и чување на резултат во нашата истиот ch променлива. 840 01:10:39,180 --> 01:10:43,730 [Студентски збор, неразбирливо] 841 01:10:43,730 --> 01:10:52,390 >> Ова е местото каде што овие датотеки * момци се специјални. 842 01:10:52,390 --> 01:10:59,070 Начинот на кој тие работат е тие - кога за прв пат се отвори - кога за прв пат го направат тој fopen повик, 843 01:10:59,070 --> 01:11:04,260 на датотеката * ефикасно служи како покажувач на почетокот на датотеката. 844 01:11:04,260 --> 01:11:12,830 И тогаш секој пат кога ќе се јавите fgetc, што се движи еден карактер преку датотека. 845 01:11:12,830 --> 01:11:23,280 Значи секогаш кога ќе се јавите ова, ти си ја зголемува датотеката покажувачот од страна на еден карактер. 846 01:11:23,280 --> 01:11:26,210 И кога ќе fgetc повторно, ти си го водиш друг карактер 847 01:11:26,210 --> 01:11:28,910 и друг карактер и друг карактер и друг карактер. 848 01:11:28,910 --> 01:11:32,030 [Студентски збор, неразбирливо] >> И that's - Да. 849 01:11:32,030 --> 01:11:34,810 Тоа е вид на оваа магија под хауба. 850 01:11:34,810 --> 01:11:37,930 Вие само задржи зголемување, преку. 851 01:11:37,930 --> 01:11:46,510 Во овој момент, сте во можност да всушност работат со карактер. 852 01:11:46,510 --> 01:11:52,150 Па, како би можеле да печати ја оваа надвор на екранот, сега? 853 01:11:52,150 --> 01:11:58,340 Можеме да го користиме истиот printf нешто што ние се користи пред. 854 01:11:58,340 --> 01:12:00,330 Дека ние сме биле со користење на сите семестар. 855 01:12:00,330 --> 01:12:05,450 Можеме да го наречеме printf, 856 01:12:05,450 --> 01:12:21,300 и ние може да помине во знакот само така. 857 01:12:21,300 --> 01:12:27,430 Друг начин да го направи тоа е, наместо користење printf и морале да го направите ова формат стринг, 858 01:12:27,430 --> 01:12:29,490 ние исто така може да користите една од другите функции. 859 01:12:29,490 --> 01:12:40,090 Можеме да го користиме fputc, кој отпечатоци лик на екранот, 860 01:12:40,090 --> 01:12:52,580 освен ако гледаме fputc - дозволете ми да одзумирате малку. 861 01:12:52,580 --> 01:12:56,430 Можеме да видиме што е убаво е што е потребно во ликот што го читаме со користење fgetc, 862 01:12:56,430 --> 01:13:05,100 но тогаш ние треба да го даде поток да се печати. 863 01:13:05,100 --> 01:13:11,850 Ние, исто така може да се користи putchar функција, која ќе стави директно на стандарден излез. 864 01:13:11,850 --> 01:13:16,070 Па така постојат еден куп на различни опции кои може да се користат за печатење. 865 01:13:16,070 --> 01:13:19,580 Сите тие се во стандардната библиотека I / O. 866 01:13:19,580 --> 01:13:25,150 Секогаш кога сакате да печатите - па printf, по правило, ќе се печати на посебни стандарден излез поток, 867 01:13:25,150 --> 01:13:27,910 а тоа е дека stdout. 868 01:13:27,910 --> 01:13:41,300 Па ние само може да се однесува на тоа како вид на оваа магија вредност, stdout тука. 869 01:13:41,300 --> 01:13:48,410 Упс. Стави запирка надвор. 870 01:13:48,410 --> 01:13:52,790 >> Ова е многу нова, фанки информации тука. 871 01:13:52,790 --> 01:13:58,600 Многу од ова е многу идиоматичен, во смисла дека тоа е код 872 01:13:58,600 --> 01:14:05,700 што е напишано овој начин само затоа што е чиста за читање, лесна за читање. 873 01:14:05,700 --> 01:14:11,520 Постојат многу различни начини да го направи тоа, многу различни функции можете да го користите, 874 01:14:11,520 --> 01:14:14,680 но ние се стремат да, едноставно следете овие исти модели над над и. 875 01:14:14,680 --> 01:14:20,180 Затоа, не бидете изненадени ако видите кодот вака доаѓа повторно и повторно. 876 01:14:20,180 --> 01:14:25,690 Во ред. Во овој момент, ние треба да пауза за тој ден. 877 01:14:25,690 --> 01:14:31,300 Ви благодариме за кои доаѓаат. Ви благодариме за гледање ако сте онлајн. И ќе се видиме следната недела. 878 01:14:31,300 --> 01:14:33,890 [CS50.TV]