1 00:00:00,000 --> 00:00:09,780 >> [Muziek] 2 00:00:09,780 --> 00:00:11,150 >> ZAMYLA CHAN: Laten we pakken herstellen. 3 00:00:11,150 --> 00:00:14,030 Recover is waarschijnlijk mijn favoriete PSET, en vooral omdat ik denk dat het 4 00:00:14,030 --> 00:00:15,650 echt, echt cool. 5 00:00:15,650 --> 00:00:19,040 In principe, je krijgt een herinnering kaartsysteem waarin 6 00:00:19,040 --> 00:00:20,900 foto's zijn verwijderd. 7 00:00:20,900 --> 00:00:23,650 Maar wat je gaat doen is ze allemaal te herstellen. 8 00:00:23,650 --> 00:00:24,250 >> OK. 9 00:00:24,250 --> 00:00:28,230 Dus het is echt spannend, maar misschien een beetje intimiderend, want je bent 10 00:00:28,230 --> 00:00:32,430 gegeven een lege C-bestand en je moet het vullen inch 11 00:00:32,430 --> 00:00:36,250 OK, dus laten we breken deze in beheersbare delen. 12 00:00:36,250 --> 00:00:38,160 U wilt openen geheugenkaart bestand. 13 00:00:38,160 --> 00:00:39,900 Dat lijkt eenvoudig genoeg. 14 00:00:39,900 --> 00:00:43,030 Vind dan het begin van een JPG-afbeelding. 15 00:00:43,030 --> 00:00:46,740 Alle bestanden op dit geheugen kaart gaan JPGs zijn. 16 00:00:46,740 --> 00:00:50,840 Dan, zodra je het begin, je gaat naar een nieuwe JPG openen, dat 17 00:00:50,840 --> 00:00:57,610 is, net als, maak een JPG, en schrijven 512 byte in een tijd totdat een nieuwe JPG is 18 00:00:57,610 --> 00:01:02,930 gevonden, en eindigt het programma eenmaal u het einde van het bestand detecteren. 19 00:01:02,930 --> 00:01:06,400 >> Dus eerste stappen eerste is om te openen de geheugenkaart bestand. 20 00:01:06,400 --> 00:01:09,850 Maar je weet dit al, en er is een file I / O-functie die gaat 21 00:01:09,850 --> 00:01:12,030 blijken zeer nuttig. 22 00:01:12,030 --> 00:01:12,820 OK. 23 00:01:12,820 --> 00:01:14,760 Dus wat zijn JPGs? 24 00:01:14,760 --> 00:01:16,330 Want we moeten het begin. 25 00:01:16,330 --> 00:01:21,310 Nou, JPG's, net als bitmaps, zijn sequenties van bytes. 26 00:01:21,310 --> 00:01:30,660 Gelukkig elke JPG begint met ofwel 0xFF, 0xd8, 0xFF, 0xe0, een sequentie 27 00:01:30,660 --> 00:01:33,610 bytes of andere reeks bytes. 28 00:01:33,610 --> 00:01:37,250 >> Dus die vier bytes aan te geven het begin van een JPG. 29 00:01:37,250 --> 00:01:40,780 Niemand minder dan die twee combinaties vier bytes. 30 00:01:40,780 --> 00:01:44,840 En gelukkig voor ons, een ander feit dat we kunnen profiteren van is dat elke 31 00:01:44,840 --> 00:01:48,550 JPG opgeslagen side-by-side op de geheugenkaart. 32 00:01:48,550 --> 00:01:52,210 Ik heb de structuur van een vertegenwoordigd geheugenkaart schematisch dit 33 00:01:52,210 --> 00:01:53,310 schuif hier. 34 00:01:53,310 --> 00:01:59,270 Hier, elke vierkante, elke rechthoek, vertegenwoordigt 512 bytes, en het begint 35 00:01:59,270 --> 00:02:01,750 met een grijze in dat we niet echt een JPG. 36 00:02:01,750 --> 00:02:05,700 >> Maar toen we eindelijk hit een blok met een ster. 37 00:02:05,700 --> 00:02:10,940 Dat betekent dat de eerste vier bytes uit van deze 512 zijn een van deze twee 38 00:02:10,940 --> 00:02:13,230 conferentie sequenties van JPG. 39 00:02:13,230 --> 00:02:17,340 En we gaan van daar, en dan een keer een JPG eindigt, het volgende spel begint. 40 00:02:17,340 --> 00:02:20,990 We hebben nooit meer hebben grijze ruimte ertussen. 41 00:02:20,990 --> 00:02:25,550 >> Maar hoe weten we eigenlijk dit leest, en Lees de 512 bytes, zodat we kunnen maken 42 00:02:25,550 --> 00:02:27,500 de vergelijking van de eerste plaats? 43 00:02:27,500 --> 00:02:33,470 Nou, laten we teruggaan naar fread, die neemt in de structuur die zal bevatten 44 00:02:33,470 --> 00:02:34,470 de bytes die u nu leest. 45 00:02:34,470 --> 00:02:36,570 Dus je gaat zetten die daar - 46 00:02:36,570 --> 00:02:42,192 de grootte, het aantal, en dan inpointer dat je leest uit. 47 00:02:42,192 --> 00:02:49,900 Nu willen we lezen 512 in een tijd, en wij willen dit op te slaan in een buffer, 48 00:02:49,900 --> 00:02:50,700 Ik ga noemen. 49 00:02:50,700 --> 00:02:54,100 >> Kortom, we gaan houden op die 512 bytes en doen 50 00:02:54,100 --> 00:02:55,500 dingen mee doen, toch? 51 00:02:55,500 --> 00:02:58,260 We ofwel gaat vergelijken met de eerste vier bytes, of we gaan 52 00:02:58,260 --> 00:02:59,830 las het in, OK? 53 00:02:59,830 --> 00:03:05,050 Dus dan is de data pointer zal dan dienen als uw buffer, en de 54 00:03:05,050 --> 00:03:07,745 inpointer, nou, dat zal alleen maar naar uw geheugenkaart zijn. 55 00:03:07,745 --> 00:03:09,500 >> Terug naar onze geheugenkaart schema. 56 00:03:09,500 --> 00:03:14,690 We gaan 512 bytes te lezen op een moment, het opslaan van elk 512-byte block 57 00:03:14,690 --> 00:03:19,190 in een buffer, vasthouden aan die buffer, die 512 bytes, totdat we weten 58 00:03:19,190 --> 00:03:22,000 precies wat ze doen. 59 00:03:22,000 --> 00:03:25,960 Dus het begin is niets, dus wij doen de buffer lezen, vergelijken en 60 00:03:25,960 --> 00:03:28,160 zullen we niet nodig om iets te doen. 61 00:03:28,160 --> 00:03:32,030 En dan hebben we eindelijk raakte een ster blokkeren, wat betekent dat we hebben 62 00:03:32,030 --> 00:03:33,630 vonden onze eerste JPG. 63 00:03:33,630 --> 00:03:36,560 Dus de buffer nu vasthouden bytes van die JPG. 64 00:03:36,560 --> 00:03:40,220 >> De volgende keer 512 bytes, omdat ze geen ster blok, zijn ook 65 00:03:40,220 --> 00:03:41,740 deel van die JPG. 66 00:03:41,740 --> 00:03:47,630 En JPG's zijn continu vanaf daar op in, totdat wij slaan de volgende JPG. 67 00:03:47,630 --> 00:03:51,880 En dan is de buffer houdt dan 512 bytes die JPG, en 68 00:03:51,880 --> 00:03:53,580 enzovoort, enzovoort. 69 00:03:53,580 --> 00:03:54,250 OK. 70 00:03:54,250 --> 00:03:58,980 >> Dus zodra je op de eerste ster blok, het eerste JPG, hoe doe je 71 00:03:58,980 --> 00:04:01,910 eigenlijk, goed, openen? 72 00:04:01,910 --> 00:04:04,990 Laten we een nieuwe JPG. 73 00:04:04,990 --> 00:04:08,846 De bestandsnamen voor een JPG gaan in het formaat, aantal, aantal, 74 00:04:08,846 --> 00:04:13,830 number.jpg, in dat ze de naam in de volgorde waarin ze worden gevonden, 75 00:04:13,830 --> 00:04:14,780 beginnend bij 0. 76 00:04:14,780 --> 00:04:19,890 >> Dus de eerste JPG dat u vinden zal 000.jpg. 77 00:04:19,890 --> 00:04:26,560 Dus, waarschijnlijk een goed idee om bij te houden hoeveel JPG's je tot nu toe hebt gevonden. 78 00:04:26,560 --> 00:04:27,610 Dus dat is de bestandsnaam. 79 00:04:27,610 --> 00:04:29,660 Maar hoe doe je dat eigenlijk maken dat? 80 00:04:29,660 --> 00:04:34,310 Nou, we gaan in een functie genaamd sprintf. 81 00:04:34,310 --> 00:04:38,260 Een beetje vergelijkbaar met printf, waar U kunt tijdelijke aanduidingen gebruiken voor strijkers, 82 00:04:38,260 --> 00:04:42,420 behalve in dit geval sprintf afgedrukt het bestand uit in de huidige 83 00:04:42,420 --> 00:04:45,550 directory, niet in de terminal. 84 00:04:45,550 --> 00:04:46,120 >> OK. 85 00:04:46,120 --> 00:04:49,950 Dus hier zien we dat we beschikken over een titel, een char array die zal slaan de 86 00:04:49,950 --> 00:04:55,120 resulterende tekenreeks, en we passeren in de titel in de string met een 87 00:04:55,120 --> 00:04:58,720 placeholder, net als we hebben geleerd te maken met printf. 88 00:04:58,720 --> 00:05:05,530 Maar deze code die ik hier zal 2.jpg, niet 002.jpg geven. 89 00:05:05,530 --> 00:05:09,920 Dus laat ik aan u om uit te vinden hoe te wijzigen van de tijdelijke aanduiding te maken de 90 00:05:09,920 --> 00:05:11,920 juiste naam. 91 00:05:11,920 --> 00:05:12,610 >> OK. 92 00:05:12,610 --> 00:05:17,390 Dus als je eenmaal hebt dan sprintf'd kunt u dat bestand te openen, omdat het bestaat in 93 00:05:17,390 --> 00:05:22,690 uw telefoonboek, met fopen, met behulp van de titel, en dan de modus waarin je wilt 94 00:05:22,690 --> 00:05:25,140 om dat bestand te openen in 95 00:05:25,140 --> 00:05:30,260 Dus nu dat we een nieuwe JPG-bestand hebt geopend, nu kunnen we 512 bytes schrijven op een 96 00:05:30,260 --> 00:05:33,320 tijd, totdat een nieuwe JPG wordt gevonden. 97 00:05:33,320 --> 00:05:36,640 Dus laten we nog eens kijken bij de syntaxis van fwrite. 98 00:05:36,640 --> 00:05:40,060 >> Ik weet dat Ik toon deze dia een veel, maar ik wil gewoon zeker weten dat 99 00:05:40,060 --> 00:05:43,530 jullie krijgen niet te verward, omdat Ik weet dat het heel gemakkelijk om 100 00:05:43,530 --> 00:05:47,000 Verwissel de eerste en de laatste argument name. 101 00:05:47,000 --> 00:05:54,390 Maar vergeet niet dat je aan het schrijven bent van uw buffer in de file afbeeldingen. 102 00:05:54,390 --> 00:05:59,250 >> Nu je weet hoe de afschrijving 512 bytes in je JPG-bestand dat u hebt 103 00:05:59,250 --> 00:06:03,230 gemaakt, goed, we willen stoppen met dat proces zodra we eind hebt bereikt 104 00:06:03,230 --> 00:06:06,720 onze card, omdat er geen meer foto's te vinden. 105 00:06:06,720 --> 00:06:10,760 Dus laten we teruggaan naar fread eens te meer, dat beloof ik. 106 00:06:10,760 --> 00:06:15,600 fread keert hoeveel items van grootte, grootte, waren klaar met succes. 107 00:06:15,600 --> 00:06:19,440 Idealiter is dit gaat worden wat passeer je in voor nummer, toch? 108 00:06:19,440 --> 00:06:24,140 Omdat je probeert om het aantal te lezen van elementen van omvang, grootte. 109 00:06:24,140 --> 00:06:29,380 Maar als fread niet kan lezen die aantal elementen, dan zal het terug 110 00:06:29,380 --> 00:06:32,530 welk nummer het succes lezen. 111 00:06:32,530 --> 00:06:36,310 >> Nu, een belangrijk ding om op te merken is dat als je een ander bestand gebruiken I / O 112 00:06:36,310 --> 00:06:43,860 functie als fgetc, het zal ook terugkeren hoeveel items die het met succes lezen. 113 00:06:43,860 --> 00:06:48,000 Wat is handig over deze functie dat als u functies binnen een 114 00:06:48,000 --> 00:06:53,190 staat, zal het zelf uit te voeren, terwijl bepalen deze voorwaarde, dat 115 00:06:53,190 --> 00:06:54,340 gewoon echt nuttig. 116 00:06:54,340 --> 00:07:00,440 Dus als je deze voorwaarden, laten we zeggen, indien fread buffer, sizeof DOG, 2, 117 00:07:00,440 --> 00:07:04,870 wijzer, gelijk is gelijk aan 1, dat betekent dat ik zou willen lezen 118 00:07:04,870 --> 00:07:06,540 2 honden tegelijkertijd. 119 00:07:06,540 --> 00:07:13,490 Maar als fread returns 1 in plaats van 2 zoals verwacht, dat betekent dat er 2 120 00:07:13,490 --> 00:07:16,480 honden achtergelaten in mijn dossier, maar eerder 1. 121 00:07:16,480 --> 00:07:22,450 Maar als het weer 2, dan heb ik nog steeds die 2 honden in mijn buffer. 122 00:07:22,450 --> 00:07:26,280 >> Dus nu dat geeft je een gevoel van hoe controleert het einde van het bestand, maar 123 00:07:26,280 --> 00:07:28,940 laten we gaan door nu de logica. 124 00:07:28,940 --> 00:07:32,460 Hoe weten we eigenlijk allemaal stuk van deze elementen bij elkaar? 125 00:07:32,460 --> 00:07:36,880 Zodra we raken onze eerste JPG, aangezien we weten dat JPGs zijn opgeslagen 126 00:07:36,880 --> 00:07:40,910 aansluitend, zullen we schrijven tot bereiken we het einde van het kaartsysteem. 127 00:07:40,910 --> 00:07:43,950 Maar we willen niet te schrijven alles wat tot dan toe. 128 00:07:43,950 --> 00:07:48,710 Dus het maakt niet alleen dat we bij het begin van een nieuwe JPG, maar of 129 00:07:48,710 --> 00:07:50,655 we hebben al gevonden een JPG-of niet. 130 00:07:50,655 --> 00:07:55,390 >> Als Het is het begin van een nieuwe JPG, zullen we willen onze huidige JPG bestand als sluiten 131 00:07:55,390 --> 00:07:59,110 we hebben een open en open een nieuwe te schrijven in. 132 00:07:59,110 --> 00:08:03,340 Als het niet het begin van het nieuwe JPG, niettemin, zullen wij het zelfde JPG bestand te houden 133 00:08:03,340 --> 00:08:05,910 openen en schrijven in dat. 134 00:08:05,910 --> 00:08:10,100 We zullen onze buffer in welk schrijven JPG bestand dat we hebben een open, op voorwaarde dat 135 00:08:10,100 --> 00:08:12,120 we hebben open, natuurlijk. 136 00:08:12,120 --> 00:08:16,190 Als we niet hebben gevonden onze eerste JPG toch hebben we niet iets schrijven. 137 00:08:16,190 --> 00:08:20,290 En dit proces gaat door totdat u bereiken het einde van het kaartsysteem. 138 00:08:20,290 --> 00:08:23,410 >> En ten slotte, zult u willen ervoor ervoor dat u alle FSluit 139 00:08:23,410 --> 00:08:25,800 bestanden die u hebt fopened. 140 00:08:25,800 --> 00:08:28,360 Zodra u vertrouwd bent met het bent concepten, neem een ​​kijkje bij enkele 141 00:08:28,360 --> 00:08:30,840 pseudocode, die ik hier heb opgenomen. 142 00:08:30,840 --> 00:08:34,830 Eerst moet je de kaart wilt openen, en herhaal het volgende proces 143 00:08:34,830 --> 00:08:37,144 totdat je hebt bereikt de uiteinde van de kaart. 144 00:08:37,144 --> 00:08:40,880 U wilt 512 bytes lezen in een buffer. 145 00:08:40,880 --> 00:08:43,934 Met behulp van die buffer, zult u wilt controleren of je nu aan het begin van een 146 00:08:43,934 --> 00:08:45,300 nieuwe JPG of niet. 147 00:08:45,300 --> 00:08:48,400 En het antwoord op die vraag zal invloed hebben op uw file management - 148 00:08:48,400 --> 00:08:51,940 welke bestanden u opent, welke die heb je dicht. 149 00:08:51,940 --> 00:08:55,220 >> Dan heb je al een JPG gevonden? 150 00:08:55,220 --> 00:08:57,740 Hoe heb je het houden spoor van dat? 151 00:08:57,740 --> 00:09:01,735 Vervolgens, afhankelijk van dat, zult u ofwel schrijven naar de huidige JPG dat u 152 00:09:01,735 --> 00:09:07,090 hebben geopend, of schrijf het niet helemaal, omdat u nog niet gevonden een JPG. 153 00:09:07,090 --> 00:09:10,870 Tot slot, als je eenmaal hebt het eind bereikt het bestand, wil je elke sluiten 154 00:09:10,870 --> 00:09:12,590 resterende bestanden die u hebt geopend. 155 00:09:12,590 --> 00:09:14,590 We willen hier netjes zijn. 156 00:09:14,590 --> 00:09:18,790 >> En daarmee heb je al hersteld de ontbrekende bestanden van dat geheugen 157 00:09:18,790 --> 00:09:21,620 kaart, die is een pretty amazing feat. 158 00:09:21,620 --> 00:09:23,430 Dus mag je jezelf op de rug. 159 00:09:23,430 --> 00:09:27,560 Maar, er is nog een element aan de PSET, dat is de wedstrijd. 160 00:09:27,560 --> 00:09:30,920 U zult merken dat u alle foto's dat u hersteld bent eigenlijk 161 00:09:30,920 --> 00:09:32,820 foto's van het personeel CS50's. 162 00:09:32,820 --> 00:09:38,500 Dus als je op de campus of ergens buurt, dan kunt u opnamen maken met 163 00:09:38,500 --> 00:09:42,600 het personeel, en de sectie die het heeft de meeste foto's met medewerkers 164 00:09:42,600 --> 00:09:46,940 uit hun herstelde bestanden zal Word een geweldige prijs. 165 00:09:46,940 --> 00:09:50,650 Met dat, dan ben je klaar bent het herstellen PSET. 166 00:09:50,650 --> 00:09:53,600 Mijn naam is Zamyla, en dit is CS50. 167 00:09:53,600 --> 00:10:01,835