1 00:00:00,000 --> 00:00:09,780 >> [MUSIC PLAYBACK] 2 00:00:09,780 --> 00:00:11,150 >> ZAMYLA CHAN: Poďme riešiť obnoviť. 3 00:00:11,150 --> 00:00:14,030 Obnovenie je asi moje najobľúbenejšie pset, a hlavne preto, že si myslím, že je to 4 00:00:14,030 --> 00:00:15,650 naozaj, naozaj cool. 5 00:00:15,650 --> 00:00:19,040 V podstate ste daný pamäť kartotéka, v ktorom 6 00:00:19,040 --> 00:00:20,900 obrázky boli odstránené. 7 00:00:20,900 --> 00:00:23,650 Ale to, čo budete urobiť, je obnoviť ich všetky. 8 00:00:23,650 --> 00:00:24,250 >> OK. 9 00:00:24,250 --> 00:00:28,230 Takže je to naozaj vzrušujúce, ale možno trochu zastrašujúce, pretože si 10 00:00:28,230 --> 00:00:32,430 vzhľadom k prázdnej C súbor a musíte ho vyplniť palcov 11 00:00:32,430 --> 00:00:36,250 OK, takže poďme rozbiť to do zvládnuteľných častí. 12 00:00:36,250 --> 00:00:38,160 Budete chcieť otvoriť súborov na pamäťovej karte. 13 00:00:38,160 --> 00:00:39,900 To sa zdá dosť jednoduché. 14 00:00:39,900 --> 00:00:43,030 Potom, nájsť začiatok z JPG obrázok. 15 00:00:43,030 --> 00:00:46,740 Všetky súbory z tejto pamäti Karta sa bude JPGs. 16 00:00:46,740 --> 00:00:50,840 Potom, čo nájdete na začiatok, sa chystáte otvoriť nové jpg, že 17 00:00:50,840 --> 00:00:57,610 je, rovnako ako vytvoriť jpg, a napísať 512 byte v čase, kým nová JPG je 18 00:00:57,610 --> 00:01:02,930 nájdené, a ukončenie programu, po zistíte koniec súboru. 19 00:01:02,930 --> 00:01:06,400 >> Takže prvé kroky Prvý z nich je otvoriť súborov na pamäťovej karte. 20 00:01:06,400 --> 00:01:09,850 Ale viete, to už, a tam je súbor I / O funkcie, ktorá sa bude 21 00:01:09,850 --> 00:01:12,030 ukázať ako veľmi užitočné. 22 00:01:12,030 --> 00:01:12,820 OK. 23 00:01:12,820 --> 00:01:14,760 Takže aké sú JPGs? 24 00:01:14,760 --> 00:01:16,330 Vzhľadom k tomu, že potrebujeme, aby na začiatku to. 25 00:01:16,330 --> 00:01:21,310 No, JPGs, rovnako ako bitové mapy, sú len sekvencie bajtov. 26 00:01:21,310 --> 00:01:30,660 Našťastie, každý JPG začína buď 0xFF, 0xd8, 0xFF, 0xE0, jedna sekvencia 27 00:01:30,660 --> 00:01:33,610 bytov, alebo iný postupnosť bajtov. 28 00:01:33,610 --> 00:01:37,250 >> Takže tie štyri bajty označujú začiatok JPG. 29 00:01:37,250 --> 00:01:40,780 Nikto iný ako tie dve kombinácie zo štyroch bajtov. 30 00:01:40,780 --> 00:01:44,840 A našťastie pre nás, iného skutočnosť, že sme môžu využiť je, že každý 31 00:01:44,840 --> 00:01:48,550 JPG je uložené vedľa seba na pamäťovej karte. 32 00:01:48,550 --> 00:01:52,210 Ja som reprezentoval štruktúru Pamäťová karta schematicky na to 33 00:01:52,210 --> 00:01:53,310 posuňte tu. 34 00:01:53,310 --> 00:01:59,270 Tu sa každý štvorcový, každý obdĺžnik, predstavuje 512 bytov, a to začína 35 00:01:59,270 --> 00:02:01,750 so sivou v tom, čo robíme, nie je mať naozaj jpg. 36 00:02:01,750 --> 00:02:05,700 >> Ale potom sme sa konečne hit blok s hviezdou. 37 00:02:05,700 --> 00:02:10,940 To znamená, že prvé štyri bajty z z tých 512 ar jeden z tých dvoch 38 00:02:10,940 --> 00:02:13,230 začína sekvencií a JPG. 39 00:02:13,230 --> 00:02:17,340 A pôjdeme tam, a potom ešte raz jeden JPG končí, ďalšie začína. 40 00:02:17,340 --> 00:02:20,990 Nemáme vôbec mať viac šedý priestor medzi nimi. 41 00:02:20,990 --> 00:02:25,550 >> Ale ako vlastne čítať to, a čítať 512 bajtov, takže môžeme 42 00:02:25,550 --> 00:02:27,500 Nákupný prvé miesto? 43 00:02:27,500 --> 00:02:33,470 Dobre, vráťme sa k fread, ktoré sa v struct, ktorý bude obsahovať 44 00:02:33,470 --> 00:02:34,470 bajtov, ktoré čítate. 45 00:02:34,470 --> 00:02:36,570 Takže sa chystáte dať ty tam - 46 00:02:36,570 --> 00:02:42,192 veľkosť, počet, a potom inpointer že čítate z 47 00:02:42,192 --> 00:02:49,900 Teraz chceme čítať 512 v čase, a chceme uložiť to v pamäti, 48 00:02:49,900 --> 00:02:50,700 Chystám sa to nazvať. 49 00:02:50,700 --> 00:02:54,100 >> V podstate, budeme držať na tých 512 bajtov, a to 50 00:02:54,100 --> 00:02:55,500 čo s ním, že jo? 51 00:02:55,500 --> 00:02:58,260 Sme buď bude porovnávať prvý štyri bajty, alebo budeme 52 00:02:58,260 --> 00:02:59,830 prečítajte si to v, OK? 53 00:02:59,830 --> 00:03:05,050 Takže ukazovateľ dáta budú potom slúži ako vyrovnávacia pamäť, a 54 00:03:05,050 --> 00:03:07,745 inpointer, dobre, že to len tak byť pamäťová karta. 55 00:03:07,745 --> 00:03:09,500 >> Späť k nášmu pamäťovú kartu schémy. 56 00:03:09,500 --> 00:03:14,690 Budeme čítať 512 bajtov v dobe, uloženie každej 512 bajtov blok 57 00:03:14,690 --> 00:03:19,190 do vyrovnávacej pamäti, drží na tých vyrovnávacej pamäti, tie 512 bajtov, kým nebudeme vedieť 58 00:03:19,190 --> 00:03:22,000 presne, čo robiť. 59 00:03:22,000 --> 00:03:25,960 Takže na začiatku nie je nič iné, tak budeme čítať vyrovnávacia pamäť, porovnať, a 60 00:03:25,960 --> 00:03:28,160 nebudeme musieť robiť nič s ním. 61 00:03:28,160 --> 00:03:32,030 A potom sme sa konečne trafil hviezdu blok, čo znamená, že máme 62 00:03:32,030 --> 00:03:33,630 našli prvý jpg. 63 00:03:33,630 --> 00:03:36,560 Takže vyrovnávacia teraz držať bajtov z tohto formátu JPG. 64 00:03:36,560 --> 00:03:40,220 >> Nabudúce 512 bajtov, pretože sú Nie je hviezda blok, sú tiež 65 00:03:40,220 --> 00:03:41,740 Súčasťou tohto formátu JPG. 66 00:03:41,740 --> 00:03:47,630 A JPGs sú spojité odtiaľ ďalej, až sme narazili na ďalšie jpg. 67 00:03:47,630 --> 00:03:51,880 A potom vyrovnávacia pamäť potom platí 512 bajtov pre tento JPG, a 68 00:03:51,880 --> 00:03:53,580 tak ďalej, a tak ďalej. 69 00:03:53,580 --> 00:03:54,250 OK. 70 00:03:54,250 --> 00:03:58,980 >> Takže akonáhle stlačíte prvou hviezdou blok, prvý JPG, ako si 71 00:03:58,980 --> 00:04:01,910 v skutočnosti, dobre, otvorte ju? 72 00:04:01,910 --> 00:04:04,990 Poďme si urobiť nový jpg. 73 00:04:04,990 --> 00:04:08,846 Názvy súborov pre JPG budú byť vo formáte, číslo, číslo, 74 00:04:08,846 --> 00:04:13,830 number.jpg, v tom, že oni sú uvedení v poradí, v ktorom sa nachádzajú, 75 00:04:13,830 --> 00:04:14,780 začína pri teplote 0 °. 76 00:04:14,780 --> 00:04:19,890 >> Takže prvý JPG, ktorý tu bude 000.jpg. 77 00:04:19,890 --> 00:04:26,560 Takže, asi dobrý nápad sledovať koľko JPGs si našiel tak ďaleko. 78 00:04:26,560 --> 00:04:27,610 Tak to je názov súboru. 79 00:04:27,610 --> 00:04:29,660 Ale ako si vlastne robiť, že? 80 00:04:29,660 --> 00:04:34,310 No, budeme používať funkcia s názvom sprintf. 81 00:04:34,310 --> 00:04:38,260 Trochu podobná printf, kde môžete použiť zástupné znaky pre sláčiky, 82 00:04:38,260 --> 00:04:42,420 výnimkou v tomto prípade, bude sprintf tlačiť súbor sa do prúdu 83 00:04:42,420 --> 00:04:45,550 adresára, nie do terminálu. 84 00:04:45,550 --> 00:04:46,120 >> OK. 85 00:04:46,120 --> 00:04:49,950 Takže tu vidíme, že máme titul, char pole, ktoré bude ukladať 86 00:04:49,950 --> 00:04:55,120 Výsledný reťazec, a míňame v názov aktuálneho reťazca s 87 00:04:55,120 --> 00:04:58,720 symbol, rovnako ako sme naučil robiť s printf. 88 00:04:58,720 --> 00:05:05,530 Ale tento kód, ktorý som tu dá 2.jpg, nie 002.jpg. 89 00:05:05,530 --> 00:05:09,920 Takže nechám na vás, aby ste zistili, ako sa zmeniť zástupný symbol, aby 90 00:05:09,920 --> 00:05:11,920 správny názov. 91 00:05:11,920 --> 00:05:12,610 >> OK. 92 00:05:12,610 --> 00:05:17,390 Takže akonáhle ste sprintf'd potom môžete tento súbor otvoriť, pretože existuje v 93 00:05:17,390 --> 00:05:22,690 adresár, s fopen, pomocou titul, a potom, čo režim chcete 94 00:05:22,690 --> 00:05:25,140 otvoriť tento súbor palcov 95 00:05:25,140 --> 00:05:30,260 Takže teraz, že sme otvorili novú JPG súboru, Teraz môžeme napísať 512 bajtov na 96 00:05:30,260 --> 00:05:33,320 čas, kým nie je nájdený nový JPG. 97 00:05:33,320 --> 00:05:36,640 Takže poďme sa ešte pozrieť v syntaxi fwrite. 98 00:05:36,640 --> 00:05:40,060 >> Viem, že som ukazovať túto priečok veľa, ale ja len chcem, aby sa ubezpečil, že 99 00:05:40,060 --> 00:05:43,530 vy nie príliš zmätený, pretože Viem, že je to veľmi jednoduché 100 00:05:43,530 --> 00:05:47,000 premiešať prvý a posledný Argument, najmä. 101 00:05:47,000 --> 00:05:54,390 Ale pamätajte, že píšete z Váš vyrovnávacej pamäte do von obrazu súborov. 102 00:05:54,390 --> 00:05:59,250 >> Teraz, keď viete, ako písať 512 bajty do JPG súboru, ktorý ste 103 00:05:59,250 --> 00:06:03,230 vytvorenie dobre, chceme zastaviť, že proces, akonáhle sme došli na koniec 104 00:06:03,230 --> 00:06:06,720 naše karty, pretože nebude žiadne ďalšie obrázky, ktoré majú byť nájdené. 105 00:06:06,720 --> 00:06:10,760 Takže poďme späť k fread ešte raz, sľubujem. 106 00:06:10,760 --> 00:06:15,600 fread vracia, koľko položiek veľkosti, veľkosť, boli pripravení úspešne. 107 00:06:15,600 --> 00:06:19,440 V ideálnom prípade to bude čokoľvek odovzdáte na číslo, nie? 108 00:06:19,440 --> 00:06:24,140 Vzhľadom k tomu, že sa snažíte čítať čísla prvkov o veľkosti, veľkosti. 109 00:06:24,140 --> 00:06:29,380 Ale ak fread nie je schopný čítať, že počet prvkov, potom sa vrátim 110 00:06:29,380 --> 00:06:32,530 bez ohľadu na počet úspešne čítať. 111 00:06:32,530 --> 00:06:36,310 >> Teraz jedna dôležitá vec k poznámke je že ak budete používať iný súbor I / O 112 00:06:36,310 --> 00:06:43,860 funkcie ako fgetc, bude to tiež vrátiť koľko položiek sa úspešne čítať. 113 00:06:43,860 --> 00:06:48,000 Čo je užitočné o tejto funkcii je že ak budete používať funkcie vnútri 114 00:06:48,000 --> 00:06:53,190 podmienka, bude to vykonávať sám, zatiaľ čo , Ktorým sa stanovuje, že podmienky, ktoré je 115 00:06:53,190 --> 00:06:54,340 len naozaj užitočné. 116 00:06:54,340 --> 00:07:00,440 Takže ak máte tento podmienok, povedzme, ak fread buffer, sizeof PES, 2, 117 00:07:00,440 --> 00:07:04,870 ukazovateľ, rovná sa rovná 1, že Znamená to, že by som chcel čítať 118 00:07:04,870 --> 00:07:06,540 2 psi v tej dobe. 119 00:07:06,540 --> 00:07:13,490 Ale ak fread vracia 1 miesto 2 ako Očakáva sa, to znamená, že tam sú 2 120 00:07:13,490 --> 00:07:16,480 psi opustil v mojom súbore, ale 1. 121 00:07:16,480 --> 00:07:22,450 Ale ak sa vráti 2, potom som ešte tieto dva psy vnútri mojej pamäti. 122 00:07:22,450 --> 00:07:26,280 >> Takže teraz, že vám dáva pocit, ako sa kontrola na koniec súboru, ale 123 00:07:26,280 --> 00:07:28,940 poďme prejsť teraz logiku. 124 00:07:28,940 --> 00:07:32,460 Ako sa vlastne poskladať všetky z týchto prvkov dohromady? 125 00:07:32,460 --> 00:07:36,880 Akonáhle sa dostaneme našu prvú jpg, pretože vieme, že JPGs sú uložené 126 00:07:36,880 --> 00:07:40,910 súvisle, budeme písať, kým dôjdeme na koniec súboru kariet. 127 00:07:40,910 --> 00:07:43,950 Ale my nechceme písať niečo do tej doby. 128 00:07:43,950 --> 00:07:48,710 Takže je to dôležité, a to nielen, že sme na Začiatok nového formátu JPG, ale to, či 129 00:07:48,710 --> 00:07:50,655 sme už našli jpg, alebo nie. 130 00:07:50,655 --> 00:07:55,390 >> Ak je to začiatok nového formátu JPG, budeme chcete ukončiť našu súčasnú JPG súbor, ak 131 00:07:55,390 --> 00:07:59,110 máme jeden otvorený a otvorené nová písať do. 132 00:07:59,110 --> 00:08:03,340 Ak to nie je začiatok novej JPG, keď budeme držať rovnaké JPG súbor 133 00:08:03,340 --> 00:08:05,910 otvoriť a napísať do toho. 134 00:08:05,910 --> 00:08:10,100 Budeme písať svoje vyrovnávacej pamäti do ktorejkoľvek Súbor JPG máme otvorené, za predpokladu, že 135 00:08:10,100 --> 00:08:12,120 máme jeden voľný, samozrejme. 136 00:08:12,120 --> 00:08:16,190 Ak sme nenašli náš prvý jpg Zatiaľ sme nepíšte nič. 137 00:08:16,190 --> 00:08:20,290 A tento proces pokračuje, kým dostanete na koniec súboru kariet. 138 00:08:20,290 --> 00:08:23,410 >> A konečne, budete chcieť, aby sa Uistite sa, že ste fclose akýkoľvek 139 00:08:23,410 --> 00:08:25,800 súbory, ktoré ste fopened. 140 00:08:25,800 --> 00:08:28,360 Akonáhle ste spokojní s koncepty, pozrite sa na niektoré 141 00:08:28,360 --> 00:08:30,840 pseudokódu, ktorý som tu zahrnuté. 142 00:08:30,840 --> 00:08:34,830 Po prvé, budete chcieť otvoriť súbor kariet, a potom opakujte nasledujúci postup 143 00:08:34,830 --> 00:08:37,144 kým ste dosiahli end karty. 144 00:08:37,144 --> 00:08:40,880 Ak chcete čítať 512 bajtov do vyrovnávacej pamäte. 145 00:08:40,880 --> 00:08:43,934 Pomocou tejto vyrovnávacej pamäti, budete chcieť skontrolovať, či už ste na začiatku 146 00:08:43,934 --> 00:08:45,300 nové JPG alebo nie. 147 00:08:45,300 --> 00:08:48,400 A odpoveď na túto otázku bude mať vplyv na správu súborov - 148 00:08:48,400 --> 00:08:51,940 súbory, ktoré ste otvorení, ktoré ty si zatvorte. 149 00:08:51,940 --> 00:08:55,220 >> Potom ste už našli jpg? 150 00:08:55,220 --> 00:08:57,740 Ako ste boli vedení stopa, že? 151 00:08:57,740 --> 00:09:01,735 Potom, v závislosti na tom, budete si musieť vybrať buď napísať do aktuálneho formátu JPG, ktorý 152 00:09:01,735 --> 00:09:07,090 majú otvorený, alebo nie písať to vôbec, pretože ste nenašli jpg ešte. 153 00:09:07,090 --> 00:09:10,870 Nakoniec, akonáhle ste dosiahli konca súbor, budete chcieť ukončiť akúkoľvek 154 00:09:10,870 --> 00:09:12,590 Zostávajúce súbory, ktoré máte otvorené. 155 00:09:12,590 --> 00:09:14,590 Chceme byť upratané tu. 156 00:09:14,590 --> 00:09:18,790 >> A s tým, že ste späť všetky chýbajúce súbory z tejto pamäti 157 00:09:18,790 --> 00:09:21,620 Karta, ktorá je docela úžasný výkon. 158 00:09:21,620 --> 00:09:23,430 Takže pat si na chrbát. 159 00:09:23,430 --> 00:09:27,560 Ale je tu ešte jeden prvok, pset, čo je súťaž. 160 00:09:27,560 --> 00:09:30,920 Zistíte, že všetky obrázky že ste späť, sú v skutočnosti 161 00:09:30,920 --> 00:09:32,820 obrázky zamestnancov CS50 je. 162 00:09:32,820 --> 00:09:38,500 Takže ak ste na akademickej pôde alebo niekde v blízkosti, potom môžete fotiť s 163 00:09:38,500 --> 00:09:42,600 zamestnancami, a časť, ktorá má väčšina obrázkov s pracovníkmi 164 00:09:42,600 --> 00:09:46,940 zo svojich získaných súbory získať úžasné ceny. 165 00:09:46,940 --> 00:09:50,650 S tým, potom ste skončil obnoviť pset. 166 00:09:50,650 --> 00:09:53,600 Volám sa Zamyla, a to je CS50. 167 00:09:53,600 --> 00:10:01,835