1 00:00:00,000 --> 00:00:09,780 >> [Música tocando] 2 00:00:09,780 --> 00:00:11,150 >> ZAMYLA CHAN: Imos afrontar recuperar. 3 00:00:11,150 --> 00:00:14,030 Solicitar é probablemente o meu favorito PSET, e, sobre todo, porque eu creo que é 4 00:00:14,030 --> 00:00:15,650 moi, moi legal. 5 00:00:15,650 --> 00:00:19,040 Basicamente, está dado unha memoria arquivo de tarxeta en que 6 00:00:19,040 --> 00:00:20,900 fotos foron eliminados. 7 00:00:20,900 --> 00:00:23,650 Pero o que vai facer é recuperala los todos. 8 00:00:23,650 --> 00:00:24,250 >> Aceptar. 9 00:00:24,250 --> 00:00:28,230 Entón, é realmente emocionante, pero quizais un pouco intimidante, porque é 10 00:00:28,230 --> 00:00:32,430 dado un arquivo e C baleiro ten que enche-lo dentro 11 00:00:32,430 --> 00:00:36,250 OK, entón imos romper ese en partes gerenciáveis. 12 00:00:36,250 --> 00:00:38,160 Vai querer abrir o de ficheiros da tarxeta de memoria. 13 00:00:38,160 --> 00:00:39,900 Isto parece moi sinxelo. 14 00:00:39,900 --> 00:00:43,030 A continuación, localice o inicio dunha imaxe JPG. 15 00:00:43,030 --> 00:00:46,740 Todos os ficheiros deste memoria tarxeta van ser JPGs. 16 00:00:46,740 --> 00:00:50,840 Entón, cando atopar o principio, vai abrir unha nova JPG, que 17 00:00:50,840 --> 00:00:57,610 é, tipo, crear un JPG, e escribir 512 byte de cada vez ata que un novo JPG é 18 00:00:57,610 --> 00:01:02,930 atopado, e rematando o programa, xa que detectar a fin do ficheiro. 19 00:01:02,930 --> 00:01:06,400 >> Entón primeiros pasos primeiro é abrir o arquivo de tarxeta de memoria. 20 00:01:06,400 --> 00:01:09,850 Pero xa sabe diso, e non hai un arquivo de función I / O que vai 21 00:01:09,850 --> 00:01:12,030 ser moi útil. 22 00:01:12,030 --> 00:01:12,820 Aceptar. 23 00:01:12,820 --> 00:01:14,760 Entón, cales son JPGs? 24 00:01:14,760 --> 00:01:16,330 Porque necesitamos comezo. 25 00:01:16,330 --> 00:01:21,310 Ben, JPGs, así como mapas de bits, son só secuencias de bytes. 26 00:01:21,310 --> 00:01:30,660 Afortunadamente, cada JPG comeza cun 0xff, 0xd8, 0xff, 0xE0, unha secuencia 27 00:01:30,660 --> 00:01:33,610 de bytes, ou outro secuencia de bytes. 28 00:01:33,610 --> 00:01:37,250 >> Entón estes catro bytes indican o inicio dun JPG. 29 00:01:37,250 --> 00:01:40,780 Nada máis que estas dúas combinacións de catro bytes. 30 00:01:40,780 --> 00:01:44,840 E por sorte para nós, outro feito que pode aproveitar é que cada 31 00:01:44,840 --> 00:01:48,550 JPG almacénase lado-a-lado na tarxeta de memoria. 32 00:01:48,550 --> 00:01:52,210 Eu representada a estrutura dun tarxeta de memoria esquemática nesta 33 00:01:52,210 --> 00:01:53,310 desprazar aquí. 34 00:01:53,310 --> 00:01:59,270 Aquí, cada praza, cada rectángulo, representa 512 bytes, e comeza 35 00:01:59,270 --> 00:02:01,750 cun gris na que non realmente ten un JPG. 36 00:02:01,750 --> 00:02:05,700 >> Pero, entón, finalmente, acadar un bloque cunha estrela. 37 00:02:05,700 --> 00:02:10,940 Isto significa que os primeiros catro bytes fóra dos 512 é un destes dous 38 00:02:10,940 --> 00:02:13,230 iniciar secuencias dun JPG. 39 00:02:13,230 --> 00:02:17,340 E imos a partir de aí, a continuación, unha vez un JPG remata, o seguinte comeza. 40 00:02:17,340 --> 00:02:20,990 Non é preciso nin máis espazo gris no medio. 41 00:02:20,990 --> 00:02:25,550 >> Pero como é que imos realmente ler isto, e ler os 512 bytes, para que poidamos facer 42 00:02:25,550 --> 00:02:27,500 a comparación do primeiro lugar? 43 00:02:27,500 --> 00:02:33,470 Ben, imos voltar a fread, que leva na estrutura que conterá 44 00:02:33,470 --> 00:02:34,470 os bytes que estás lendo. 45 00:02:34,470 --> 00:02:36,570 Entón está indo a poñer aqueles en que - 46 00:02:36,570 --> 00:02:42,192 o tamaño, o número e logo inpointer que estás lendo a partir. 47 00:02:42,192 --> 00:02:49,900 Agora, queremos ler 512 de cada vez, e queremos almacenar iso nun buffer, 48 00:02:49,900 --> 00:02:50,700 Vou chamalo. 49 00:02:50,700 --> 00:02:54,100 >> Basicamente, nós estamos indo a soster para esas 512 bytes e facer 50 00:02:54,100 --> 00:02:55,500 cousas con el, non? 51 00:02:55,500 --> 00:02:58,260 Ou nós imos comparar a primeira catro bytes, ou nós imos 52 00:02:58,260 --> 00:02:59,830 ler-lo, OK? 53 00:02:59,830 --> 00:03:05,050 Entón o punteiro de datos será entón servir como o seu buffer, ea 54 00:03:05,050 --> 00:03:07,745 inpointer, ben, iso só vai para ser a súa tarxeta de memoria. 55 00:03:07,745 --> 00:03:09,500 >> De volta ao noso esquema de tarxeta de memoria. 56 00:03:09,500 --> 00:03:14,690 Imos ler 512 bytes de cada vez, almacenando cada bloque de 512 bytes 57 00:03:14,690 --> 00:03:19,190 nun buffer, agarrando-se os tapón, esas 512 bytes, ata que saibamos 58 00:03:19,190 --> 00:03:22,000 exactamente o que facer deles. 59 00:03:22,000 --> 00:03:25,960 Así, o principio non é nada, entón imos ler o buffer, comparalos-lo, e 60 00:03:25,960 --> 00:03:28,160 nós non precisamos facer nada con el. 61 00:03:28,160 --> 00:03:32,030 E entón, finalmente acadar unha estrela bloquear, o que significa que temos 62 00:03:32,030 --> 00:03:33,630 atopamos o noso primeiro JPG. 63 00:03:33,630 --> 00:03:36,560 Entón, o buffer agora deteñen bytes que JPG. 64 00:03:36,560 --> 00:03:40,220 >> A próxima vez que 512 bytes, porque son non un bloque de estrela, son tamén 65 00:03:40,220 --> 00:03:41,740 parte dese JPG. 66 00:03:41,740 --> 00:03:47,630 E JPGs son continuas a partir de aí en diante, ata chegar a seguinte JPG. 67 00:03:47,630 --> 00:03:51,880 E entón o buffer entón seguro 512 bytes para que JPG e 68 00:03:51,880 --> 00:03:53,580 así por diante, e así por diante. 69 00:03:53,580 --> 00:03:54,250 Aceptar. 70 00:03:54,250 --> 00:03:58,980 >> Entón, cando acadar a primeira estrela bloque, o primeiro JPG, como 71 00:03:58,980 --> 00:04:01,910 en realidade, ben, abrilo? 72 00:04:01,910 --> 00:04:04,990 Imos facer un novo JPG. 73 00:04:04,990 --> 00:04:08,846 Os nomes de arquivos para un JPG van ter o formato, o número, o número, 74 00:04:08,846 --> 00:04:13,830 number.jpg, na medida en que está nomeado en a orde na que se atopan, 75 00:04:13,830 --> 00:04:14,780 comezando en 0. 76 00:04:14,780 --> 00:04:19,890 >> Así, o primeiro JPG que atopar será 000.jpg. 77 00:04:19,890 --> 00:04:26,560 Entón, ser unha boa idea para manter un rexistro de cantas JPGs que atopou ata agora. 78 00:04:26,560 --> 00:04:27,610 Entón ese é o nome do ficheiro. 79 00:04:27,610 --> 00:04:29,660 Pero como o que realmente facelo? 80 00:04:29,660 --> 00:04:34,310 Ben, nós estamos indo a usar un función chamada sprintf. 81 00:04:34,310 --> 00:04:38,260 Un pouco semellante ao printf, onde pode utilizar espazos reservados para cordas, 82 00:04:38,260 --> 00:04:42,420 só que neste caso, sprintf imprimirá o ficheiro para fóra no actual 83 00:04:42,420 --> 00:04:45,550 directorio, non no terminal. 84 00:04:45,550 --> 00:04:46,120 >> Aceptar. 85 00:04:46,120 --> 00:04:49,950 Entón, imos ver que temos o título, unha matriz de char que ha almacenar o 86 00:04:49,950 --> 00:04:55,120 cadea resultante, e pasamos no Título da secuencia real cunha 87 00:04:55,120 --> 00:04:58,720 espazo reservado, así como nós aprendín a facer printf. 88 00:04:58,720 --> 00:05:05,530 Pero este código que eu teño aquí dará 2.jpg, non 002.jpg. 89 00:05:05,530 --> 00:05:09,920 Entón, eu vou deixar para descubrir como modificar o espazo reservado para a 90 00:05:09,920 --> 00:05:11,920 nome correcto. 91 00:05:11,920 --> 00:05:12,610 >> Aceptar. 92 00:05:12,610 --> 00:05:17,390 Entón, unha vez que sprintf'd entón pode abrir este ficheiro porque existe en 93 00:05:17,390 --> 00:05:22,690 seu directorio, con fopen, usando o título e calquera que sexa o xeito que quere 94 00:05:22,690 --> 00:05:25,140 para abrir este ficheiro dentro 95 00:05:25,140 --> 00:05:30,260 Polo tanto, agora que abrimos un novo arquivo JPG, agora podemos escribir 512 bytes nun 96 00:05:30,260 --> 00:05:33,320 tempo, ata que un novo JPG se atopa. 97 00:05:33,320 --> 00:05:36,640 Entón, imos ter outro ollar na sintaxe de fwrite. 98 00:05:36,640 --> 00:05:40,060 >> Sei que estou mostrando esta foto un moito, pero eu só quero estar seguro de que 99 00:05:40,060 --> 00:05:43,530 Vós non ser moi confuso, porque Sei que é moi doado de 100 00:05:43,530 --> 00:05:47,000 mesturar-se a primeira e última argumento, en particular. 101 00:05:47,000 --> 00:05:54,390 Pero lembre que está escribindo a partir de seu buffer nas imaxes de arquivo para fóra. 102 00:05:54,390 --> 00:05:59,250 >> Agora que sabe como a gravación de 512 bytes no seu arquivo JPG que ten 103 00:05:59,250 --> 00:06:03,230 creado, así, queremos parar con iso proceso unha vez que teñamos chegado ao final da 104 00:06:03,230 --> 00:06:06,720 a tarxeta, xa que non haberá máis imaxes para ser atopado. 105 00:06:06,720 --> 00:06:10,760 Entón imos voltar fread unha vez máis, eu prometer. 106 00:06:10,760 --> 00:06:15,600 fread retorna cantos elementos de tamaño, tamaño, estaban preparados en éxito. 107 00:06:15,600 --> 00:06:19,440 O ideal é que isto vai ser o que pasar por número, non? 108 00:06:19,440 --> 00:06:24,140 Porque estás lendo o número de elementos de tamaño, o tamaño. 109 00:06:24,140 --> 00:06:29,380 Pero se fread non é capaz de ler que número de elementos, entón el vai volver 110 00:06:29,380 --> 00:06:32,530 calquera número que ler correctamente. 111 00:06:32,530 --> 00:06:36,310 >> Agora, unha cousa importante a destacar é que se usa outro ficheiro E / 112 00:06:36,310 --> 00:06:43,860 función como fgetc, el tamén vai volver cantos elementos que ler correctamente. 113 00:06:43,860 --> 00:06:48,000 Qué é útil sobre esta función é que se utilizar as funcións dentro dunha 114 00:06:48,000 --> 00:06:53,190 condición, que vai realizar-se mentres determinar esa condición, o que é 115 00:06:53,190 --> 00:06:54,340 realmente moi útil. 116 00:06:54,340 --> 00:07:00,440 Entón se ten esta condición, por exemplo, se tapón fread, Can sizeof, 2, 117 00:07:00,440 --> 00:07:04,870 punteiro, coincide é igual a 1, é dicir quere dicir que me gustaría ler 118 00:07:04,870 --> 00:07:06,540 2 cans no momento. 119 00:07:06,540 --> 00:07:13,490 Pero se fread retorna unha vez máis de dúas como espera, o que significa que hai dous 120 00:07:13,490 --> 00:07:16,480 cans deixados no meu arquivo, senón 1. 121 00:07:16,480 --> 00:07:22,450 Pero se el retorna 2, entón eu teño estes dous cans dentro do meu tapón. 122 00:07:22,450 --> 00:07:26,280 >> Polo tanto, agora que lle dá unha sensación de como comprobar a fin do ficheiro, pero 123 00:07:26,280 --> 00:07:28,940 imos pasar por agora a lóxica. 124 00:07:28,940 --> 00:07:32,460 Como é que imos realmente remendos todo eses elementos xuntos? 125 00:07:32,460 --> 00:07:36,880 Xa que se loita o noso primeiro JPG, sempre sabemos que JPGs almacénanse 126 00:07:36,880 --> 00:07:40,910 contigua, estaremos escribindo ata chegamos ao final do arquivo da tarxeta. 127 00:07:40,910 --> 00:07:43,950 Pero non quero escribir nada ata entón. 128 00:07:43,950 --> 00:07:48,710 Entón, é importante, non só que estamos na o inicio dun novo JPG, pero se 129 00:07:48,710 --> 00:07:50,655 xa atopamos un JPG ou non. 130 00:07:50,655 --> 00:07:55,390 >> Se é o inicio dunha nova JPG, nós imos quere pechar nosa actual arquivo JPG se 131 00:07:55,390 --> 00:07:59,110 temos un aberto e aberto un novo para escribir en. 132 00:07:59,110 --> 00:08:03,340 Se non é o inicio do novo JPG, con todo, imos manter o mesmo ficheiro JPG 133 00:08:03,340 --> 00:08:05,910 abrir e escribir para iso. 134 00:08:05,910 --> 00:08:10,100 Imos escribir a nosa reserva para calquera Arquivo JPG temos aberto, sempre que 135 00:08:10,100 --> 00:08:12,120 temos unha aberta, por suposto. 136 00:08:12,120 --> 00:08:16,190 Se nós non atopamos noso primeiro JPG aínda, non escriba nada. 137 00:08:16,190 --> 00:08:20,290 E este proceso continúa ata que acadar o fin do ficheiro da tarxeta. 138 00:08:20,290 --> 00:08:23,410 >> E, finalmente, vai querer facer Asegúrese de que fclose calquera 139 00:08:23,410 --> 00:08:25,800 ficheiros que fopened. 140 00:08:25,800 --> 00:08:28,360 Unha vez que está cómodo co conceptos, bótalle un ollo a algunhas 141 00:08:28,360 --> 00:08:30,840 pseudocódigo, que eu inclui aquí. 142 00:08:30,840 --> 00:08:34,830 En primeiro lugar, quere abrir o arquivo de tarxeta, e logo repita o proceso a seguir 143 00:08:34,830 --> 00:08:37,144 ata que teña alcanzado o extremo da tarxeta. 144 00:08:37,144 --> 00:08:40,880 Quere ler 512 bytes nun tapón. 145 00:08:40,880 --> 00:08:43,934 Usando este buffer, vai querer comprobar se está no inicio dun 146 00:08:43,934 --> 00:08:45,300 novo JPG ou non. 147 00:08:45,300 --> 00:08:48,400 E a resposta a esta pregunta vai afectar o seu manexo de arquivos - 148 00:08:48,400 --> 00:08:51,940 que arquivos ten aberto, o que aqueles que pechar. 149 00:08:51,940 --> 00:08:55,220 >> Logo xa atopou un JPG? 150 00:08:55,220 --> 00:08:57,740 Como foi manter o control de que? 151 00:08:57,740 --> 00:09:01,735 Entón, dependendo do que, quere escribir ao JPG actual que 152 00:09:01,735 --> 00:09:07,090 abrir, ou non gravala-lo en todo, porque aínda non atopou un JPG aínda. 153 00:09:07,090 --> 00:09:10,870 Finalmente, unha vez que chegou ao fin da o arquivo, vai querer pechar calquera 154 00:09:10,870 --> 00:09:12,590 remanescente arquivos que teña aberto. 155 00:09:12,590 --> 00:09:14,590 Queremos ser ordenado aquí. 156 00:09:14,590 --> 00:09:18,790 >> E con iso, xa recuperou todo os ficheiros ausentes de que a memoria 157 00:09:18,790 --> 00:09:21,620 tarxeta, o que é un feito incrible. 158 00:09:21,620 --> 00:09:23,430 Entón, palmadiñas nas costas. 159 00:09:23,430 --> 00:09:27,560 Pero hai máis dun elemento para o PSET, que é a competición. 160 00:09:27,560 --> 00:09:30,920 Verá que todas as imaxes que teña recuperado son realmente 161 00:09:30,920 --> 00:09:32,820 fotos de funcionarios do CS50. 162 00:09:32,820 --> 00:09:38,500 Entón, se está no campus ou nalgún lugar próximo, entón podes facer fotos con 163 00:09:38,500 --> 00:09:42,600 o persoal, ea sección que ten o a maioría das fotos cos membros do equipo 164 00:09:42,600 --> 00:09:46,940 a partir dos seus arquivos recuperados serán recibir un premio incrible. 165 00:09:46,940 --> 00:09:50,650 Con iso, despois de que rematou o PSET recuperar. 166 00:09:50,650 --> 00:09:53,600 O meu nome é Zamyla, e este é CS50. 167 00:09:53,600 --> 00:10:01,835