[Música tocando] ZAMYLA CHAN: Imos afrontar recuperar. Solicitar é probablemente o meu favorito PSET, e, sobre todo, porque eu creo que é moi, moi legal. Basicamente, está dado unha memoria arquivo de tarxeta en que fotos foron eliminados. Pero o que vai facer é recuperala los todos. Aceptar. Entón, é realmente emocionante, pero quizais un pouco intimidante, porque é dado un arquivo e C baleiro ten que enche-lo dentro OK, entón imos romper ese en partes gerenciáveis. Vai querer abrir o de ficheiros da tarxeta de memoria. Isto parece moi sinxelo. A continuación, localice o inicio dunha imaxe JPG. Todos os ficheiros deste memoria tarxeta van ser JPGs. Entón, cando atopar o principio, vai abrir unha nova JPG, que é, tipo, crear un JPG, e escribir 512 byte de cada vez ata que un novo JPG é atopado, e rematando o programa, xa que detectar a fin do ficheiro. Entón primeiros pasos primeiro é abrir o arquivo de tarxeta de memoria. Pero xa sabe diso, e non hai un arquivo de función I / O que vai ser moi útil. Aceptar. Entón, cales son JPGs? Porque necesitamos comezo. Ben, JPGs, así como mapas de bits, son só secuencias de bytes. Afortunadamente, cada JPG comeza cun 0xff, 0xd8, 0xff, 0xE0, unha secuencia de bytes, ou outro secuencia de bytes. Entón estes catro bytes indican o inicio dun JPG. Nada máis que estas dúas combinacións de catro bytes. E por sorte para nós, outro feito que pode aproveitar é que cada JPG almacénase lado-a-lado na tarxeta de memoria. Eu representada a estrutura dun tarxeta de memoria esquemática nesta desprazar aquí. Aquí, cada praza, cada rectángulo, representa 512 bytes, e comeza cun gris na que non realmente ten un JPG. Pero, entón, finalmente, acadar un bloque cunha estrela. Isto significa que os primeiros catro bytes fóra dos 512 é un destes dous iniciar secuencias dun JPG. E imos a partir de aí, a continuación, unha vez un JPG remata, o seguinte comeza. Non é preciso nin máis espazo gris no medio. Pero como é que imos realmente ler isto, e ler os 512 bytes, para que poidamos facer a comparación do primeiro lugar? Ben, imos voltar a fread, que leva na estrutura que conterá os bytes que estás lendo. Entón está indo a poñer aqueles en que - o tamaño, o número e logo inpointer que estás lendo a partir. Agora, queremos ler 512 de cada vez, e queremos almacenar iso nun buffer, Vou chamalo. Basicamente, nós estamos indo a soster para esas 512 bytes e facer cousas con el, non? Ou nós imos comparar a primeira catro bytes, ou nós imos ler-lo, OK? Entón o punteiro de datos será entón servir como o seu buffer, ea inpointer, ben, iso só vai para ser a súa tarxeta de memoria. De volta ao noso esquema de tarxeta de memoria. Imos ler 512 bytes de cada vez, almacenando cada bloque de 512 bytes nun buffer, agarrando-se os tapón, esas 512 bytes, ata que saibamos exactamente o que facer deles. Así, o principio non é nada, entón imos ler o buffer, comparalos-lo, e nós non precisamos facer nada con el. E entón, finalmente acadar unha estrela bloquear, o que significa que temos atopamos o noso primeiro JPG. Entón, o buffer agora deteñen bytes que JPG. A próxima vez que 512 bytes, porque son non un bloque de estrela, son tamén parte dese JPG. E JPGs son continuas a partir de aí en diante, ata chegar a seguinte JPG. E entón o buffer entón seguro 512 bytes para que JPG e así por diante, e así por diante. Aceptar. Entón, cando acadar a primeira estrela bloque, o primeiro JPG, como en realidade, ben, abrilo? Imos facer un novo JPG. Os nomes de arquivos para un JPG van ter o formato, o número, o número, number.jpg, na medida en que está nomeado en a orde na que se atopan, comezando en 0. Así, o primeiro JPG que atopar será 000.jpg. Entón, ser unha boa idea para manter un rexistro de cantas JPGs que atopou ata agora. Entón ese é o nome do ficheiro. Pero como o que realmente facelo? Ben, nós estamos indo a usar un función chamada sprintf. Un pouco semellante ao printf, onde pode utilizar espazos reservados para cordas, só que neste caso, sprintf imprimirá o ficheiro para fóra no actual directorio, non no terminal. Aceptar. Entón, imos ver que temos o título, unha matriz de char que ha almacenar o cadea resultante, e pasamos no Título da secuencia real cunha espazo reservado, así como nós aprendín a facer printf. Pero este código que eu teño aquí dará 2.jpg, non 002.jpg. Entón, eu vou deixar para descubrir como modificar o espazo reservado para a nome correcto. Aceptar. Entón, unha vez que sprintf'd entón pode abrir este ficheiro porque existe en seu directorio, con fopen, usando o título e calquera que sexa o xeito que quere para abrir este ficheiro dentro Polo tanto, agora que abrimos un novo arquivo JPG, agora podemos escribir 512 bytes nun tempo, ata que un novo JPG se atopa. Entón, imos ter outro ollar na sintaxe de fwrite. Sei que estou mostrando esta foto un moito, pero eu só quero estar seguro de que Vós non ser moi confuso, porque Sei que é moi doado de mesturar-se a primeira e última argumento, en particular. Pero lembre que está escribindo a partir de seu buffer nas imaxes de arquivo para fóra. Agora que sabe como a gravación de 512 bytes no seu arquivo JPG que ten creado, así, queremos parar con iso proceso unha vez que teñamos chegado ao final da a tarxeta, xa que non haberá máis imaxes para ser atopado. Entón imos voltar fread unha vez máis, eu prometer. fread retorna cantos elementos de tamaño, tamaño, estaban preparados en éxito. O ideal é que isto vai ser o que pasar por número, non? Porque estás lendo o número de elementos de tamaño, o tamaño. Pero se fread non é capaz de ler que número de elementos, entón el vai volver calquera número que ler correctamente. Agora, unha cousa importante a destacar é que se usa outro ficheiro E / función como fgetc, el tamén vai volver cantos elementos que ler correctamente. Qué é útil sobre esta función é que se utilizar as funcións dentro dunha condición, que vai realizar-se mentres determinar esa condición, o que é realmente moi útil. Entón se ten esta condición, por exemplo, se tapón fread, Can sizeof, 2, punteiro, coincide é igual a 1, é dicir quere dicir que me gustaría ler 2 cans no momento. Pero se fread retorna unha vez máis de dúas como espera, o que significa que hai dous cans deixados no meu arquivo, senón 1. Pero se el retorna 2, entón eu teño estes dous cans dentro do meu tapón. Polo tanto, agora que lle dá unha sensación de como comprobar a fin do ficheiro, pero imos pasar por agora a lóxica. Como é que imos realmente remendos todo eses elementos xuntos? Xa que se loita o noso primeiro JPG, sempre sabemos que JPGs almacénanse contigua, estaremos escribindo ata chegamos ao final do arquivo da tarxeta. Pero non quero escribir nada ata entón. Entón, é importante, non só que estamos na o inicio dun novo JPG, pero se xa atopamos un JPG ou non. Se é o inicio dunha nova JPG, nós imos quere pechar nosa actual arquivo JPG se temos un aberto e aberto un novo para escribir en. Se non é o inicio do novo JPG, con todo, imos manter o mesmo ficheiro JPG abrir e escribir para iso. Imos escribir a nosa reserva para calquera Arquivo JPG temos aberto, sempre que temos unha aberta, por suposto. Se nós non atopamos noso primeiro JPG aínda, non escriba nada. E este proceso continúa ata que acadar o fin do ficheiro da tarxeta. E, finalmente, vai querer facer Asegúrese de que fclose calquera ficheiros que fopened. Unha vez que está cómodo co conceptos, bótalle un ollo a algunhas pseudocódigo, que eu inclui aquí. En primeiro lugar, quere abrir o arquivo de tarxeta, e logo repita o proceso a seguir ata que teña alcanzado o extremo da tarxeta. Quere ler 512 bytes nun tapón. Usando este buffer, vai querer comprobar se está no inicio dun novo JPG ou non. E a resposta a esta pregunta vai afectar o seu manexo de arquivos - que arquivos ten aberto, o que aqueles que pechar. Logo xa atopou un JPG? Como foi manter o control de que? Entón, dependendo do que, quere escribir ao JPG actual que abrir, ou non gravala-lo en todo, porque aínda non atopou un JPG aínda. Finalmente, unha vez que chegou ao fin da o arquivo, vai querer pechar calquera remanescente arquivos que teña aberto. Queremos ser ordenado aquí. E con iso, xa recuperou todo os ficheiros ausentes de que a memoria tarxeta, o que é un feito incrible. Entón, palmadiñas nas costas. Pero hai máis dun elemento para o PSET, que é a competición. Verá que todas as imaxes que teña recuperado son realmente fotos de funcionarios do CS50. Entón, se está no campus ou nalgún lugar próximo, entón podes facer fotos con o persoal, ea sección que ten o a maioría das fotos cos membros do equipo a partir dos seus arquivos recuperados serán recibir un premio incrible. Con iso, despois de que rematou o PSET recuperar. O meu nome é Zamyla, e este é CS50.