1 00:00:00,000 --> 00:00:09,780 >> [Speel van musiek] 2 00:00:09,780 --> 00:00:11,150 >> ZAMYLA CHAN: Kom ons pak herstel. 3 00:00:11,150 --> 00:00:14,030 Herstel is waarskynlik my gunsteling PSET, en veral omdat ek dink dit is 4 00:00:14,030 --> 00:00:15,650 regtig, regtig cool. 5 00:00:15,650 --> 00:00:19,040 Basies, jy 'n geheue gegee kaart lêer waarin 6 00:00:19,040 --> 00:00:20,900 foto's is verwyder. 7 00:00:20,900 --> 00:00:23,650 Maar wat jy gaan doen, is hulle almal te herstel. 8 00:00:23,650 --> 00:00:24,250 >> OK. 9 00:00:24,250 --> 00:00:28,230 So dit is regtig opwindend, maar miskien 'n bietjie intimiderend, want jy 10 00:00:28,230 --> 00:00:32,430 gegee 'n leë C lêer en jy het om dit te vul in 11 00:00:32,430 --> 00:00:36,250 OK, so laat breek hierdie in hanteerbare dele. 12 00:00:36,250 --> 00:00:38,160 Jy wil oop te maak die geheue kaart lêer. 13 00:00:38,160 --> 00:00:39,900 Dit lyk eenvoudig genoeg. 14 00:00:39,900 --> 00:00:43,030 Dan vind die begin van 'n JPG-beeld. 15 00:00:43,030 --> 00:00:46,740 Al die lêers op die geheue kaart gaan JPG te wees. 16 00:00:46,740 --> 00:00:50,840 Dan, wanneer jy vind die begin, jy gaan 'n nuwe JPG oop te maak, sodat 17 00:00:50,840 --> 00:00:57,610 is, soos, 'n JPG, en skryf 512 byte op 'n tyd totdat 'n nuwe JPG is 18 00:00:57,610 --> 00:01:02,930 gevind, en die beëindiging van die program, een keer jy spoor die einde van die lêer. 19 00:01:02,930 --> 00:01:06,400 >> So eerste stappe eerste is om oop te maak die geheue kaart lêer. 20 00:01:06,400 --> 00:01:09,850 Maar jy weet dit reeds, en daar is 'n lêer I / O-funksie wat gaan 21 00:01:09,850 --> 00:01:12,030 bewys dat baie nuttig. 22 00:01:12,030 --> 00:01:12,820 OK. 23 00:01:12,820 --> 00:01:14,760 So, wat is JPG? 24 00:01:14,760 --> 00:01:16,330 Omdat ons nodig het om te begin nie. 25 00:01:16,330 --> 00:01:21,310 Wel, JPG, net soos bietjie kaarte, is net rye van grepe. 26 00:01:21,310 --> 00:01:30,660 Gelukkig, elke JPG begin met óf 0xff wees, 0xd8, 0xff wees, 0xe0, een volgorde 27 00:01:30,660 --> 00:01:33,610 grepe, of 'n ander volgorde van grepe. 28 00:01:33,610 --> 00:01:37,250 >> So die vier grepe dui die begin van 'n JPG. 29 00:01:37,250 --> 00:01:40,780 Niemand anders as die twee kombinasies vier grepe. 30 00:01:40,780 --> 00:01:44,840 En gelukkig vir ons, nog 'n feit dat ons voordeel kan trek, is dat elke 31 00:01:44,840 --> 00:01:48,550 JPG gestoor side-by-kant op die geheue kaart. 32 00:01:48,550 --> 00:01:52,210 Ek het die struktuur van 'n verteenwoordig geheue kaart skematies op hierdie 33 00:01:52,210 --> 00:01:53,310 gly hier. 34 00:01:53,310 --> 00:01:59,270 Hier, elke vierkante elke reghoek, verteenwoordig 512 grepe, en dit begin 35 00:01:59,270 --> 00:02:01,750 met 'n grys in wat ons doen nie regtig 'n JPG. 36 00:02:01,750 --> 00:02:05,700 >> Maar dan moet ons uiteindelik getref 'n blok met 'n ster. 37 00:02:05,700 --> 00:02:10,940 Dit beteken dat die eerste vier grepe uit van daardie 512 is een van die twee 38 00:02:10,940 --> 00:02:13,230 begin rye van 'n JPG. 39 00:02:13,230 --> 00:02:17,340 En ons gaan van daar af, en dan weer een JPG eindig, is die volgende een begin. 40 00:02:17,340 --> 00:02:20,990 Ons moet nooit meer nie grys ruimte tussen-in. 41 00:02:20,990 --> 00:02:25,550 >> Maar hoe weet ons eintlik lees, en Lees die 512 grepe sodat ons kan maak 42 00:02:25,550 --> 00:02:27,500 die vergelyking die eerste plek? 43 00:02:27,500 --> 00:02:33,470 Wel, laat ons terug na fread gaan, wat neem in die struct wat bevat 44 00:02:33,470 --> 00:02:34,470 die grepe wat jy lees. 45 00:02:34,470 --> 00:02:36,570 So jy gaan sit diegene in daar - 46 00:02:36,570 --> 00:02:42,192 die grootte, die aantal, en dan inpointer dat jy die lees van. 47 00:02:42,192 --> 00:02:49,900 Nou, wil ons lees 512 op 'n tyd, en ons wil dit op te slaan in 'n buffer, 48 00:02:49,900 --> 00:02:50,700 Ek gaan om dit te noem. 49 00:02:50,700 --> 00:02:54,100 >> Kortom, ons gaan om vas te hou op die 512 grepe en doen 50 00:02:54,100 --> 00:02:55,500 dinge met dit, reg? 51 00:02:55,500 --> 00:02:58,260 Ons is nie van plan om die eerste te vergelyk vier grepe, of ons gaan 52 00:02:58,260 --> 00:02:59,830 Lees dit in, OK? 53 00:02:59,830 --> 00:03:05,050 So dan is die data wyser sal dan dien as 'n buffer, en die 54 00:03:05,050 --> 00:03:07,745 inpointer, Wel, dit is net gaan jou geheue kaart te wees. 55 00:03:07,745 --> 00:03:09,500 >> Terug na ons geheue kaart skematiese. 56 00:03:09,500 --> 00:03:14,690 Ons gaan 512 grepe op 'n tyd om te lees, stoor elke 512-byte blok 57 00:03:14,690 --> 00:03:19,190 in 'n buffer, hou op diegene buffer, wat 512 grepe, totdat ons weet 58 00:03:19,190 --> 00:03:22,000 presies wat om te doen. 59 00:03:22,000 --> 00:03:25,960 So die begin is nie niks nie, so ons sal die buffer te lees, te vergelyk, en 60 00:03:25,960 --> 00:03:28,160 sal ons nie nodig om iets te doen met dit. 61 00:03:28,160 --> 00:03:32,030 En dan, het ons uiteindelik 'n ster getref blok, wat beteken dat ons 62 00:03:32,030 --> 00:03:33,630 gevind dat ons eerste JPG. 63 00:03:33,630 --> 00:03:36,560 So het die buffer nou hou grepe uit die JPG. 64 00:03:36,560 --> 00:03:40,220 >> Die volgende keer 512 grepe, want hulle is nie 'n ster blok, is ook 65 00:03:40,220 --> 00:03:41,740 deel van daardie JPG. 66 00:03:41,740 --> 00:03:47,630 En JPG is deurlopende van daar in, totdat ons getref die volgende JPG. 67 00:03:47,630 --> 00:03:51,880 En dan is die buffer dan hou 512 grepe vir die JPG, en 68 00:03:51,880 --> 00:03:53,580 so aan, en so meer. 69 00:03:53,580 --> 00:03:54,250 OK. 70 00:03:54,250 --> 00:03:58,980 >> So wanneer jy druk op die eerste ster blok, die eerste JPG, hoe kan jy 71 00:03:58,980 --> 00:04:01,910 eintlik, wel, dit oop te maak? 72 00:04:01,910 --> 00:04:04,990 Kom ons maak 'n nuwe JPG. 73 00:04:04,990 --> 00:04:08,846 Die lêername vir 'n JPG gaan in die formaat,, nommer, 74 00:04:08,846 --> 00:04:13,830 number.jpg, in dat hulle die naam in die volgorde waarin hulle gevind word, 75 00:04:13,830 --> 00:04:14,780 begin by 0. 76 00:04:14,780 --> 00:04:19,890 >> Dus is die eerste JPG dat jy vind sal 000.jpg word. 77 00:04:19,890 --> 00:04:26,560 So, waarskynlik 'n goeie idee om tred te hou hoeveel JPG jy tot dusver gevind. 78 00:04:26,560 --> 00:04:27,610 So wat is die lêer se naam. 79 00:04:27,610 --> 00:04:29,660 Maar hoe kan jy eintlik maak dit? 80 00:04:29,660 --> 00:04:34,310 Wel, ons gaan gebruik om 'n funksie genoem sprintf. 81 00:04:34,310 --> 00:04:38,260 'N bietjie soortgelyk aan printf, waar jy kan gebruik plekhouers vir Strykers, 82 00:04:38,260 --> 00:04:42,420 behalwe in hierdie geval, sal sprintf druk die lêer uit in die huidige 83 00:04:42,420 --> 00:04:45,550 Gids, nie in die terminale. 84 00:04:45,550 --> 00:04:46,120 >> OK. 85 00:04:46,120 --> 00:04:49,950 So hier sien ons dat ons 'n titel, 'n kar skikking wat sal die stoor van die 86 00:04:49,950 --> 00:04:55,120 gevolglike string, en ons slaag in die titel van die werklike string met 'n 87 00:04:55,120 --> 00:04:58,720 bevat, wil ons net het geleer het om te doen met printf. 88 00:04:58,720 --> 00:05:05,530 Maar hierdie kode wat ek hier sal 2.jpg, nie 002.jpg gee. 89 00:05:05,530 --> 00:05:09,920 So ek sal laat jy om uit te vind hoe om te verander die plekhouer te maak die 90 00:05:09,920 --> 00:05:11,920 korrekte naam. 91 00:05:11,920 --> 00:05:12,610 >> OK. 92 00:05:12,610 --> 00:05:17,390 So as jy dan sprintf'd het wat jy kan open die lêer nie, want dit bestaan ​​in 93 00:05:17,390 --> 00:05:22,690 jou gids, met fopen, met behulp van die titel, en dan net af wat jy wil 94 00:05:22,690 --> 00:05:25,140 dat 'n lêer om in te open 95 00:05:25,140 --> 00:05:30,260 So nou dat ons 'n nuwe JPG lêer het oopgemaak, nou kan ons op 'n skryf 512 grepe 96 00:05:30,260 --> 00:05:33,320 tyd, totdat 'n nuwe JPG gevind word. 97 00:05:33,320 --> 00:05:36,640 So kom ons neem 'n ander kyk by die sintaksis van fwrite. 98 00:05:36,640 --> 00:05:40,060 >> Ek weet dat ek wys hierdie skuif 'n baie, maar ek wil net om seker te maak dat 99 00:05:40,060 --> 00:05:43,530 julle kry nie te verwar nie, want Ek weet dat dit is baie maklik om te 100 00:05:43,530 --> 00:05:47,000 meng die eerste en die laaste argument, in die besonder. 101 00:05:47,000 --> 00:05:54,390 Maar onthou dat jy skryf uit jou buffer in die buite-lêer beelde. 102 00:05:54,390 --> 00:05:59,250 >> Nou dat jy weet hoe om die skryf 512 grepe in jou JPG lêer wat jy het 103 00:05:59,250 --> 00:06:03,230 geskep het, goed, ons wil om dit te stop proses wanneer ons die einde van bereik het 104 00:06:03,230 --> 00:06:06,720 Ons kaart, want daar sal nie meer beelde te vinde nie. 105 00:06:06,720 --> 00:06:10,760 So laat ons gaan terug na fread weer, ek belowe. 106 00:06:10,760 --> 00:06:15,600 fread terug hoeveel items van grootte, grootte, gereed was suksesvol. 107 00:06:15,600 --> 00:06:19,440 Ideaal, is dit gaan wees wat jy slaag in vir die nommer, reg? 108 00:06:19,440 --> 00:06:24,140 Omdat jy probeer aantal te lees van die elemente van grootte, grootte. 109 00:06:24,140 --> 00:06:29,380 Maar as fread is nie in staat om dit te lees aantal elemente, dan sal dit terugkeer 110 00:06:29,380 --> 00:06:32,530 watter getal is dit suksesvol te lees. 111 00:06:32,530 --> 00:06:36,310 >> Nou, 'n belangrike ding om daarop te let is dat as jy 'n ander lêer I / O 112 00:06:36,310 --> 00:06:43,860 funksie soos fgetc, sal dit ook terug hoeveel items suksesvol te lees. 113 00:06:43,860 --> 00:06:48,000 Wat is nuttig oor hierdie funksie is dat as jy gebruik funksies binnekant van 'n 114 00:06:48,000 --> 00:06:53,190 toestand is, sal dit self uit te voer, terwyl die bepaling van die toestand, wat 115 00:06:53,190 --> 00:06:54,340 net werklik nuttig. 116 00:06:54,340 --> 00:07:00,440 So as jy het hierdie toestande, sê, As fread buffer, sizeof hond, 2, 117 00:07:00,440 --> 00:07:04,870 wyser, gelyk is gelyk aan 1, wat beteken dat ek wil om te lees 118 00:07:04,870 --> 00:07:06,540 2 honde by die tyd. 119 00:07:06,540 --> 00:07:13,490 Maar as fread terug 1 in plaas van 2 as verwag, beteken dit dat daar 2 120 00:07:13,490 --> 00:07:16,480 honde het in my lêer, maar eerder 1. 121 00:07:16,480 --> 00:07:22,450 Maar as dit gee 2, dan het ek nog ' die 2 honde binnekant van my buffer. 122 00:07:22,450 --> 00:07:26,280 >> So nou wat gee jou 'n gevoel van hoe om te gaan vir die einde van die lêer, maar 123 00:07:26,280 --> 00:07:28,940 Kom ons gaan deur nou die logika. 124 00:07:28,940 --> 00:07:32,460 Hoe weet ons eintlik stuk al van hierdie elemente saam? 125 00:07:32,460 --> 00:07:36,880 Sodra ons getref ons eerste JPG, aangesien ons weet dat JPG gestoor 126 00:07:36,880 --> 00:07:40,910 contiguously, sal ons skryf word totdat bereik ons ​​die einde van die kaart lêer. 127 00:07:40,910 --> 00:07:43,950 Maar ons wil nie om te skryf enigiets tot dan. 128 00:07:43,950 --> 00:07:48,710 So dit saak maak, nie net dat ons by die begin van 'n nuwe JPG, maar of 129 00:07:48,710 --> 00:07:50,655 Ons het reeds 'n JPG of nie. 130 00:07:50,655 --> 00:07:55,390 >> As dit die begin van 'n nuwe JPG, sal ons wil ons huidige JPG lêer of te sluit 131 00:07:55,390 --> 00:07:59,110 ons het een oop, en oop 'n nuwe een in te skryf. 132 00:07:59,110 --> 00:08:03,340 As dit is nie die begin van die nuwe JPG, al is, sal ons dieselfde JPG lêer hou 133 00:08:03,340 --> 00:08:05,910 oop te maak en skryf in daardie. 134 00:08:05,910 --> 00:08:10,100 Ons sal ons buffer te skryf in welke JPG lêer ons het oop, met dien verstande dat 135 00:08:10,100 --> 00:08:12,120 ons het een oop, natuurlik. 136 00:08:12,120 --> 00:08:16,190 As ons nog nie gevind nie ons eerste JPG nie, moet ons iets skryf nie. 137 00:08:16,190 --> 00:08:20,290 En hierdie proses gaan voort totdat jy bereik die einde van die kaart lêer. 138 00:08:20,290 --> 00:08:23,410 >> En uiteindelik, sal jy wil maak seker dat jy fclose enige 139 00:08:23,410 --> 00:08:25,800 lêers wat jy het fopened. 140 00:08:25,800 --> 00:08:28,360 Sodra jy gemaklik met die konsepte, neem 'n blik op sommige 141 00:08:28,360 --> 00:08:30,840 pseudokode, wat ek hier ingesluit. 142 00:08:30,840 --> 00:08:34,830 Eerste, wil jy die kaart lêer oop te maak, en dan herhaal die volgende proses 143 00:08:34,830 --> 00:08:37,144 totdat jy bereik die einde van die kaart. 144 00:08:37,144 --> 00:08:40,880 Jy wil 512 grepe om te lees in 'n buffer. 145 00:08:40,880 --> 00:08:43,934 Met behulp van die buffer, sal jy wil om te kyk of jy by die begin van 'n 146 00:08:43,934 --> 00:08:45,300 nuwe JPG of nie. 147 00:08:45,300 --> 00:08:48,400 En die antwoord op die vraag sal invloed op jou leer bestuur - 148 00:08:48,400 --> 00:08:51,940 wat lêers wat jy oopmaak, wat kinders dink jy sluit. 149 00:08:51,940 --> 00:08:55,220 >> Dan, het jy reeds 'n JPG? 150 00:08:55,220 --> 00:08:57,740 Hoe het jy is hou spoor van daardie? 151 00:08:57,740 --> 00:09:01,735 Dan, afhangende van wat, sal jy óf skryf in die huidige JPG dat jy 152 00:09:01,735 --> 00:09:07,090 oop, of nie skryf dit glad nie, omdat jy nie 'n JPG gevind nie. 153 00:09:07,090 --> 00:09:10,870 Ten slotte, as jy die einde van bereik die lêer, sal jy wil 'n te sluit 154 00:09:10,870 --> 00:09:12,590 oorblywende lêers wat jy het oop. 155 00:09:12,590 --> 00:09:14,590 Ons wil hier netjies wees. 156 00:09:14,590 --> 00:09:18,790 >> En met dié, het jy al verhaal die vermiste lêers uit dat die geheue 157 00:09:18,790 --> 00:09:21,620 kaart, wat is 'n mooi ongelooflike prestasie. 158 00:09:21,620 --> 00:09:23,430 So klop jouself op die rug. 159 00:09:23,430 --> 00:09:27,560 Maar, daar is nog 'n element te die PSET, wat is die wedstryd. 160 00:09:27,560 --> 00:09:30,920 Jy sal vind dat al die foto's wat jy herstel is eintlik 161 00:09:30,920 --> 00:09:32,820 foto's van CS50 se personeel. 162 00:09:32,820 --> 00:09:38,500 So as jy op die kampus of iewers naby, dan is jy kan foto's neem met 163 00:09:38,500 --> 00:09:42,600 die personeel, en die afdeling wat die die meeste foto's met personeellede 164 00:09:42,600 --> 00:09:46,940 van hul verhaal lêers sal kry 'n awesome prys. 165 00:09:46,940 --> 00:09:50,650 Met dit, dan is jy klaar die herstel PSET. 166 00:09:50,650 --> 00:09:53,600 My naam is Zamyla, en dit is CS50. 167 00:09:53,600 --> 00:10:01,835