[REPRODUCCIÓN DE MÚSICA] ZAMYLA CHAN: Vamos a tratar de recuperarse. Recover es probablemente mi favorita PSET, y sobre todo porque creo que es muy, muy cool. Básicamente, te dan una memoria archivos de la tarjeta en la que se han eliminado las imágenes. Pero, ¿qué vas a hacer es recuperar todos ellos. Aceptar. Así que es realmente emocionante, pero tal vez un poco intimidante, porque eres dado un archivo C vacía y usted tiene que llenar pulg OK, así que vamos a romper este en partes manejables. Usted querrá abrir el archivo de la tarjeta de memoria. Esto parece bastante simple. A continuación, busque el principio de una imagen JPG. Todos los archivos de esta memoria tarjetas van a ser archivos JPG. Luego, una vez que encuentre el principio, usted va a abrir una nueva JPG, que está, como, crear un archivo JPG, y escribir 512 byte a la vez hasta que un nuevo JPG es encontrado, y que termina el programa, una vez detecta el final del archivo. Así que los primeros pasos primero es abrir el archivo de la tarjeta de memoria. Pero usted ya sabe esto, y no hay una función de E / S de archivo que va a resultar muy útil. Aceptar. ¿Cuáles son archivos JPG? Porque necesitamos un principio. Bueno, archivos JPG, al igual que los mapas de bits, son sólo las secuencias de bytes. Por suerte, cada JPG comienza con cualquiera 0xff, 0xd8, 0xff, 0xe0, una secuencia de bytes, o otra secuencia de bytes. Así que los cuatro bytes indican el inicio de un archivo JPG. Nada menos que esas dos combinaciones de cuatro bytes. Y por suerte para nosotros, otro hecho que nos pueden aprovechar es que cada JPG se almacena de lado a lado en la tarjeta de memoria. He representado a la estructura de un tarjeta de memoria esquemáticamente en esta deslice aquí. Aquí, cada plaza, cada rectángulo, representa 512 bytes, y se inicia con un color gris en el que nosotros no realmente tienen un JPG. Pero entonces nos golpeamos un bloque con una estrella. Esto significa que los primeros cuatro bytes fuera de los que 512 son uno de los dos a partir de secuencias de un archivo JPG. Y vamos a partir de allí, y luego una vez uno JPG termina, comienza el siguiente. Nosotros no siempre tenemos más espacio gris en el medio. Pero ¿cómo podemos leer esto, y leer los 512 bytes de modo que podamos hacer la comparación el primer lugar? Bueno, volvamos a fread, que toma en la estructura que contendrá los bytes que usted está leyendo. Así que vas a poner los de allí - el tamaño, el número y, a continuación, inpointer que usted está leyendo. Ahora, queremos leer 512 a la vez, y queremos guardar esto en un buffer, Voy a llamarlo. Básicamente, vamos a celebrar en esos 512 bytes y hacer cosas con ella, ¿verdad? O bien vamos a comparar la primera cuatro bytes, o vamos a leerlo en, OK? Con esto, el puntero de datos será entonces servirá como buffer, y la inpointer, bueno, eso sólo va para ser su tarjeta de memoria. De vuelta a nuestro esquema de tarjeta de memoria. Vamos a leer 512 bytes a la vez, almacenamiento de cada bloque de 512 bytes en un búfer, la celebración en los amortiguar, los 512 bytes, hasta que sepamos exactamente qué hacer ellos. Así que al principio no es nada, así vamos a leer el buffer, comparamos, y no vamos a tener que hacer algo con ella. Y entonces, por fin golpeamos una estrella bloque, lo que significa que hemos encontrado nuestra primera JPG. Así el tampón ahora tienen bytes de esa JPG. La próxima vez que 512 bytes, porque son no es un bloque de la estrella, son también parte de ese JPG. Y los archivos JPG son continuas desde allí en adelante, hasta que llegamos a la siguiente JPG. Y a continuación, el tampón mantiene entonces 512 bytes para que JPG, y así sucesivamente, y así sucesivamente. Aceptar. Así que una vez que se pulsa el primero estrellado bloque, la primera JPG, ¿cómo en realidad, bueno, abrirlo? Vamos a hacer un nuevo JPG. Los nombres de archivo para un archivo JPG van a estar en el formato, número, número, number.jpg, en que están nombrados en el orden en el que se encuentran, a partir de 0. Así que lo primero que usted JPG encontrar serán 000.jpg. Por lo tanto, probablemente es una buena idea para llevar un registro de cuántos archivos JPG has encontrado hasta ahora. Así que ese es el nombre del archivo. Pero, ¿cómo realmente hacer eso? Bueno, vamos a utilizar una función sprintf llama. Un poco similar a printf, donde puede utilizar marcadores de posición para las cadenas, excepto en este caso, sprintf imprimirá el archivo de salida en la corriente directorio, no en el terminal. Aceptar. Así que aquí vemos que tenemos el título, una matriz de caracteres que almacenará la cadena resultante, y que pasamos en el Título de la cadena real con un marcador de posición, al igual que hemos aprendido a ver con printf. Pero el código que tengo aquí dará 2.jpg, no 002.jpg. Así que voy a dejar a usted para averiguar cómo modificar el marcador de posición para que el nombre correcto. Aceptar. Así que una vez que has sprintf'd entonces se puede abrir ese archivo, porque existe en su directorio, con fopen, utilizando la título, y luego lo que sea el modo que desea para abrir ese archivo pulg Así que ahora que hemos abierto un nuevo archivo JPG, Ahora podemos escribir 512 bytes en una tiempo, hasta que se encuentre un nuevo JPG. Así que vamos a echar otro vistazo en la sintaxis de fwrite. Sé que estoy mostrando esta diapositiva una mucho, pero yo sólo quiero asegurarme de que ustedes no se ponen demasiado confuso, porque Sé que es muy fácil de mezclar la primera y la última argumento, en particular. Pero recuerde que usted está escribiendo desde el búfer en las imágenes de archivo de salida. Ahora que ya sabe como el de escritura 512 bytes en el archivo JPG que usted tiene creado, así, queremos dejar que proceso una vez que hemos llegado al final de nuestra tarjeta, ya que no será más imágenes que se encuentran. Así que vamos a volver a fread una vez más, te lo prometo. fread devuelve el número de elementos de tamaño, tamaño, estaban listos en éxito. Lo ideal es que esto va a ser lo se pasa por el número, ¿no? Debido a que usted está tratando de leer el número de elementos de tamaño, el tamaño. Pero si fread no es capaz de leer que número de elementos, entonces va a volver cualquiera que sea el número que leyó correctamente. Ahora bien, una cosa importante a tener en cuenta es que si se utiliza otro archivo de E / S funcionan como fgetc, también regresará cuántos artículos se lee correctamente. Lo que es útil sobre esta función es que si utiliza las funciones en el interior de un condiciones, que va a ejecutar por si mismo mientras la determinación de que la condición, que es sólo realmente útil. Así que si usted tiene estas condiciones, por ejemplo, si búfer fread, PERRO sizeof, 2, puntero, es igual a es igual a 1, que significa que me gustaría leer 2 perros a la vez. Pero si fread devuelve 1 en lugar de 2 como era de esperar, que significa que hay 2 perros dejan en mi archivo, pero en lugar de 1. Pero si devuelve 2, entonces todavía tengo esos 2 perros en el interior de mi memoria intermedia. Así que ahora que te da una idea de cómo comprobar el final del archivo, pero vamos a pasar por ahora la lógica. ¿Cómo podemos realmente piece Todos de estos elementos juntos? Una vez que llegamos a nuestra primera JPG, ya sabemos que los archivos JPG se almacenan contiguamente, vamos a estar escribiendo hasta llegamos al final del archivo de tarjeta. Pero nosotros no queremos escribir nada hasta entonces. Así que es importante, no sólo que estamos en el inicio de una nueva JPG, pero si que ya hemos encontrado un archivo JPG o no. Si hoy es el comienzo de una nueva JPG, vamos a quiero cerrar nuestro fichero JPG actual si contamos con una abierta, y abierta uno nuevo para escribir en. Si no es el comienzo de la nueva JPG, sin embargo, vamos a seguir el mismo archivo JPG abrir y escribir en él. Escribiremos nuestro buffer en el que sea Archivo JPG que tenemos abierta, siempre que tenemos uno abierto, por supuesto. Si no hemos encontrado nuestra primera JPG sin embargo, no escribimos nada. Y este proceso continúa hasta que llegar al final del archivo de tarjeta. Y, por último, usted querrá asegurarse de asegurarse de que cualquier fclose archivos que has fopened. Una vez que usted se siente cómodo con la conceptos, echar un vistazo a algunos pseudocódigo, que he incluido aquí. En primer lugar, que desea abrir el archivo de la tarjeta, y luego repetir el proceso siguiente hasta que haya alcanzado la extremo de la tarjeta. ¿Quieres leer 512 bytes en un búfer. El uso de ese búfer, usted querrá comprobar si usted está en el inicio de una nueva JPG o no. Y la respuesta a esa pregunta se afectar su gestión de archivos - que los archivos que se abran, que los que no se cierran. Entonces, ¿ya ha encontrado un JPG? ¿Cómo has estado al tanto un registro de eso? Luego, en función de eso, ya sea que usted escribir en el JPG actual que tener abierta, o no escribir en absoluto, porque no ha encontrado un JPG todavía. Por último, una vez que haya llegado al final de el archivo, usted querrá cerrar cualquier restantes archivos que tenga abiertos. Queremos ser ordenado aquí. Y con eso, que se haya recuperado todos los archivos que faltan desde esa memoria tarjeta, que es una hazaña bastante sorprendente. Así que dése una palmadita en la espalda. Pero hay un elemento más a la PSET, que es el concurso. Usted encontrará que todas las fotos que te hayas recuperado esté fotos del personal del CS50. Así que si estás en la escuela o en algún lugar cerca, entonces usted puede tomar fotos con el personal, y la sección que tiene el la mayoría de las imágenes con los miembros del personal de sus archivos recuperados se conseguir un premio impresionante. Con eso, entonces que haya terminado la PSET recuperarse. Mi nombre es Zamyla, y esto es CS50.