1 00:00:00,000 --> 00:00:09,780 >> [Redare a muzicii] 2 00:00:09,780 --> 00:00:11,150 >> ZAMYLA CHAN: Să aborda recupera. 3 00:00:11,150 --> 00:00:14,030 Recuperarea este, probabil, PSET meu preferat, și, în principal pentru că eu cred că este 4 00:00:14,030 --> 00:00:15,650 foarte, foarte misto. 5 00:00:15,650 --> 00:00:19,040 Practic, esti dat o memorie fișier carte în care 6 00:00:19,040 --> 00:00:20,900 imagini au fost șterse. 7 00:00:20,900 --> 00:00:23,650 Dar ceea ce ai de gând să faceți este să le recupereze. 8 00:00:23,650 --> 00:00:24,250 >> OK. 9 00:00:24,250 --> 00:00:28,230 Deci, este foarte interesant, dar poate o puțin intimidant, pentru că ești 10 00:00:28,230 --> 00:00:32,430 dat un fișier C gol și va trebui să-l umple inch 11 00:00:32,430 --> 00:00:36,250 OK, asa ca hai sa rupe acest în părți ușor de gestionat. 12 00:00:36,250 --> 00:00:38,160 Veți dori să deschideți fișier card de memorie. 13 00:00:38,160 --> 00:00:39,900 Asta pare destul de simplu. 14 00:00:39,900 --> 00:00:43,030 Apoi, găsiți la început a unei imagini JPG. 15 00:00:43,030 --> 00:00:46,740 Toate fișierele de pe aceasta memorie carte vor fi jpgs. 16 00:00:46,740 --> 00:00:50,840 Apoi, odată ce ați găsi la început, ai de gând să deschidă un nou JPG, care 17 00:00:50,840 --> 00:00:57,610 este, cum ar fi, de a crea un JPG, și scrie 512 octet la un moment dat până când un nou JPG este 18 00:00:57,610 --> 00:01:02,930 găsit, și se încheie programul, odată vă detecta sfârșitul fișierului. 19 00:01:02,930 --> 00:01:06,400 >> Astfel primii pași în primul rând este de a deschide fișierul card de memorie. 20 00:01:06,400 --> 00:01:09,850 Dar știți deja acest lucru, și nu e o funcție de fișier I / O care va 21 00:01:09,850 --> 00:01:12,030 dovedi foarte util. 22 00:01:12,030 --> 00:01:12,820 OK. 23 00:01:12,820 --> 00:01:14,760 Deci, ce sunt JPGs? 24 00:01:14,760 --> 00:01:16,330 Pentru că avem nevoie de la început ea. 25 00:01:16,330 --> 00:01:21,310 Ei bine, jpgs, la fel ca și hărți de biți, sunt doar secvențe de bytes. 26 00:01:21,310 --> 00:01:30,660 Din fericire, fiecare JPG începe cu, fie 0xff, 0xd8, 0xff, 0xE0, o secvență 27 00:01:30,660 --> 00:01:33,610 de octeți, sau un alt secvență de octeți. 28 00:01:33,610 --> 00:01:37,250 >> Deci, cele patru octeți indică începutul unui JPG. 29 00:01:37,250 --> 00:01:40,780 Nimeni altul decât cele două combinații de patru octeți. 30 00:01:40,780 --> 00:01:44,840 Și din fericire pentru noi, un alt fapt care ne-am pot profita de este că fiecare 31 00:01:44,840 --> 00:01:48,550 JPG este stocat-side-by-side de pe cardul de memorie. 32 00:01:48,550 --> 00:01:52,210 Am reprezentat structura unei card de memorie schematic în acest 33 00:01:52,210 --> 00:01:53,310 glisați aici. 34 00:01:53,310 --> 00:01:59,270 Aici, fiecare pătrat, fiecare dreptunghi, reprezintă de 512 bytes, și de a începe 35 00:01:59,270 --> 00:02:01,750 cu un gri, în care noi nu facem au într-adevăr un JPG. 36 00:02:01,750 --> 00:02:05,700 >> Dar apoi ne-am lovit în cele din urmă un bloc cu o stea. 37 00:02:05,700 --> 00:02:10,940 Asta înseamnă că primele patru octeți out din cei 512 sunt unul dintre cei doi 38 00:02:10,940 --> 00:02:13,230 începând cu secvențe de un JPG. 39 00:02:13,230 --> 00:02:17,340 Și vom merge de acolo, și apoi o dată unul JPG se termină, începe următoarea. 40 00:02:17,340 --> 00:02:20,990 Noi nu mai avea vreodată spațiu gri în între-. 41 00:02:20,990 --> 00:02:25,550 >> Dar cum am citit de fapt acest lucru, și citiți 512 de bytes, astfel încât să putem face 42 00:02:25,550 --> 00:02:27,500 comparația în primul rând? 43 00:02:27,500 --> 00:02:33,470 Ei bine, să ne întoarcem la fread, care ia în struct care va conține 44 00:02:33,470 --> 00:02:34,470 bytes pe care sunteți de lectură. 45 00:02:34,470 --> 00:02:36,570 Deci, ai de gând să pună cei de acolo - 46 00:02:36,570 --> 00:02:42,192 dimensiunea, numărul, și apoi inpointer că sunteți de lectură de la. 47 00:02:42,192 --> 00:02:49,900 Acum, vrem să citească 512 la un moment dat, și ne-o dorim pentru a stoca acest lucru într-un tampon, 48 00:02:49,900 --> 00:02:50,700 Am de gând să-l numesc. 49 00:02:50,700 --> 00:02:54,100 >> Practic, am de gând să dețină pe aceste 512 octeți și face 50 00:02:54,100 --> 00:02:55,500 lucruri cu ea, nu? 51 00:02:55,500 --> 00:02:58,260 Vom fie de gând să compare primul patru bytes, sau vom 52 00:02:58,260 --> 00:02:59,830 citit-o în, OK? 53 00:02:59,830 --> 00:03:05,050 Deci, atunci indicatorul de date va fi atunci servi drept tampon ta, și 54 00:03:05,050 --> 00:03:07,745 inpointer, bine, care este doar de gând pentru a fi cardul de memorie. 55 00:03:07,745 --> 00:03:09,500 >> Înapoi la schematic nostru card de memorie. 56 00:03:09,500 --> 00:03:14,690 Vom citi 512 octeți la un moment dat, stocarea fiecare bloc de 512 octeți 57 00:03:14,690 --> 00:03:19,190 într-un tampon, care deține pe cei tampon, aceste 512 de bytes, până nu știm 58 00:03:19,190 --> 00:03:22,000 exact ce să le facă. 59 00:03:22,000 --> 00:03:25,960 Deci, la început, nu este nimic, așa vom citi tampon, compara-l, și 60 00:03:25,960 --> 00:03:28,160 nu vom avea nevoie pentru a face ceva cu ea. 61 00:03:28,160 --> 00:03:32,030 Și apoi, ne-am lovit în cele din urmă o stea bloca, ceea ce înseamnă că ne-am 62 00:03:32,030 --> 00:03:33,630 a găsit primul nostru JPG. 63 00:03:33,630 --> 00:03:36,560 Deci tampon acum deține bytes din care JPG. 64 00:03:36,560 --> 00:03:40,220 >> Data viitoare 512 bytes, deoarece acestea sunt nu un bloc de stea, sunt, de asemenea, 65 00:03:40,220 --> 00:03:41,740 o parte din care JPG. 66 00:03:41,740 --> 00:03:47,630 Și jpgs sunt continuu de acolo pe la, până când ne-am lovit la următoarea JPG. 67 00:03:47,630 --> 00:03:51,880 Și apoi tamponul are atunci 512 octeți pentru că JPG, și 68 00:03:51,880 --> 00:03:53,580 așa mai departe, și așa mai departe. 69 00:03:53,580 --> 00:03:54,250 OK. 70 00:03:54,250 --> 00:03:58,980 >> Deci, odată ce te-a lovit primul a jucat bloc, primul JPG, cum a face tu 71 00:03:58,980 --> 00:04:01,910 de fapt, ei bine, se deschide? 72 00:04:01,910 --> 00:04:04,990 Să facem un nou JPG. 73 00:04:04,990 --> 00:04:08,846 Numele fisierelor de un JPG sunt de gând să să fie în formatul, numărul, numărul, 74 00:04:08,846 --> 00:04:13,830 number.jpg, în care acestea sunt numit în ordinea în care se găsesc, 75 00:04:13,830 --> 00:04:14,780 incepand de la 0. 76 00:04:14,780 --> 00:04:19,890 >> Deci, primul JPG vă că găsi va fi 000.jpg. 77 00:04:19,890 --> 00:04:26,560 Deci, probabil, o idee bună pentru a ține evidența de câte JPGs ați găsit până acum. 78 00:04:26,560 --> 00:04:27,610 Deci, asta e numele fișierului. 79 00:04:27,610 --> 00:04:29,660 Dar cum a face tu a face de fapt asta? 80 00:04:29,660 --> 00:04:34,310 Ei bine, am de gând să utilizeze un Funcția numit sprintf. 81 00:04:34,310 --> 00:04:38,260 Un pic similar cu printf, în cazul în care aveți posibilitatea să utilizați substituenți pentru siruri de caractere, 82 00:04:38,260 --> 00:04:42,420 cu excepția cazului în acest caz, sprintf va imprima fișierul afară, în curentul 83 00:04:42,420 --> 00:04:45,550 director, nu în terminal. 84 00:04:45,550 --> 00:04:46,120 >> OK. 85 00:04:46,120 --> 00:04:49,950 Deci, aici vom vedea că avem titlu, o matrice char care va stoca 86 00:04:49,950 --> 00:04:55,120 șir rezultat, și vom trece în titlu din șirul actual cu un 87 00:04:55,120 --> 00:04:58,720 substituent, la fel ca ne-am învățat să fac cu printf. 88 00:04:58,720 --> 00:05:05,530 Dar acest cod pe care o am aici va da 2.jpg, nu 002.jpg. 89 00:05:05,530 --> 00:05:09,920 Deci, voi lăsa să te pentru a afla cum de a modifica substituentul pentru a face 90 00:05:09,920 --> 00:05:11,920 Numele corect. 91 00:05:11,920 --> 00:05:12,610 >> OK. 92 00:05:12,610 --> 00:05:17,390 Deci, odată ce ați sprintf'd atunci puteți deschide acest dosar, pentru că există în 93 00:05:17,390 --> 00:05:22,690 directorul, cu fopen, folosind titlu, și apoi orice mod doriți 94 00:05:22,690 --> 00:05:25,140 pentru a deschide acel fișier inch 95 00:05:25,140 --> 00:05:30,260 Deci, acum că ne-am deschis un nou fișier JPG, acum putem scrie 512 biti la un 96 00:05:30,260 --> 00:05:33,320 timp, până când se găsește un nou JPG. 97 00:05:33,320 --> 00:05:36,640 Deci, haideți să aruncăm o privire la sintaxa de fwrite. 98 00:05:36,640 --> 00:05:40,060 >> Știu că arăt acest slide o lot, dar eu vreau doar să vă asigurați că 99 00:05:40,060 --> 00:05:43,530 voi nu te prea confuz, pentru că Știu că este foarte ușor de 100 00:05:43,530 --> 00:05:47,000 amesteca primul și ultimul argument, în special. 101 00:05:47,000 --> 00:05:54,390 Dar amintiți-vă că sunteți scris de la buffer-ul în imaginile de fișiere afara. 102 00:05:54,390 --> 00:05:59,250 >> Acum, că știți cum scrie 512 octeți în fișier JPG pe care le-ați 103 00:05:59,250 --> 00:06:03,230 a creat, de asemenea, dorim să oprim proces odată ce am ajuns la sfârșitul 104 00:06:03,230 --> 00:06:06,720 cartea noastra, deoarece nu va fi orice mai multe imagini pentru a fi găsit. 105 00:06:06,720 --> 00:06:10,760 Așa că haideți să ne întoarcem la fread o dată mai mult, promit. 106 00:06:10,760 --> 00:06:15,600 fread întoarce cât de multe elemente de dimensiuni, dimensiune, au fost gata în succes. 107 00:06:15,600 --> 00:06:19,440 În mod ideal, acest lucru va fi, indiferent de treci în număr de, corect? 108 00:06:19,440 --> 00:06:24,140 Pentru că sunteți încercarea de a citi număr de elemente de mărime, dimensiune. 109 00:06:24,140 --> 00:06:29,380 Dar dacă fread nu este capabil să citească că număr de elemente, atunci va returna 110 00:06:29,380 --> 00:06:32,530 indiferent de numărul citit-o cu succes. 111 00:06:32,530 --> 00:06:36,310 >> Acum, un lucru important de reținut este că, dacă utilizați un alt fișier I / O 112 00:06:36,310 --> 00:06:43,860 funcție ca fgetc, va reveni, de asemenea, cât de multe elemente citit-o cu succes. 113 00:06:43,860 --> 00:06:48,000 Ce-i utile despre această funcție este că, dacă utilizați funcții în interiorul unei 114 00:06:48,000 --> 00:06:53,190 condiție, se va executa în timp ce a determina această condiție, care este 115 00:06:53,190 --> 00:06:54,340 doar într-adevăr util. 116 00:06:54,340 --> 00:07:00,440 Deci, dacă aveți aceste condiții, să zicem, dacă tampon fread, DOG sizeof, 2, 117 00:07:00,440 --> 00:07:04,870 pointer, egal este egal cu 1, care înseamnă că mi-ar place să citesc 118 00:07:04,870 --> 00:07:06,540 2 câini la momentul. 119 00:07:06,540 --> 00:07:13,490 Dar dacă fread returnează 1 în loc de 2 ca așteptat, ceea ce înseamnă că există 2 120 00:07:13,490 --> 00:07:16,480 câini plecat în dosarul meu, ci mai degrabă 1. 121 00:07:16,480 --> 00:07:22,450 Dar dacă se întoarce 2, atunci mai am aceste 2 câini din interiorul tampon mea. 122 00:07:22,450 --> 00:07:26,280 >> Deci, acum, care vă oferă un sentiment de modul în care a verifica pentru sfârșitul fișierului, dar 123 00:07:26,280 --> 00:07:28,940 Să mergem acum prin logica. 124 00:07:28,940 --> 00:07:32,460 Cum ne-am pune cap de fapt, toate dintre aceste elemente împreună? 125 00:07:32,460 --> 00:07:36,880 După ce ne-am lovit prima JPG, deoarece știm că JPGs sunt stocate 126 00:07:36,880 --> 00:07:40,910 adiacent, vom fi scris până vom ajunge la sfârșitul fișierului cardului. 127 00:07:40,910 --> 00:07:43,950 Dar nu vrem să scrie nimic până atunci. 128 00:07:43,950 --> 00:07:48,710 Deci, nu contează, nu numai că suntem la începutul unui nou JPG, ci dacă 129 00:07:48,710 --> 00:07:50,655 am găsit deja un JPG sau nu. 130 00:07:50,655 --> 00:07:55,390 >> Dacă Este începutul unui nou JPG, vom Vreau să închidă dosarul nostru JPG curent dacă 131 00:07:55,390 --> 00:07:59,110 avem un deschis, și deschis un nou o pentru a scrie în. 132 00:07:59,110 --> 00:08:03,340 În cazul în care nu este începutul unui nou JPG, deși, vom păstra același fișier JPG 133 00:08:03,340 --> 00:08:05,910 deschidă și să scrie în asta. 134 00:08:05,910 --> 00:08:10,100 Vom scrie tampon noastră în funcție de Fișier JPG ne-am deschis, cu condiția ca 135 00:08:10,100 --> 00:08:12,120 avem unul deschis, desigur. 136 00:08:12,120 --> 00:08:16,190 Dacă nu ne-am găsit primul nostru JPG cu toate acestea, noi nu scriu nimic. 137 00:08:16,190 --> 00:08:20,290 Și acest proces va continua până când ajunge la sfârșitul fișierului cardului. 138 00:08:20,290 --> 00:08:23,410 >> Și, în sfârșit, veți dori să facă vă că fclose orice 139 00:08:23,410 --> 00:08:25,800 fișierele pe care le-ați fopened. 140 00:08:25,800 --> 00:08:28,360 După ce te confortabil cu concepte, să ia o privire la unele 141 00:08:28,360 --> 00:08:30,840 pseudocod, pe care le-am inclus aici. 142 00:08:30,840 --> 00:08:34,830 În primul rând, doriți să deschideți fișierul de carte, și apoi repetați procesul următor 143 00:08:34,830 --> 00:08:37,144 până când ați ajuns la capăt al cardului. 144 00:08:37,144 --> 00:08:40,880 Doriți să citiți 512 octeți într-un buffer. 145 00:08:40,880 --> 00:08:43,934 Folosind ca tampon, veți dori să verificați chiar daca esti la inceputul unei 146 00:08:43,934 --> 00:08:45,300 noi JPG sau nu. 147 00:08:45,300 --> 00:08:48,400 Și răspunsul la această întrebare va afecta management de fișiere - 148 00:08:48,400 --> 00:08:51,940 care fișierele pe care le deschide, care cei ai închide. 149 00:08:51,940 --> 00:08:55,220 >> Apoi, ați găsit deja un JPG? 150 00:08:55,220 --> 00:08:57,740 Cum ați fost păstrarea piesa de asta? 151 00:08:57,740 --> 00:09:01,735 Apoi, în funcție de care, veți fie scrie în JPG curent pe care îl 152 00:09:01,735 --> 00:09:07,090 au deschis, sau nu scrie deloc, pentru că nu au găsit un JPG încă. 153 00:09:07,090 --> 00:09:10,870 În cele din urmă, odată ce ați ajuns la sfârșitul fișierul, veți dori să închidă orice 154 00:09:10,870 --> 00:09:12,590 fișierele pe care le au rămas deschise. 155 00:09:12,590 --> 00:09:14,590 Vrem să fie curat aici. 156 00:09:14,590 --> 00:09:18,790 >> Și cu asta, te-ai recuperat toate fișierele lipsă din acea memorie 157 00:09:18,790 --> 00:09:21,620 carte, care este un feat destul de uimitor. 158 00:09:21,620 --> 00:09:23,430 Deci, bate-te pe spate. 159 00:09:23,430 --> 00:09:27,560 Dar, există un element mai mult de PSET, care este concursul. 160 00:09:27,560 --> 00:09:30,920 Veți găsi că toate imaginile care le-am recuperat sunt de fapt 161 00:09:30,920 --> 00:09:32,820 poze ale personalului CS50 lui. 162 00:09:32,820 --> 00:09:38,500 Deci, dacă sunteți în campus sau undeva în apropiere, atunci aveți posibilitatea să faceți fotografii cu 163 00:09:38,500 --> 00:09:42,600 personal, și secțiunea care are cele mai multe fotografii cu membri ai personalului 164 00:09:42,600 --> 00:09:46,940 din fișierele lor recuperate vor obține un premiu minunat. 165 00:09:46,940 --> 00:09:50,650 Cu care, atunci ați terminat recupera PSET. 166 00:09:50,650 --> 00:09:53,600 Numele meu este Zamyla, iar acest lucru este CS50. 167 00:09:53,600 --> 00:10:01,835