1 00:00:00,000 --> 00:00:09,780 >> [REPRODUCCIÓ DE MÚSICA] 2 00:00:09,780 --> 00:00:11,150 >> ZAMYLA CHAN: Anem a tractar de recuperar-se. 3 00:00:11,150 --> 00:00:14,030 Recover és probablement la meva favorita PSET, i sobretot perquè crec que és 4 00:00:14,030 --> 00:00:15,650 molt, molt cool. 5 00:00:15,650 --> 00:00:19,040 Bàsicament, et donen una memòria arxius de la targeta en què 6 00:00:19,040 --> 00:00:20,900 s'han eliminat les imatges. 7 00:00:20,900 --> 00:00:23,650 Però, què vas a fer és recuperar tots ells. 8 00:00:23,650 --> 00:00:24,250 >> D'acord. 9 00:00:24,250 --> 00:00:28,230 Així que és realment emocionant, però potser un mica intimidatori, perquè ets 10 00:00:28,230 --> 00:00:32,430 donat un arxiu C buida i vostè ha de omplir polz 11 00:00:32,430 --> 00:00:36,250 OK, així que anem a trencar aquest en parts manejables. 12 00:00:36,250 --> 00:00:38,160 Vostè voldrà obrir el arxiu de la targeta de memòria. 13 00:00:38,160 --> 00:00:39,900 Això sembla bastant simple. 14 00:00:39,900 --> 00:00:43,030 A continuació, cerqueu el principi d'una imatge JPG. 15 00:00:43,030 --> 00:00:46,740 Tots els arxius d'aquesta memòria targetes seran arxius JPG. 16 00:00:46,740 --> 00:00:50,840 Després, una vegada que trobi el principi, vostè va a obrir una nova JPG, que 17 00:00:50,840 --> 00:00:57,610 està, com, crear un arxiu JPG, i escriure 512 byte a la vegada fins que un nou JPG és 18 00:00:57,610 --> 00:01:02,930 trobat, i que acaba el programa, un cop detecta el final de l'arxiu. 19 00:01:02,930 --> 00:01:06,400 >> Així que els primers passos primer és obrir l'arxiu de la targeta de memòria. 20 00:01:06,400 --> 00:01:09,850 Però vostè ja sap això, i no hi ha una funció d'E / S d'arxiu que va a 21 00:01:09,850 --> 00:01:12,030 resultar molt útil. 22 00:01:12,030 --> 00:01:12,820 D'acord. 23 00:01:12,820 --> 00:01:14,760 Quins són arxius JPG? 24 00:01:14,760 --> 00:01:16,330 Perquè necessitem un principi. 25 00:01:16,330 --> 00:01:21,310 Bé, arxius JPG, igual que els mapes de bits, són només les seqüències de bytes. 26 00:01:21,310 --> 00:01:30,660 Per sort, cada JPG comença amb qualsevol 0xFF, 0xd8, 0xFF, 0xe0, una seqüència 27 00:01:30,660 --> 00:01:33,610 de bytes, o una altra seqüència de bytes. 28 00:01:33,610 --> 00:01:37,250 >> Així que els quatre bytes indiquen l'inici d'un arxiu JPG. 29 00:01:37,250 --> 00:01:40,780 Ni més ni menys que aquestes dues combinacions de quatre bytes. 30 00:01:40,780 --> 00:01:44,840 I per sort per a nosaltres, un altre fet que ens poden aprofitar és que cada 31 00:01:44,840 --> 00:01:48,550 JPG s'emmagatzema de banda a banda a la targeta de memòria. 32 00:01:48,550 --> 00:01:52,210 He representat a l'estructura d'un targeta de memòria esquemàticament en aquesta 33 00:01:52,210 --> 00:01:53,310 llisqui aquí. 34 00:01:53,310 --> 00:01:59,270 Aquí, cada plaça, cada rectangle, representa 512 bytes, i s'inicia 35 00:01:59,270 --> 00:02:01,750 amb un color gris en el qual nosaltres no realment tenen un JPG. 36 00:02:01,750 --> 00:02:05,700 >> Però llavors ens colpegem un bloc amb una estrella. 37 00:02:05,700 --> 00:02:10,940 Això significa que els primers quatre bytes fora dels quals 512 són un dels dos 38 00:02:10,940 --> 00:02:13,230 a partir de seqüències d'un arxiu JPG. 39 00:02:13,230 --> 00:02:17,340 I anem a partir d'allí, i després un cop 01:00 JPG acaba, comença el següent. 40 00:02:17,340 --> 00:02:20,990 Nosaltres no sempre tenim més espai gris en el medi. 41 00:02:20,990 --> 00:02:25,550 >> Però, com podem llegir això, i llegir els 512 bytes de manera que puguem fer 42 00:02:25,550 --> 00:02:27,500 la comparació el primer lloc? 43 00:02:27,500 --> 00:02:33,470 Bé, tornem a fread, que pren en l'estructura que contindrà 44 00:02:33,470 --> 00:02:34,470 els bytes que vostè està llegint. 45 00:02:34,470 --> 00:02:36,570 Així que vas a posar els d'allà - 46 00:02:36,570 --> 00:02:42,192 la mida, el nombre i, a continuació, inpointer que vostè està llegint. 47 00:02:42,192 --> 00:02:49,900 Ara, volem llegir 512 alhora, i volem guardar això en un buffer, 48 00:02:49,900 --> 00:02:50,700 Vaig a dir-. 49 00:02:50,700 --> 00:02:54,100 >> Bàsicament, anem a celebrar en aquests 512 bytes i fer 50 00:02:54,100 --> 00:02:55,500 coses amb ella, oi? 51 00:02:55,500 --> 00:02:58,260 O bé anem a comparar la primera 04:00 bytes, o anem a 52 00:02:58,260 --> 00:02:59,830 llegir-lo en, OK? 53 00:02:59,830 --> 00:03:05,050 Amb això, el punter de dades serà llavors servirà com buffer, i la 54 00:03:05,050 --> 00:03:07,745 inpointer, bé, això només va per ser la targeta de memòria. 55 00:03:07,745 --> 00:03:09,500 >> De tornada al nostre esquema de targeta de memòria. 56 00:03:09,500 --> 00:03:14,690 Anem a llegir 512 bytes alhora, emmagatzematge de cada bloc de 512 bytes 57 00:03:14,690 --> 00:03:19,190 en un memòria intermèdia, la celebració en els esmorteir, els 512 bytes, fins que sapiguem 58 00:03:19,190 --> 00:03:22,000 exactament què fer ells. 59 00:03:22,000 --> 00:03:25,960 Així que al principi no és res, així anem a llegir el buffer, comparem, i 60 00:03:25,960 --> 00:03:28,160 no haurem de fer alguna cosa amb ella. 61 00:03:28,160 --> 00:03:32,030 I llavors, per fi colpegem un estel bloc, el que significa que hem 62 00:03:32,030 --> 00:03:33,630 trobat la nostra primera JPG. 63 00:03:33,630 --> 00:03:36,560 Així el tampó ara tenen bytes d'aquesta JPG. 64 00:03:36,560 --> 00:03:40,220 >> La propera vegada que 512 bytes, perquè són no és un bloc de l'estrella, són també 65 00:03:40,220 --> 00:03:41,740 part d'aquest JPG. 66 00:03:41,740 --> 00:03:47,630 I els arxius JPG són contínues des d'allà des d'ara, fins que arribem a la següent JPG. 67 00:03:47,630 --> 00:03:51,880 I a continuació, el tampó manté llavors 512 bytes perquè JPG, i 68 00:03:51,880 --> 00:03:53,580 així successivament, i així successivament. 69 00:03:53,580 --> 00:03:54,250 D'acord. 70 00:03:54,250 --> 00:03:58,980 >> Així que una vegada que es prem el primer estrellat bloc, la primera JPG, com 71 00:03:58,980 --> 00:04:01,910 en realitat, bé, obrir-lo? 72 00:04:01,910 --> 00:04:04,990 Anem a fer un nou JPG. 73 00:04:04,990 --> 00:04:08,846 Els noms d'arxiu per a un arxiu JPG van a estar en el format, nombre, nombre, 74 00:04:08,846 --> 00:04:13,830 number.jpg, en què estan nomenats en l'ordre en què es troben, 75 00:04:13,830 --> 00:04:14,780 a partir de 0. 76 00:04:14,780 --> 00:04:19,890 >> Així que el primer que vostè JPG trobar seran 000.jpg. 77 00:04:19,890 --> 00:04:26,560 Per tant, probablement és una bona idea per portar un registre de quants arxius JPG has trobat fins ara. 78 00:04:26,560 --> 00:04:27,610 Així que aquest és el nom del fitxer. 79 00:04:27,610 --> 00:04:29,660 Però, com realment fer això? 80 00:04:29,660 --> 00:04:34,310 Bé, anem a utilitzar una funció sprintf flama. 81 00:04:34,310 --> 00:04:38,260 Una mica similar a printf, on pot utilitzar marcadors de posició per a les cadenes, 82 00:04:38,260 --> 00:04:42,420 excepte en aquest cas, sprintf imprimirà l'arxiu de sortida en el corrent 83 00:04:42,420 --> 00:04:45,550 directori, no en el terminal. 84 00:04:45,550 --> 00:04:46,120 >> D'acord. 85 00:04:46,120 --> 00:04:49,950 Així que aquí veiem que tenim el títol, una matriu de caràcters que emmagatzemarà la 86 00:04:49,950 --> 00:04:55,120 cadena resultant, i que passem a l' Títol de la cadena real amb un 87 00:04:55,120 --> 00:04:58,720 marcador de posició, igual que hem après a veure amb printf. 88 00:04:58,720 --> 00:05:05,530 Però el codi que tinc aquí donarà 2.jpg, no 002.jpg. 89 00:05:05,530 --> 00:05:09,920 Així que vaig a deixar a vostè per esbrinar com modificar el marcador de posició perquè el 90 00:05:09,920 --> 00:05:11,920 nom correcte. 91 00:05:11,920 --> 00:05:12,610 >> D'acord. 92 00:05:12,610 --> 00:05:17,390 Així que una vegada que has sprintf'd llavors es pot obrir aquest arxiu, perquè existeix en 93 00:05:17,390 --> 00:05:22,690 seu directori, amb fopen, utilitzant la títol, i després el que sigui la manera que desitja 94 00:05:22,690 --> 00:05:25,140 per obrir aquest arxiu polz 95 00:05:25,140 --> 00:05:30,260 Així que ara que hem obert un nou arxiu JPG, Ara podem escriure 512 bytes en una 96 00:05:30,260 --> 00:05:33,320 temps, fins que es trobi un nou JPG. 97 00:05:33,320 --> 00:05:36,640 Així que anem a fer un altre cop d'ull en la sintaxi de fwrite. 98 00:05:36,640 --> 00:05:40,060 >> Sé que estic mostrant aquesta diapositiva 1 molt, però jo només vull assegurar-me que 99 00:05:40,060 --> 00:05:43,530 vostès no es posen massa confús, perquè Sé que és molt fàcil d' 100 00:05:43,530 --> 00:05:47,000 barrejar la primera i l'última argument, en particular. 101 00:05:47,000 --> 00:05:54,390 Però recordeu que vostè està escrivint des la memòria intermèdia en les imatges d'arxiu de sortida. 102 00:05:54,390 --> 00:05:59,250 >> Ara que ja sap com el d'escriptura 512 bytes al fitxer JPG que vostè té 103 00:05:59,250 --> 00:06:03,230 creat, així, volem deixar que procés un cop hem arribat al final de 104 00:06:03,230 --> 00:06:06,720 la nostra targeta, ja que no serà més imatges que es troben. 105 00:06:06,720 --> 00:06:10,760 Així que anem a tornar a fread un cop més, t'ho prometo. 106 00:06:10,760 --> 00:06:15,600 fread retorna el nombre d'elements de mida, mida, estaven llests en èxit. 107 00:06:15,600 --> 00:06:19,440 L'ideal és que això serà el es passa pel nombre, no? 108 00:06:19,440 --> 00:06:24,140 Com que vostè està tractant de llegir el nombre d'elements de mida, la mida. 109 00:06:24,140 --> 00:06:29,380 Però si fread no és capaç de llegir que nombre d'elements, llavors tornarà 110 00:06:29,380 --> 00:06:32,530 qualsevol que sigui el nombre que va llegir correctament. 111 00:06:32,530 --> 00:06:36,310 >> Ara bé, una cosa important a tenir en compte és que si s'utilitza un altre arxiu d'E / S 112 00:06:36,310 --> 00:06:43,860 funcionen com fgetc, també tornarà quants articles es llegeix correctament. 113 00:06:43,860 --> 00:06:48,000 El que és útil sobre aquesta funció és que si utilitza les funcions a l'interior d'un 114 00:06:48,000 --> 00:06:53,190 condicions, que va a executar per si mateix mentre la determinació que la condició, que és 115 00:06:53,190 --> 00:06:54,340 només realment útil. 116 00:06:54,340 --> 00:07:00,440 Així que si vostè té aquestes condicions, per exemple, si memòria intermèdia fread, GOS sizeof, 2, 117 00:07:00,440 --> 00:07:04,870 punter, és igual a és igual a 1, que vol dir que m'agradaria llegir 118 00:07:04,870 --> 00:07:06,540 2 gossos a la vegada. 119 00:07:06,540 --> 00:07:13,490 Però si fread retorna 1 en lloc de 2 com era d'esperar, que significa que hi ha 2 120 00:07:13,490 --> 00:07:16,480 gossos deixen en el meu arxiu, però en lloc d'1. 121 00:07:16,480 --> 00:07:22,450 Però si torna 2, llavors encara tinc aquests 2 gossos a l'interior de la meva memòria intermèdia. 122 00:07:22,450 --> 00:07:26,280 >> Així que ara que et dóna una idea de com comprovar el final de l'arxiu, però 123 00:07:26,280 --> 00:07:28,940 anem a passar per ara la lògica. 124 00:07:28,940 --> 00:07:32,460 Com podem realment piece Tots d'aquests elements junts? 125 00:07:32,460 --> 00:07:36,880 Quan vam arribar a la nostra primera JPG, ja sabem que els arxius JPG s'emmagatzemen 126 00:07:36,880 --> 00:07:40,910 contiguament, estarem escrivint fins arribem al final de l'arxiu de targeta. 127 00:07:40,910 --> 00:07:43,950 Però nosaltres no volem escriure res fins llavors. 128 00:07:43,950 --> 00:07:48,710 Així que és important, no només que estem en l'inici d'una nova JPG, però si 129 00:07:48,710 --> 00:07:50,655 que ja hem trobat un arxiu JPG o no. 130 00:07:50,655 --> 00:07:55,390 >> Si avui és el començament d'una nova JPG, anem a vull tancar el nostre fitxer JPG actual si 131 00:07:55,390 --> 00:07:59,110 comptem amb una oberta, i oberta un de nou per a escriure en. 132 00:07:59,110 --> 00:08:03,340 Si no és el començament de la nova JPG, però, seguirem el mateix arxiu JPG 133 00:08:03,340 --> 00:08:05,910 obrir i escriure-hi. 134 00:08:05,910 --> 00:08:10,100 Escriurem el nostre buffer en què sigui Arxiu JPG que tenim oberta, sempre que 135 00:08:10,100 --> 00:08:12,120 en tenim un obert, és clar. 136 00:08:12,120 --> 00:08:16,190 Si no hem trobat la nostra primera JPG però, no escrivim res. 137 00:08:16,190 --> 00:08:20,290 I aquest procés continua fins que arribar al final de l'arxiu de targeta. 138 00:08:20,290 --> 00:08:23,410 >> I, finalment, vostè voldrà assegurar-se assegurar-se que qualsevol fclose 139 00:08:23,410 --> 00:08:25,800 arxius que has fopened. 140 00:08:25,800 --> 00:08:28,360 Una vegada que se sent còmode amb la conceptes, fer una ullada a alguns 141 00:08:28,360 --> 00:08:30,840 pseudocodi, que he inclòs aquí. 142 00:08:30,840 --> 00:08:34,830 En primer lloc, que vol obrir l'arxiu de la targeta, i després repetir el procés següent 143 00:08:34,830 --> 00:08:37,144 fins que hagi assolit la extrem de la targeta. 144 00:08:37,144 --> 00:08:40,880 Vols llegir 512 bytes en un memòria intermèdia. 145 00:08:40,880 --> 00:08:43,934 L'ús d'aquest memòria intermèdia, vostè voldrà comprovar si vostè està en l'inici d'una 146 00:08:43,934 --> 00:08:45,300 nova JPG o no. 147 00:08:45,300 --> 00:08:48,400 I la resposta a aquesta pregunta es afectar la seva gestió d'arxius - 148 00:08:48,400 --> 00:08:51,940 que els arxius que s'obrin, que els que no es tanquen. 149 00:08:51,940 --> 00:08:55,220 >> Llavors, ja ha trobat un JPG? 150 00:08:55,220 --> 00:08:57,740 Com has estat al corrent un registre d'això? 151 00:08:57,740 --> 00:09:01,735 Després, en funció d'això, ja sigui que vostè escriure al JPG actual que 152 00:09:01,735 --> 00:09:07,090 tenir oberta, o no escriure en absolut, perquè no ha trobat un JPG encara. 153 00:09:07,090 --> 00:09:10,870 Finalment, una vegada que hagi arribat al final de l'arxiu, vostè voldrà tancar qualsevol 154 00:09:10,870 --> 00:09:12,590 restants arxius que tingui oberts. 155 00:09:12,590 --> 00:09:14,590 Volem ser ordenat aquí. 156 00:09:14,590 --> 00:09:18,790 >> I amb això, que s'hagi recuperat tots els arxius que falten des d'aquesta memòria 157 00:09:18,790 --> 00:09:21,620 targeta, que és una gesta bastant sorprenent. 158 00:09:21,620 --> 00:09:23,430 Així que doneu un copet a l'esquena. 159 00:09:23,430 --> 00:09:27,560 Però hi ha un element més a la PSET, que és el concurs. 160 00:09:27,560 --> 00:09:30,920 Trobareu que totes les fotos que t'hagis recuperat estigui 161 00:09:30,920 --> 00:09:32,820 fotos del personal del CS50. 162 00:09:32,820 --> 00:09:38,500 Així que si estàs a l'escola o en algun lloc prop, llavors vostè pot fer fotos amb 163 00:09:38,500 --> 00:09:42,600 el personal, i la secció que té el la majoria de les imatges amb els membres del personal 164 00:09:42,600 --> 00:09:46,940 dels seus arxius recuperats es aconseguir un premi impressionant. 165 00:09:46,940 --> 00:09:50,650 Amb això, llavors que hagi acabat la PSET recuperar-se. 166 00:09:50,650 --> 00:09:53,600 El meu nom és Zamyla, i això és CS50. 167 00:09:53,600 --> 00:10:01,835